matlab的lsqnonlin函数怎么用

2025-05-15 13:58:08
推荐回答(3个)
回答1:

函数使用方法如下:

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只可以处理实数变量。在处理包括复数变量的实例的拟合的时候,数据集应该被切分成实数与虚数部分。

参考资料:

百度百科——非线性数据拟合

回答2:

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点)处的雅可比矩阵

回答3:

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