- 积分
- 0
- 注册时间
- 2002-6-10
- 仿真币
-
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2007-1-12 20:22:12
|
显示全部楼层
来自 陕西西安
函数 leastsq 在matlab5.3后不再启用; 介绍5.3版本的书中说接替的函数是 lsqnonlin;
但是这个函数在笔者使用的版本matlab7.0.1中也已经格式大变,与精通matlab5.3书中讲的不一样了;
格式变成了
[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqnonlin(fun,x0,lb,ub,options);
如此,采用楼上兄弟的方法拟合,需要将 X,Y再合并成一个变量.
不过在这个版本中,另外有个函数 lsqcurvefit 也可以进行这个拟合功能,所用方法与 lsqnonlin一致.
调用格式为
[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options);
下面给出楼上兄弟的算例,不过在这里,,xd,yd以及拟合系数都便成了复数,为感谢楼上兄弟的贡献,特保留其采用的函数名:
%::::::::::::::
function zero = fit2(x0,xd)
% 根据输入x0, xd重建复数输入
numx = length(xd); % 实部长度
x = xd(1:numx/2)+i.*xd(numx/2+1:numx);
%numx0 = length(x0);
cmpx = x0(1:4)+i.*x0(5:8);
% 利用复数计算函数
zerocomp = cmpx(1).*exp(cmpx(2).*x) + cmpx(3).* exp(cmpx(4).*x);
% 将结果转换成一个列向量
% 其中第一部分是实部,第二部分是虚部
zero=real(zerocomp); %实部
zero(numx/2+1:numx)=imag(zerocomp); % 虚部
% Y = a*exp(b*X)+c*exp(d*X);
% test_fit.m
xd=0:.1:5; xd = xd+.3*i;
yd=sin(xd);
yd=yd+.1*rand(size(yd))-.05;
numx = length(xd); % 实部长度
xdd=real(xd); %实部
xdd(numx+1:2*numx)=imag(xd); % 虚部
ydd=real(yd); %实部
ydd(numx+1:2*numx)=imag(yd); % 虚部
cmpx0=[1 i 2 2*i];
x0(1:4)=real(cmpx0);
x0(5:8)=imag(cmpx0);
[x,resnorm,residual,exitflag]=lsqcurvefit(@fit2,x0,xdd,ydd);
cmpx=x(1:4)+i.*x(5:8);
Y1=real(cmpx(1).*exp(cmpx(2).*xd)+cmpx(3).*exp(cmpx(4).*xd));
拟合结果非常好, resnorm = 0.037989;
[ 本帖最后由 stealthact 于 2007-1-12 21:57 编辑 ] |
|