用LM方法的matlab求解,matlab中LM算法「建议收藏」

用LM方法的matlab求解,matlab中LM算法「建议收藏」symsabyxreal;f=a*exp(-b*x);Jsym=jacobian(f,[ab]);%拟合用数据。参见《数学试验》,p190,例2data_1=[0.250.511.523468];obs_1=[19.2118.1515.3614.1012.899.327.455.243.01];%2.LM算法%初始猜测sa0=10;b0=0.5…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

syms a b y x real;

f=a*exp(-b*x);

Jsym=jacobian(f,[a b]);

% 拟合用数据。参见《数学试验》,p190,例2

data_1=[0.25 0.5 1 1.5 2 3 4 6 8];

obs_1=[19.21 18.15 15.36 14.10 12.89 9.32 7.45 5.24 3.01];

% 2. LM算法

% 初始猜测s

a0=10; b0=0.5;

y_init = a0*exp(-b0*data_1);

% 数据个数

Ndata=length(obs_1);

% 参数维数

Nparams=2;

% 迭代最大次数

n_iters=50;

% LM算法的阻尼系数初值

lamda=0.01;

% step1: 变量赋值

updateJ=1;

a_est=a0;

b_est=b0;

% step2: 迭代

for it=1:n_iters dg

if updateJ==1

% 根据当前估计值,计算雅克比矩阵

J=zeros(Ndata,Nparams);

for i=1:length(data_1)

J(i,:)=[exp(-b_est*data_1(i)) -a_est*data_1(i)*exp(-b_est*data_1(i))];%

end

% 根据当前参数,得到函数值

y_est = a_est*exp(-b_est*data_1);

% 计算误差

d=obs_1-y_est;

% 计算(拟)海塞矩阵

H=J’*J;

% 若是第一次迭代,计算误差

if it==1

e=dot(d,d);

end

end

% 根据阻尼系数lamda混合得到H矩阵

H_lm=H+(lamda*eye(Nparams,Nparams));

% 计算步长dp,并根据步长计算新的可能的\参数估计值

dp=inv(H_lm)*(J’*d(:));

g = J’*d(:);

a_lm=a_est+dp(1);

b_lm=b_est+dp(2);

% 计算新的可能估计值对应的y和计算残差e

y_est_lm = a_lm*exp(-b_lm*data_1);

d_lm=obs_1-y_est_lm;

e_lm=dot(d_lm,d_lm);

% 根据误差,决定如何更新参数和阻尼系数

if e_lm

lamda=lamda/10;

a_est=a_lm;

b_est=b_lm;

e=e_lm;

disp(e);

updateJ=1;

else

updateJ=0;

lamda=lamda*10;

end

end

%显示优化的结果

a_est

b_est

这是LM算法的例子,我想问一下其中updateJ是什么作用?求讲解一下~~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187236.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 将JSON数组转化为List集合[通俗易懂]

    将JSON数组转化为List集合[通俗易懂]假如我们向redis中存放了一个JSON数组,从中获取的时候需要将JSON数组转化为List集合,然后将List对象返回给前端。1.引入hutool和fastjson依赖<!–hutool–><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId&gt

    2022年6月29日
    131
  • C++中decltype与左值和右值「建议收藏」

    1decltype关键字decltype是C++11中引入的新的类型说明符。编译器根据分析表达式或者函数返回值来分析其类型。decltype的详细用法,请参考《C++中decltype的使用方法》2decltype与左值和右值decltype后面跟的表达式是左值或者右值时,编译器分析的类型会有所不同。如果表达式(非单个变量)的求值结果是左值,则编译器会得到一个引用类型;如果表达式(非单个变量)的求值结果是右值,则编译器会得到一个与表达式相同的类型。intarr[2]={10,2.

    2022年4月8日
    86
  • 测试这个东西好不啦

    测试这个东西好不啦欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗Ctrl+B斜体Ctrl+I引用Ctrl

    2025年6月17日
    4
  • java json 根据 key排序[通俗易懂]

    java json 根据 key排序[通俗易懂]阿里的JsonObject内部是用Hashmap来存储的,所以输出是按key的排序来的,如果要让JsonObject按固定顺序(put的顺序)排列,可以修改JsonObject的定义HashMap改为LinkedHashMap。publicJSONObject(){this.map=newLinkedHashMap();//newHashMap();…

    2025年10月6日
    2
  • Java多态实现原理

    Java多态实现原理##前言多态是Java语言重要的特性之一,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。Java对于方法调用动态绑定的实现主要依赖于方法表,但通过引用调用(invokevitual)和接口引用调用(invokeinterface)的实现则有所不同。Java多态实现原理的大致过程:首先是Java编译器将Java源代码编译成class文件。在编译过程中,会根据静态类型将调用的符号引用写到class文件中。在执行时,JVM根据class文件找到调用方法的符号引用,然后在静态类型的方

    2022年7月7日
    20
  • SQL EXITS用法

    SQL EXITS用法比如在Northwind数据库中有一个查询为SELECTc.CustomerId,CompanyNameFROMCustomerscWHEREEXISTS(SELECTOrderIDFROMOrdersoWHEREo.CustomerID=c.CustomerID) 这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是Cu

    2025年6月24日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号