matlab的lsqnonlin函数怎么用

作者&投稿:播纨 (若有异议请与网页底部的电邮联系)
matlab中lsqnonlin函数怎么使用?~

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

N = 45; % 每个变量的数据的个数
H = rand(N,1); % 将H整理为列向量,在此输入H的值
t = rand(N,1); % 将t整理为列向量,在此输入t的值
y = rand(N,1); % 将y整理为列向量,在此输入y的值

YY = @(a) a(1)+a(2).*H+a(3).*H.*H+a(4).*H.*H.*H+a(5)*sin((2*pi.*t)/365)+a(6)*sin((4*pi.*t)/365)+a(7)*cos((2*pi.*t)/365)+a(8)*cos((4*pi.*t)/365)+a(9).*t+a(10)*log(1+t)+a(11)./(t+1) - y

x0 = [0.3 0.4 0.3 0.4 0.3 0.4 0.3 0.4 0.3 0.4 0.3] % Starting guess
[x,resnorm] = lsqnonlin(YY,x0) % Invoke optimizer x即为用最小二乘法求出的a(1)至a(11)的值

如有问题,请继读联系

函数使用方法如下:

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



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可空,即【】)

按照课本上的说法,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

以上~




lsq是什么意思?
LSQ是缩写语言中一个非常常见的词汇,它代表最小二乘法(Least Squares)。在数学和统计学中,最小二乘法是一种数学优化方法,其中通过最小化误差的平方和来拟合一个数据集,从而找到最佳拟合曲线。这个方法能够被应用在许多领域,如经济学,物理学,计算机科学等。最小二乘法在很多领域都有着广泛的应...

在matlab中 lsqurvefit指令输出的结果有三个值 分别是什么意思?_百度...
[x,resnorm,residual] = lsqcurvefit(...) returns the value of the residual fun(x,xdata)-ydata at the solution x.x是拟合出来的系数,resnorm是残差,residual是残差向量

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,outp...

matlab里lsqcurvefit应用拟合问题,大神们救命呀!
实在是搞不懂你啊,就一个参数还非得用lsqcurvefit进行拟合,即使程序无错也不会拟合理想的的,下面是正确的程序 function nu=fenxing(beta,d)cd=[2.5000e-004 2.5000e-004 2.5000e-004 2.5000e-004 2.5000e-004 2.5000e-004];df=[0.1 0.1 0.1 0.1 0.1 0.1];nu=[227.4000 ...

关于matlab中lsqcurvefit函数应用出错的问题
441 340.2 344.957 ];y=[5.45873 6.79679 7.79155 9.2996 10.58554 12.15892 14.06855 16.22598 18.77455 21.42668];a0=[1,2400];[a,resnorm]=lsqcurvefit(@fun,a0,x,y);再把a= lsqcurvefit(@fun,a0,x,y)这句话去掉,你刚才的定义改变了x的值,再引用x时当然维数不对了。

MATLAB中使用出错 lsqcurvefit函数进行非线性拟合出现错误,求教_百度...
function [ F ] = myfun5( x,xdata )中F不是返回值,不用[],直接是function F = myfun5( x,xdata )

