找回密码
 注册
Simdroid-非首页
查看: 167|回复: 10

关于参数估计方面的问题

[复制链接]
发表于 2006-12-20 10:07:59 | 显示全部楼层 |阅读模式 来自 陕西西安
问题:  函数值为 y, 变量为x1,x2,(其中x2为复数),y与 x1,x2的依赖可以表示为下面的关系式
y = a*x1+b/(cx1*x2+d)+e

a,b,c,d,e为拟合系数

请问,在 matlab下 如何进行上面模型的拟合,谢谢
 楼主| 发表于 2006-12-20 15:30:56 | 显示全部楼层 来自 陕西西安
Simdroid开发平台
自己顶一下,希望在这方面有经验的xd来指点啊
发表于 2006-12-20 16:01:49 | 显示全部楼层 来自 北京西城
Matlab能做,但麻烦,还涉及到初值选择问题,建议用1stOpt。
发表于 2006-12-20 16:04:35 | 显示全部楼层 来自 新疆乌鲁木齐
复数变量的拟合问题具体如何来做呢?麻烦shamohu兄详细解释一下,谢谢!
发表于 2006-12-20 16:24:54 | 显示全部楼层 来自 北京西城
对不起,没看清楚,1stOpt好像目前不支持复数运算。
发表于 2006-12-20 19:45:31 | 显示全部楼层 来自 湖北武汉
将方程写为
cx1*x2+d=f...
将复数拆开
得到两个实数方程
也许可以试试
UPDATE:我也许理解错了
拟合参数中也许有复数
不然那个X2的复数实在太突然

[ 本帖最后由 shunfly 于 2006-12-21 09:25 编辑 ]
 楼主| 发表于 2006-12-21 09:45:54 | 显示全部楼层 来自 陕西西安
实际上 更准确的表述该为如下
y = (a+b*x1+c*x1*x2)/(d+e*x1+f*x1*x2)

a,b,c,d,e,f当然希望是实数;
本问题的物理背景是 两种介质材料混合物的宏观电磁参数拟合公式;由于其中一种介质为空气,所以电磁参数固定; x2代表另一种介质的电磁参数(为复数变量), x1代表该介质的体积百分比.
发表于 2006-12-22 16:47:15 | 显示全部楼层 来自 LAN
为了拟合复数变量,你需要将复数分解为实数部分与虚数部分,然后把他们传递到函数中去,这个函数被LEASTSQ作为单个输入调用。首先,将复数分解为实部与虚部两个向量。其次,将这两个向量理解成诸如第一部分是实部、第二部分是虚部。在MATLAB函数中,重新装配复数数据,并用你想拟合的复数方程计算。将输出向量分解实部与虚部,将这两部分连接为一个单一的输出向量传递回LEASTSQ。下面,给出一个例子演示如何根据两个复数指数拟合实数X与Y。
建立方程:
function zero = fit2(x,X,Y)
% 根据输入x重建复数输入
cmpx = x(1:4)+i.*x(5:8);
% 利用复数计算函数
zerocomp = cmpx(1).*exp(cmpx(2).*X) + cmpx(3).* exp(cmpx(4).*X)-Y;
% 将结果转换成一个列向量
% 其中第一部分是实部,第二部分是虚部
numx = length(X); % 实部长度
zero=real(zerocomp); %实部
zero(numx+1:2*numx)=imag(zerocomp); % 虚部
   为了评价计算这个函数,需要X与Y数据集。LSQNONLIN将根据它拟合出下面方程中的参数a,b,c与d:
       Y = a*exp(b*X)+c*exp(d*X);
其中,a,b,c与d是复数变量。
>> X=0:.1:5;
>> Y=sin(X);
>> Y=Y+.1*rand(size(Y))-.05;
>> cmpx0=[1 i 2 2*i];
>> x0(1:4)=real(cmpx0);
>> x0(5:8)=imag(cmpx0);
>> x=leastsq(@fit2,x0,[],[],X,Y);
>> cmpx=x(1:4)+i.*x(5:8);
>> Y1=real(cmpx(1).*exp(cmpx(2).*X)+cmpx(3).*exp(cmpx(4).*X));
>> plot(X,Y1,'r');
>> hold on
>> plot(X,Y,'+');
网上看到的使用复数变量拟合的例子

评分

1

查看全部评分

 楼主| 发表于 2006-12-23 12:44:11 | 显示全部楼层 来自 陕西西安
原帖由 robinbird 于 2006-12-22 16:47 发表
为了拟合复数变量,你需要将复数分解为实数部分与虚数部分,然后把他们传递到函数中去,这个函数被LEASTSQ作为单个输入调用。首先,将复数分解为实部与虚部两个向量。其次,将这两个向量理解成诸如第一部分是实部 ...



写的比较清晰,谢谢
 楼主| 发表于 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 编辑 ]
 楼主| 发表于 2007-1-13 09:29:13 | 显示全部楼层 来自 陕西西安
复数拟合的问题已经解决了;但 另一个问题还没有解决.

我希望拟合的实际上是曲面, 也就是矩形域上 n*m个数据点的拟合曲面,非线性的.
当然如果用拟合单变量来复合拟合编程,当然也可以;但是 照说应该直接有拟合曲面的最小二乘算法,有知道的兄弟请告知一下,matlab中是否有得到曲面拟合系数的算法.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-24 00:50 , Processed in 0.043491 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表