当前位置: 首页 > 程序语言 >用matlab拟合双因变量实验结果求助

用matlab拟合双因变量实验结果求助

作者 lycid
来源: 小木虫 350 7 举报帖子
+关注

实验的结果形式如下:[x;y1;y2] 由三列数据组成, 理论上y1 y2通过同一套参数与x 建立联系,我的问题是用matlab 对 y1和y2同时进行拟合,找到这些参数的值。
计算程序和数据见附件 程序中p数组为待拟合参数的初值 拟合中要能给参数定上下限最好了 如
lb = [1 1e2 1e3 90];
ub= [2 1e5 1e5 120];
谢谢

 返回小木虫查看更多

今日热帖
  • 精华评论
  • dingd

    这种问题用1stOpt很容易解决啊,有个命令“SharedModel”专门处理这类问题。

  • zhchh008

    用 fmincon函数,或者优化工具箱

  • yqx1985

    今天有点忙,等明天闲下来给你看

  • dingd

    引用回帖:
    4楼: Originally posted by lycid at 2011-11-16 14:00:52:
    1stOpt 好像无法直接在里边编写这样的计算程序  得跟C或Fortan 联合 不太会啊 有点麻烦
    用 fmincon函数 我也试过 但好像不太好使 运行一阵就提示中断   
    优化工具箱没用过 不知道怎么用 是外部嵌入matlab的程序吗

    1stOpt可以直接用Basic或Pascal语言描述复杂的模型,很简单好用的。你的模型代码没太看明白,用图片或Word格式描述一下,可以帮你跑跑!

  • yqx1985

    简单的来讲,这种问题可以采用如下方式估计,不过具体的函数参数设置还要你自己摸索。
    (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是初始估计值

    整体思路就是这个样子的,利用非线性回归的方法解决。中间的很多参数你得好好调整下,

  • yqx1985

    竟然不能修改,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是初始估计值

猜你喜欢
下载小木虫APP
与700万科研达人随时交流
  • 二维码
  • IOS
  • 安卓