24小时热门版块排行榜    

查看: 694  |  回复: 0

aaa2742

木虫 (正式写手)

[求助] 非线性拟合表达式较复杂,拆分后可以处理吗,在Matlab中

有一个光谱的表达式较复杂,且某些变量与波长也有变化关系,想做一个非线性拟合,
一开始只是用的循环枚举参数的方法求得最优的参数,现在使用想使用lqscurvefit,但是报错
CODE:
pai = 3.14;
len = length(xdata);
N0 = 1*ones(len,1);
%N0 = 1;
N1 = 1.448+3634./power(xdata,2)-8.885./power(xdata,4);
N2 = ((3.363*xdata -946.7)./(xdata -328.6))+1i*((-0.03382*xdata + 27.03)./(xdata -365.3));
t = @(x) 2*pai.*N1*x./xdata;
r = @(x)((N0-N2).*cos(t(x))+1i*(N0.*N2./N1-N1).*sin(t(x)))./((N0+N2).*cos(t(x))+1i*(N0.*N2./N1+N1).*sin(t(x)));
% test = r(100);
Fun = @(x)(r(x).*conj(r(x)));
RFun = @(x) norm(Ry-r(x).*conj(r(x)));
% [res,fval,exitflag,output] = fminbnd(RFun,1,5000)

res = lsqcurvefit(Fun,1,xdata,Ry)
m = 1;
for h = 1:0.01:100
    res(m) = RFun(h);
    m = m +1;
end
[C,I] = min(res)
k = 1:0.01:100;
k(I)

使用lqscurvefit出错:
CODE:
Error using @(x)(r(x).*conj(r(x)))
Too many input arguments.

Error in lsqcurvefit (line 195)
            initVals.F = feval(funfcn_x_xdata{3},xCurrent,XDATA,varargin{:});

Error in RFitModel_2 (line 34)
res = lsqcurvefit(Fun,1,xdata,Ry)

Caused by:
    Failure in initial user-supplied objective function evaluation. LSQCURVEFIT cannot continue.

使用循环枚举的方法倒是可以得到一个较优的数值,但是计算耗时长,且间隔设置的大小对结果都有影响,间隔小,耗时长;间隔大,不准确。
请问该怎样解决该问题,想寻找别的算法,公式中含有复数,只不过最后乘以它的共轭,所以如果都有参数的话计算的数值是整数,但是现在是反推其中的一个参数。
所以尝试使用lqscurvefit进行拟合,结果错了,难道非得把表达式全部写全弄到一个里面吗,那也太长也容易出错啊。
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 aaa2742 的主题更新
信息提示
请填处理意见