
紧急求助!!!,一个matlab最小二乘法编程问题.
有公式:y=a(1-exp(-bx))+c(exp(dx)-1),已知x=3,4,5,7,9,15;对应的y=1,2,4,6,8.现要用matlab的非线性最小二乘法求a...
有公式:y=a(1-exp(-bx))+c(exp(dx)-1),已知x=3,4,5,7,9,15;对应的y=1,2,4,6,8.现要用matlab的非线性最小二乘法求a,b,c,d.要具体的matlab程序.还有,‘a0’的初值是怎么付的?
本人急用此程序,希望matlab高手指教,万分感谢!!!
二楼的兄弟,麻烦你了,我把你给的程序调试了一遍,显示错误,具体内容如下:
??? Error using ==> optim\private\lsqncommon
User supplied function failed with the following error:
In an assignment A(I) = B, the number of elements in B and
I must be the same.
Error in ==> lsqnonlin at 147
[x,Resnorm,FVAL,EXITFLAG,OUTPUT,LAMBDA,JACOB] = ...
我调试其它的程序也出现这个,是不是我的matlab有问题呀,我的是网上下的破解版,请大侠帮忙再看看,再谢了!!! 展开
本人急用此程序,希望matlab高手指教,万分感谢!!!
二楼的兄弟,麻烦你了,我把你给的程序调试了一遍,显示错误,具体内容如下:
??? Error using ==> optim\private\lsqncommon
User supplied function failed with the following error:
In an assignment A(I) = B, the number of elements in B and
I must be the same.
Error in ==> lsqnonlin at 147
[x,Resnorm,FVAL,EXITFLAG,OUTPUT,LAMBDA,JACOB] = ...
我调试其它的程序也出现这个,是不是我的matlab有问题呀,我的是网上下的破解版,请大侠帮忙再看看,再谢了!!! 展开
2个回答
展开全部
不好意思啊,漏掉了,下面补上了:
%编写M文件:文件中的a(1)=a,a(2)=b,a(3)=c,a(4)=d
function E=fun(a,x,y)
x=x(:);
y=y(:);
Y=a(1)*(1-exp(-a(2)*x)) + a(3)*(exp(a(4)*x)-1);
E=y-Y;
%M文件结束
%用lsqnonlin调用解决:
x=[3 4 5 7 9 15];
y=[1 2 4 6 8 10];
a0=[1 1 1 1];
options=optimset('lsqnonlin');
a=lsqnonlin(@fun,a0,[],[],options,x,y)
关于a0,可以通过所知道的几组x和y的值来估算系数a、b、c、d的值,我这里没有估计,直接代入了1。
如果估计的较准确,最小二乘算出的系数更加精确。
lsqnonlin函数采用的是迭代法,a0则是迭代初始值。由于程序的局限性,不可能搜索无穷大的区间,这样一来,初始值的选择就很重要了。如果最优解离所给初始值比较近,迭代求出该最优解的概率就很高;如果初始值提供的不理想,离最优解较远,而matlab对于迭代次数及迭代精度都有个默认的设定,这种情况下很可能没有搜到最优解便给出了结果,当然这个结果是在所搜索区间上的最优解而不是全局最优的。
至于怎样估计初始值,我也没有肯定的办法,总之通过所知的x和y尽量使初始值接近就好了,毕竟matlab还是很强大的。
另外一个办法是,得到解后,画出函数的图形,看看那几个点是不是都在曲线附近,如果相差太大,就得考虑重新给初始值再计算一次。
%编写M文件:文件中的a(1)=a,a(2)=b,a(3)=c,a(4)=d
function E=fun(a,x,y)
x=x(:);
y=y(:);
Y=a(1)*(1-exp(-a(2)*x)) + a(3)*(exp(a(4)*x)-1);
E=y-Y;
%M文件结束
%用lsqnonlin调用解决:
x=[3 4 5 7 9 15];
y=[1 2 4 6 8 10];
a0=[1 1 1 1];
options=optimset('lsqnonlin');
a=lsqnonlin(@fun,a0,[],[],options,x,y)
关于a0,可以通过所知道的几组x和y的值来估算系数a、b、c、d的值,我这里没有估计,直接代入了1。
如果估计的较准确,最小二乘算出的系数更加精确。
lsqnonlin函数采用的是迭代法,a0则是迭代初始值。由于程序的局限性,不可能搜索无穷大的区间,这样一来,初始值的选择就很重要了。如果最优解离所给初始值比较近,迭代求出该最优解的概率就很高;如果初始值提供的不理想,离最优解较远,而matlab对于迭代次数及迭代精度都有个默认的设定,这种情况下很可能没有搜到最优解便给出了结果,当然这个结果是在所搜索区间上的最优解而不是全局最优的。
至于怎样估计初始值,我也没有肯定的办法,总之通过所知的x和y尽量使初始值接近就好了,毕竟matlab还是很强大的。
另外一个办法是,得到解后,画出函数的图形,看看那几个点是不是都在曲线附近,如果相差太大,就得考虑重新给初始值再计算一次。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询