matlab中lsqnonlin函数的用法,出现了问题,自己不能解决,求高手赐教...
你的fun.m是不是没有放到当前目录下?另外一般我都是把x,y 直接定义到fun里面:function E = fun(a);global x y;x = x(:);y = y(:);...这样的话,在外面运行的时候,你定义 global x y;x = ...y = ...a0 = ...options = ...a = lsqnon(@fun, ......

matlab中使用非线性拟合lsqcuevefit时出错,请各位大神帮帮忙,急呀...
你的函数应该写成[f]=...,因为生成的是矩阵,而且 应该加上end, 你的x在函数里应该是 两个未知数, 但是 主程序里没有算出两个未知数吧

matlab lsqcurvefit
F=a(1)*(1-exp(-x\/a(2)).*cos(2*pi*x\/a(3)));要点乘的

matlab中如何拟合光滑曲线
非线性拟合可以用:lsqcurefit(fun,x0,xdata,ydata)fun是函数模型,x0是初值;多元的非线性拟合可以用:nlinfit(x,y,fun,beta0)beta0是初值。若是知道曲线是几种基础函数的合成的话,可以利用原始的最小二乘法拟合函数,在网上随便找一下最小二乘法的程序m文件,添加进去就能用。

定远县13537559837: matlab的lsqnonlin函数怎么用 -
莱文倍司: 按照课本上的说法,isqnonlin主要用于求解非线性最小二乘(曲线拟合)问题.最一般的调用方法: [x,norm,res,ef,out,lam,jac]=isqnonlin(@F,x0,v1,v2,opt,P1,P2,...) 左边是输出列表,右边是输入列表. 输出列表中参数的含义是: x:目标函数F...

定远县13537559837: matlab函数lsqnonlin用法,跪求高手帮忙!!! -
莱文倍司: N = 45; % 每个变量的数据的个数 H = rand(N,1); % 将H整理为列向量,在此输入H的值 t = rand(N,1); % 将t整理为列向量,在此输入t的值 y = rand(N,1); % 将y整理为列向量,在此输入y的值YY = @(a) a(1)+a(2).*H+a(3).*H.*H+a(4).*H.*H.*H+...

定远县13537559837: 求MATLAB中lsqnonlin的用法~~就是它每个参数是干什么的~~ -
莱文倍司: http://www.baisi.net/viewthread.php?tid=51561 我刚刚看过,里面不仅有非线性最小二乘函数,还有线性的,还是比较详细的

定远县13537559837: matlab中lsqnonlin函数的用法,出现了问题,自己不能解决,求高手赐教 -
莱文倍司: 你的fun.m是不是没有放到当前目录下?另外一般我都是把x,y 直接定义到fun里面:function E = fun(a); global x y; x = x(:); y = y(:);...这样的话,在外面运行的时候,你定义 global x y; x = ...y = ...a0 = ...options = ...a = lsqnon(@fun, ....

定远县13537559837: matlab中lsqnonlin函数怎么使用?
莱文倍司: http://www.baisi.net/thread-2402447-1-1.html 我看了这里的帮助大概了解了,你可以看有帮助没

定远县13537559837: 用MATLAB做线性及非线性回归的函数有哪些 -
莱文倍司: 用MATLAB做线性及非线性回归的主要函数有:1、线性回归 函数(解决线性回归问题),如regress()、polyfit(),主要书写格式为 a= regress(y,X) %拟合线性回归函数的系数,a系数 p=polyfit(x,y,n); %拟合多项式的系数,n最大项数为92...

定远县13537559837: 为什么MATLAB拟合函数lsqnonlin设置初始值拟合之后,求得的拟合值总是与初始值相等,没有误差? -
莱文倍司: 很可能是你没有写对自己的函数模型,也就是提供给lsqnonlin函数求解的函数句柄不正确.

定远县13537559837: Matlab中的fsolve和lsqnonlin拟合具体用的是什么算法 -
莱文倍司: Matlab中的fsolve和lsqnonlin命令都是优化解法,用于解非线性方程和求最小优化,不是拟合用的.拟合的命令是fit,nonlinfit,等等.

定远县13537559837: 将matlab中的lsqnonlin函数移植到c++中?? -
莱文倍司: 我看了一下lsqnonlin函数的源码,调用了很多其他的函数,光核心的函数调用就在四五个以上.我感觉你可以试试matlab2012b中的code generator看看能不能直接生成C函数;另外不知道你能不能接受把matlab函数编译成dll调用的方式,这个方式一定能成功而且支持版本很多,但是算法运行起来比较慢;最后,也是最麻烦但最正常的方法,自己读一下lsqnonlin的帮助,里面有算法描述和参考文献,然后自己另去网上查找C版本的实现(估计这种经典算法会有现成版本的)或者自己写一个.

定远县13537559837: matlab中lsqnonlin函数出错 -
莱文倍司: 这个不能算lsqnonlin函数出错吧? 前面一个是兼容性警告,告诉你在将来的版本中可能不再支持LevenbergMarquardt 和LargeScale这两个选项,并且,如果不想看到该警告信息,可以设置Algorithm 为 'levenberg-marquardt',也就是把原代码中...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网