Matlab 中用Isqnonlin函数解决最小二乘逼近问题!!

来源:百度知道 编辑:UC知道 时间:2024/05/18 00:38:37
x=a(1)+a(3)*cos(x1+a(6))+a(4)*cos(x1+x2+a(6)+a(7))+a(5)*cos(x1+x2+x3+a(6)+a(7)+a(8));
y=a(2)+a(3)*sin(x1+a(6))+a(4)*sin(x1+x2+a(6)+a(7))+a(5)*cos(x1+x2+x3+a(6)+a(7)+a(8));
给定(x1,x2,x3)和(x,y)的n组值后,用最小二乘求a
请求高手指点具体.m文件编写和Isqnonlin的调用
。。

解:
建立m文件,命名为fun.m好了:

function f=fun(a,x1,x2,x3,x,y)
f=sqrt((a(1)+a(3)*cos(x1+a(6))+a(4)*cos(x1+x2+a(6)+a(7))+a(5)*cos(x1+x2+x3+a(6)+a(7)+a(8))-x).^2+...
(a(2)+a(3)*sin(x1+a(6))+a(4)*sin(x1+x2+a(6)+a(7))+a(5)*cos(x1+x2+x3+a(6)+a(7)+a(8))-y).^2);

保存在work文件夹下

调用该文件求解:

a0=ones(1,8); %取初始值
x1=?; x2=?; x3=?; x=?; y=?;
%上面这一行既然为已知量,请你在"?"号处自己赋值
[a,norm]=lsqnonlin(@fun,a0,[],[],[],x1,x2,x3,x,y)

注意到:
1)|x-X|与|y-Y|在同一组a值下同时达到最小不是自然的,所以这一题取的是|x-X|.^2+|y-Y|.^2的最小,即最后一式输出的norm,误差的平方和,是|x-X|^2+|y-Y|^2;
2)由于你没有给我 x1,x2,x3,x,y的值,我写好试着运行时,x1,x2,x3倒是我自己随便定,但x,y不能随便赋值,要用扰动产生又意义不大,还是麻烦你自己运行检查一下吧。

【补充】修改了,所以,排到后面去了。

值得关注,好问题,收藏了。

看看这个例子:
function hh
x0 = [0.3 0.4]
[x,resnorm] = lsqnonlin(@myfun,x0)
function F = myfun(x)
k = 1:10;
F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));

结果:

x =

0.2578 0.2578