急!Matlab新手上路,拟合数据不对,求救!!

我想用Matlab拟合自定公式的系数,公式为,y=a/(b*(x+c))+d,代码、数据如下:
x=[14.79 259.63 356.72 420.24 457.9 503.58 528.9 546.71 567.54 576.87 586.08 597.04 604.6 611.9];
y=[146.8 246.8 346.8 446.8 546. 746.8 946.8 1146.8 1546.8 1846.8 2246.8 3046.8 4046.8 5546.8];
f=inline('p(1)./(p(2)*(x+p(3))+p(4))','p','x');
p=nlinfit(x,y,f,[1 1 1 1])%p=[a b c d]
plot(x,y,'ro')
hold on
xx=0:600;
yy=f(p,xx);
plot(xx,yy)
xlim([0,600])
但我得出的数据不对,请问问题出在哪里!路过的大神请帮帮忙,感激不尽!

主要是初值选择不当,把

    p=nlinfit(x,y,f,[1 1 1 1])

改成

    p=nlinfit(x,y,f,[-2e5 1 -650 30])

即可得到较为满意的效果。

 

很多情况下,拟合问题都和参数的初始估计值有关系。因为参数拟合本质上是一个优化问题,尤其对于多个拟合参数的情况,很可能存在多个局部最优点,如果初始参数选择不当,就很容易陷入局部最优。

 

对此,我并没有什么高明的解决办法,只是建议楼主,在选择拟合参数初值的时候,应该考虑根据曲线的形状,尽量选择适当一些的值。例如,对于这个例子的数据,既然决定用反比例函数去拟合,那么相关的几个参数是不难做出大概的估计的(可借助ezplot函数画图对比)。当然,这有个试探的过程,我也并非一下子就选择出合适的初值的。

 

另外,还有两点值得一说:

1、楼主把公式写错了,按照你给的拟合函数形式y=a/(b*(x+c))+d,表达式

f=inline('p(1)./(p(2)*(x+p(3))+p(4))','p','x')

应为

f=inline('p(1)./(p(2)*(x+p(3)))+p(4)','p','x')

2、上面的表达式y=a/(b*(x+c))+d其实可以进一步化简为y=a/(x+c)+d,这样只有三个拟合参数,代码需要改动的只有两行:

f=inline('p(1)./(x+p(2))+p(3)','p','x');
p=nlinfit(x,y,f,[-1.1e5 -670 30])%p=[a c d]

温馨提示:答案为网友推荐,仅供参考
相似回答