matlab的lsqnonlin函数怎么用
函数使用方法如下:
x=lsqnonlin(fun,x0)
x=lsqnonlin(fun,x0,lb,ub)
x=lsqnonlin(fun,x0,lb,ub,options)
[x,resnorm]=lsqnonlin(...)
[x,resnorm,residual]=lsqnonlin(...)
[x,resnorm,residual,exitflag]=lsqnonlin(...)
[x,resnorm,residual,exitflag,output]=lsqnonlin(...)
[x,resnorm,residual,exitflag,output,lambda]=lsqnonlin(...)[x,resnorm,residual,exitflag,output,lambda,jacobian]=lsqnonlin(...)
注:
1、lsqnonlin解决非线性最小二乘法问题,包含非线性数据的拟合问题
2、fun函数包含返回值为一个向量,该向量包含了各个求和的分量(以便于找到使目标最小的可行解)。
3、各参数可做为常量在函数中事先给出,也可传递得到(参数表加到lsqnonlin的后面,当然除了调用时候系统会使用的反复迭代的参数)。
4、不选的可致空集。(其中初值一般要有。lb,ub,option可空,即【】)
扩展资料:
MATLAB实现
LSQNONLIN解决非线性最小二乘法问题,包括非线性数据拟合问题;LSQCURVEFIT解决非线性数据拟合问题,下面给出利用这两个函数的例子。
LSQNONLIN
下面的例子说明利用LSQNONLIN函数用下面的函数进行拟合:
f=A+Bexp(C*x)+D*exp(E*x)对数据集x与y进行拟合,其中y是在给定x的情况下的期望输出(可以是方程给出数组,也可以是单独数据组成的数组)。
为了解决这个问题,先建立下面的名为fit_simp.m的函数,它利用数据x与y,将它们作为优化输入参数传递给LSQNONLIN。利用给定的数据x计算f的值,再与原始数据y进行比较。经验值与实际计算出的值之间的差异作为输出值返回。LSQNOLIN函数就是最小化这些差的平方和。
functiondiff=fit_simp(x,X,Y)
A=x(1);B=x(2);C=x(3);D=x(4);E=x(5);
diff=A+B.*exp(C.*X)+D.*exp(E.*X)-Y;
下面的脚本是利用上面定义的fit_simp.m函数的一个例子:
>>X=0:.01:.5;
>>Y=2.0.*exp(5.0.*X)+3.0.*exp(2.5.*X)+1.5.*rand(size(X));
>>X0=[11111]';
>>options=optimset('Largescale','off');
>>x=lsqnonlin(@fit_simp,X0,[],[],options,X,Y);
Optimizationterminatedsuccessfully:
GradientinthesearchdirectionlessthantolFun
Gradientlessthan10*(tolFun+tolX)
>>Y_new=x(1)+x(2).*exp(x(3).*X)+x(4).*exp(x(5).*X);
>>plot(X,Y,'+r',X,Y_new,'b');
注意:LSQNONLIN只可以处理实数变量。在处理包括复数变量的实例的拟合的时候,数据集应该被切分成实数与虚数部分。
参考资料:
lsqnonlin函数使用方法:
1、lsqnonlin为非线性最小二乘函数
2、格式
最简单的调用格式为:x=lsqnonlin(@F,x0, v1,v2)
最复杂的调用格式为:[x,norm,res,ef,out,lam,jac] = lsqnonlin(@F,x0,v1,v2,opt,P1,P2, ... )
x0为初始解(缺省时程序自动取x0=0); F给出目标函数的M文件,当Jacobian='on时必须给出其Jacobi矩阵,一般形式为:function [F,J] = Fun(x)。
扩展资料:
lsqnonlin输出变量的含义为:
1、 x : 最优解
2、 norm : 误差的平方和
3、res: 误差向量
4、 ef : 程序结束时的状态指示:
1)、 >0:收敛
2)、0:函数调用次数或迭代次数达到最大值(该值在options中指定)
3)、<0:不收敛
5、 out: 包含以下数据的一个结构变量
1)、funcCount 函数调用次数
2)、 iterations 实际迭代次数
3)、cgiterations 实际PCG迭代次数(大规模计算用)
4)、algorithm 实际使用的算法
5)、stepsize 最后迭代步长(中等规模计算用)
6)、firstorderopt 一阶最优条件满足的情况(大规模计算用)
6、 lam:上下界所对应的Lagrange乘子
7、 jac:结果(x点)处的雅可比矩阵
matlab的lsqnonlin()函数主要用于拟合非线性函数的系数,其处理方法是利用最小二乘法原理,使得函数的均方误差最小。
lsqnonlin()函数基本使用格式:
x = lsqnonlin(fun,x0,lb,ub,options)
x——使用迭代法搜索最优参数,x可以是一个变量,也可以是多个变量
fun——自定义函数,即非线性函数
x0——x变量的迭代初值
lb,ub——x值的上下限制值,即x值的范围设定,也可以是空矩阵【】
options—— 使用optimoptions设置选项,可以参照matlab的使用手册
使用实例:
xdata = [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];
fun = @(x)x(1)*exp(x(2)*xdata)-ydata;
x0 = [100,-1];
options = optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective');
x = lsqnonlin(fun,x0,[],[],options)
运行结果
x = 498.8309 -0.1013 %即x1=498.8309,x2=-0.1013
x
=
lsqnonlin(fun,x0)
x
=
lsqnonlin(fun,x0,lb,ub)
x
=
lsqnonlin(fun,x0,lb,ub,options)
[x,resnorm]
=
lsqnonlin(...)
[x,resnorm,residual]
=
lsqnonlin(...)
[x,resnorm,residual,exitflag]
=
lsqnonlin(...)
[x,resnorm,residual,exitflag,output]
=
lsqnonlin(...)
[x,resnorm,residual,exitflag,output,lambda]
=lsqnonlin(...)[x,resnorm,residual,exitflag,output,lambda,jacobian]=
lsqnonlin(...)
注:
1.lsqnonlin解决非线性最小二乘法问题,包含非线性数据的拟合问题
2.fun函数包含返回值为一个向量,该向量包含了各个求和的分量(以便于找到使目标最小的可行解)。
3.各参数可做为常量在函数中事先给出,也可传递得到(参数表加到lsqnonlin的后面,当然除了调用时候系统会使用的反复迭代的参数)。
4.不选的可致空集。(其中初值一般要有。lb,ub,option可空,即【】)
按照课本上的说法,isqnonlin主要用于求解非线性最小二乘(曲线拟合)问题。最一般的调用方法:
[x,norm,res,ef,out,lam,jac]=isqnonlin(@F,x0,v1,v2,opt,P1,P2,...)
左边是输出列表,右边是输入列表。
输出列表中参数的含义是:
x:目标函数F中的待定参数
norm:误差的平方
res:误差的向量
ef:程序停止运行的原因
out:一个结构变量,包含程序运行或停止时的一些信息
lam:上下界所对应的拉格朗日乘子
jac:结果(x点)处的雅可比矩阵
输入列表中参数的含义:
F:调用的函数
x0:迭代初值或有根区间
v1等:课本上没说我也不知道,一般写作[],意思是使用缺省值(默认值)
opt控制程序运行的参数,一般写作[],意思也是使用缺省值(默认值)
P1等:传递给F的参数(有需要的话)
以上就是isqnonlin的调用方法,最后再提醒大家,并不需要把所有的输入输出都写出来,只需要写出自己需要的就行。
举个例子(比如只想要x):
函数
function h=aabb(x)
h(1)=x(2)-x(1)^2;
h(2)=1-x(1);
命令行
x0=[2,2];
[x]=lsqnonlin(@aabb,x0)
结果为
1 .000 1.000
以上~