用matlab拟合双因变量实验结果求助
实验的结果形式如下:[x;y1;y2] 由三列数据组成, 理论上y1 y2通过同一套参数与x 建立联系,我的问题是用matlab 对 y1和y2同时进行拟合,找到这些参数的值。
计算程序和数据见附件 程序中p数组为待拟合参数的初值 拟合中要能给参数定上下限最好了 如
lb = [1 1e2 1e3 90];
ub= [2 1e5 1e5 120];
谢谢
今日热帖
实验的结果形式如下:[x;y1;y2] 由三列数据组成, 理论上y1 y2通过同一套参数与x 建立联系,我的问题是用matlab 对 y1和y2同时进行拟合,找到这些参数的值。
计算程序和数据见附件 程序中p数组为待拟合参数的初值 拟合中要能给参数定上下限最好了 如
lb = [1 1e2 1e3 90];
ub= [2 1e5 1e5 120];
谢谢
这种问题用1stOpt很容易解决啊,有个命令“SharedModel”专门处理这类问题。
用 fmincon函数,或者优化工具箱
今天有点忙,等明天闲下来给你看
1stOpt可以直接用Basic或Pascal语言描述复杂的模型,很简单好用的。你的模型代码没太看明白,用图片或Word格式描述一下,可以帮你跑跑!
简单的来讲,这种问题可以采用如下方式估计,不过具体的函数参数设置还要你自己摸索。
(1)建立一个函数,名为fun
R=fun(p,data) %
x=data(:,1);y1=data(:,2);y2=data(:,3);
n0 = 1; % air
n1 = p(1)+p(2)./x.^2+p(3)./x.^2; % oxide
n2 = 3.4693+130149./x.^2+2.851e10./x.^4 + 1i*(0.52686-320950./x.^2+6.2225e10./x.^4); % silicon
d1 = p(4);
%Refracted angles
tet0 = pi*60/180; % incident beam angle
tet1 = asin((n0./n1)*sin(tet0));
tet2 = asin((n1./n2).*sin(tet1));
%Boundary reflection coefficients
r01s = (n0.*cos(tet0)-n1.*cos(tet1))./(n0.*cos(tet0)+n1.*cos(tet1));
r12s = (n1.*cos(tet1)-n2.*cos(tet2))./(n1.*cos(tet1)+n2.*cos(tet2));
r01p = (n1.*cos(tet0)-n0.*cos(tet1))./(n1.*cos(tet0)+n0.*cos(tet1));
r12p = (n2.*cos(tet1)-n1.*cos(tet2))./(n2.*cos(tet1)+n1.*cos(tet2));
dt1 = (2*pi./x).*n1.*d1.*cos(tet1);
%Reflection coefficients total
rs = (r01s+r12s.*exp(2*1i*dt1))./(1+r01s.*r12s.*exp(2*1i*dt1));
rp = -(r01p+r12p.*exp(2*1i*dt1))./(1+r01p.*r12p.*exp(2*1i*dt1));
F = rp./rs;
psi=atan(abs(F))*180/pi;
delta = angle(F)*180/pi;
m=find(delta<0);
delta(m(1:end))=delta(m(1:end))+360;
% y1=psi;
% y2=delta;
R1=(y1-psi).^2;
R2=(y2-delta).^2;
R=R1+R2;
% R1,R2和R的计算很重要,会影响到最终的参数估计,你可以%更具你的需要选一个最稳健的表达方法;这样,如果能选取到合适的参数的话,得到的R应该是一个尽可能接近于0的向量
options=statset; %根据需要设定参数,很重要
R=zeros(legth(data),1);
[beta,r,J,Sigma,mse] = nlinfit(data,R, @fun,p,options); % p是初始估计值
整体思路就是这个样子的,利用非线性回归的方法解决。中间的很多参数你得好好调整下,
竟然不能修改,fun函数到R=R1+R2就算结束了
下面的代码在command Windows中执行
options=statset; %根据需要设定参数,很重要
R=zeros(legth(data),1);
[beta,r,J,Sigma,mse] = nlinfit(data,R, @fun,p,options); % p是初始估计值