ouc209 发表于 2009-8-11 16:55

请教:最小二乘法曲线拟合问题-怎么处理实数虚数

由于要对测量所得阻抗曲线进行拟合,阻抗由电阻,电容,电感组成,所以会出现复数。
matlab程序如下:
function z = myfun(a, f);
f1 = f;
w=2*pi*f1;
s=i*w;
z=s*a(1)./(s.^2*a(1)*a(2)+s*a(1)/a(3)+1)+s*a(4)*a(5)./(s*a(4)+a(5))+s*a(6)+a(7);(这就是阻抗表达式)

aa=load('R_mode.dat');
bb=load('ph_mode.dat');
lth=length(aa);
f=aa(1:end,1);%频率
z=aa(1:end,2);%阻抗模值
ph=bb(1:end,2);%相位角
x=z.*sin(ph*2*pi/360);
r=z.*cos(ph*2*pi/360);
R=r+i*x;

a0= ; % 初始值
option=optimset('MaxFunEvals',1e10,'maxiter',1e10);
= lsqcurvefit(@myfun_liu,a0, f, R, [], [], option);

%画图
f1 = f;
w=2*pi*f1;
s=i*w;
zz=s*a(1)./(s.^2*a(1)*a(2)+s*a(1)/a(3)+1)+s*a(4)*a(5)./(s*a(4)+a(5))+s*a(6)+a(7);
plot(f,z,'r',f,abs(zz));

所作出图形如下:蓝线是拟合出来的,红线是实测的。

两条曲线吻合很好。但是:a(1:7)应该是实数,但是拟合出来的a为复数。怎么解决这个问题啊。请高手指教啊!

ChaChing 发表于 2009-8-11 17:57

回复 楼主 ouc209 的帖子

没资料试! 凭LZ的描述及个人直觉, 将a(7)改为real(a(7))试试!

ouc209 发表于 2009-8-11 19:01

回复 沙发 ChaChing 的帖子

只改a(7)吗,a是一个数列

ChaChing 发表于 2009-8-11 23:53

回复 板凳 ouc209 的帖子

z=s*a(1)./(s.^2*a(1)*a(2)+s*a(1)/a(3)+1)+s*a(4)*a(5)./(s*a(4)+a(5))+s*a(6)+real(a(7));试试!
不过个人没把握!
页: [1]
查看完整版本: 请教:最小二乘法曲线拟合问题-怎么处理实数虚数