nebula1983 发表于 2007-8-14 17:06

关于用lsqnonlin进行曲线拟合的问题

各位高手,小弟最近在进行对一条增益曲线进行拟合时,遇到了困难,查阅书籍时,发现和这个例子比较相似:
例子如下:函数为:y=c(1)*exp(-d(1)*x)+c(2)*exp(-d(2)*x)
function f=myfun(d,Data)
%假设y=c(1)*exp(-d(1)*x)+...+c(n))*exp(-d(n)*x)
%带有n个线性参数,n个非线性参数
x=Data(:,1);y=Data(:,2);
A=zeros(length(x),length(d));
for i=1:length(d)
    A(:,i)=exp(-d(i)*x);
end
c=A\y;      %通过A*c=y求解线性参数c;
z=A*c;
f=z-y;

Data=';
options=optimset('LargeScale','off');
options=optimset(options,'MaxFunEvals',300);
options=optimset(options,'LevenbergMarquardt','off');
options=optimset(options,'LineSearch','cubicpoly');

d0=;
d=lsqnonlin('myfun',d0,[],[],options,Data);

【结果输出】
c=2.8898
   3.0061
d=1.4006    10.5891
但现在我的问题是:我要求的公式形式为:y=c(1)*exp(-d(1)*x/t(1))+c(2)*exp(-d(2)*x/t(2))+……c(10)*exp(-d(10)*x/t(10))也就是说有三个未知数向量需要求解,那么,如何在本例子上修改呢?
我试了很多种形式,都提示我公式运用错误,请各位不吝赐教。
p.s:或者不用这么麻烦,直接把三个参数向量全改成a(1),a(2)……?但为了得到结果的方便,还是希望各位帮我看一看(cause有三十个系数需要确定,每个向量十个,分开求出比较方便)

dingd 发表于 2007-8-14 20:20

d(i)/t(i)实际上等价于d(i),公式可简写为:y=c(1)*exp(-d(1)*x)+c(2)*exp(-d(2)*x)+……c(10)*exp(-d(10)*x),系数只有20个。

nebula1983 发表于 2007-8-14 20:30

我不是这个意思,按照你的说法,其实可以等价为一个系数了,因为论文需要把三个系数分别求出,公式比这个更加复杂,这个只是意思一下,完整的应该是:g(w)=a(1)exp(-(w-d(1))^2/t(1)^2)+^……+a(10)exp(-(w-d(10)^2)/t(10)^2),
让你费心了,谢谢

nebula1983 发表于 2007-8-14 20:32

g(w)=a(1)exp(-(w-d(1))^2/t(1)^2)+……+a(10)exp(-(w-d(10))^2)/t(10)^2)
我把公式写清楚点,呵呵

dingd 发表于 2007-8-14 23:49

这种拟合问题,建议用1stOpt!

nebula1983 发表于 2007-8-15 10:10

对不起,因为是论文要求用LM算法实现的,所以,能帮我想想好么?另:1stopt我不知道是什么,:'(

dingd 发表于 2007-8-16 10:47

1stOpt是个优化软件,搜索一下就知道了,其中也包含LM算法。

eight 发表于 2007-8-17 19:44

原帖由 nebula1983 于 2007-8-15 10:10 发表 http://www.chinavib.com/forum/images/common/back.gif
对不起,因为是论文要求用LM算法实现的,所以,能帮我想想好么?另:1stopt我不知道是什么,:'(


1stopt 这个 google 一下或者搜索本论坛就可以了,建议自己多动手。dingd 版友对于这个软件有不错的研究,如果要使用的话请多参考他的帖子
页: [1]
查看完整版本: 关于用lsqnonlin进行曲线拟合的问题