matlab指数函数拟合

x=[-2.8 -2.6 -2.4 -2.2 -2 -1.8 -1.6 -1.4 -1.2 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8];
y=[26 31 36 42 50 59 71 82 99 116 134 149 163 172 175 172 163 149 134 116 99 82 71 59 50 42 36 31 26];
matlab指数函数曲线拟合:y=a*exp(b*x.^2)求a、b的系数,很急。

%lny=lna+b*x^2,也就是两边取对数,化成线性形式,因变量是ln(y),自变量是x^2

x=[-2.8 -2.6 -2.4 -2.2 -2 -1.8 -1.6 -1.4 -1.2 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8];

y=[26 31 36 42 50 59 71 82 99 116 134 149 163 172 175 172 163 149 134 116 99 82 71 59 50 42 36 31 26];

y_ln=log(y)';

x2=(x.^2)';

linear_fun=fit(x2,y_ln,'poly1');

figure

plot(linear_fun,x2,y_ln);

b=exp(linear_fun.p1)

a=linear_fun.p2

ypre=a*exp(b*x.^2);

figure

plot(x,y,'*',x,y,'-o');

最后结果是

b =

    0.7804

a =

    5.0215

追问

我把计算所得的a、b的值代入函数,发现所画得的曲线跟原有x、y的数值不吻合,
你看有没有其他办法能根据x、y的数据,利用matlab自动找出最符合数据分布规律的函数,并给出拟合所得的公式。

追答

哦,不好意思,我当时画的有问题。至于你说的那个,没有这样的方法。拟合本身就是有误差的。

改正:

%lny=lna+b*x^2,也就是两边取对数,化成线性形式,因变量是ln(y),自变量是x^2

x=[-2.8 -2.6 -2.4 -2.2 -2 -1.8 -1.6 -1.4 -1.2 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8];

y=[26 31 36 42 50 59 71 82 99 116 134 149 163 172 175 172 163 149 134 116 99 82 71 59 50 42 36 31 26];

y_ln=log(y)';

x2=(x.^2)';

linear_fun=fit(x2,y_ln,'poly1');

figure

plot(linear_fun,x2,y_ln);

b=linear_fun.p1;

a=exp(linear_fun.p2);

ypre=a*exp(b*x.^2);

figure

subplot(2,1,1)

plot(x,y,'*',x,ypre,'-o');

subplot(2,1,2)

stem(y-ypre);

最后

b =

   -0.2479

a =

  151.6331


下面的图上边的是拟合数据,下面的是残差:

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-20

x=[-2.8 -2.6 -2.4 -2.2 -2 -1.8 -1.6 -1.4 -1.2 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8]';

y=[26 31 36 42 50 59 71 82 99 116 134 149 163 172 175 172 163 149 134 116 99 82 71 59 50 42 36 31 26]';

fit_type=fittype('a*exp(b*x^2)','independent','x','coefficient',{'a','b'});

f=fit(x,y,fit_type)

plot(f)

hold on

plot(x,y,'o')

f = 

     General model:

     f(x) = a*exp(b*x^2)

     Coefficients (with 95% confidence bounds):

       a =       166.8  (161.6, 172)

       b =     -0.3087  (-0.3317, -0.2856)

>> 

追问

拟合出的曲线跟数值还是有挺大的误差,你看有没有其他办法能根据x、y的数据,利用matlab自动找出最符合数据分布规律的函数,并给出拟合所得的公式。(拟合出的公式不一定是y=a*exp(b*x.^2)的形式)

本回答被提问者采纳
相似回答