Matlab指数拟合问题:谁能帮我看看为什么画出来的图像函数部分是一条直线呢?

程序如下:第一步:生成目标函数的函数文件goal002.mfunctionf=goal002(a,x)f=a(1)+(-a(1)+a(2))*exp(-a(3)*x);第... 程序如下:
第一步:生成目标函数的函数文件goal002.m
function f=goal002(a,x)
f=a(1)+(-a(1)+a(2))*exp(-a(3)*x);
第二步:生成计算的主程序cfit002.m
clear;
x=[1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900 1910 1920 1930 1940 1950 1960 1970 1980 1990 2000];
y=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0 92.0 106.5 123.2 131.7 150.7 179.3 204.0 226.5 251.4 281.4];
a0=[1 1 1];
[a,jm]=lsqcurvefit(@goal002,a0,x,y)
x1=sort(x);
y1=goal002(a,x1);
plot(x,y,'r*');hold on
plot(x1,y1)

我的曲线画出来为什么是直线呢?
谁能帮我看看^
谢谢啊……
展开
 我来答
ndfly
2010-06-30 · TA获得超过156个赞
知道答主
回答量:52
采纳率:0%
帮助的人:57.6万
展开全部

你的代码没错,你要拟合的曲线是 f=a(1)+(-a(1)+a(2))*exp(-a(3)*x);

     问题就出在exp(-a(3)*x)上  ,由于x的值都很大,因此exp(-a(3)*x)在超过了matlab的最小数,因此matlab显示的是0。所以当你用拟合的曲线计算在x出的值时,都等于a(1)了,因为后面的等于零。因此你画出的图像就是直线了。

我试了一下确实如此。

>> exp(-1790)

ans =

     0

   还有个原因,即使把你的x除以100也会得到一条直线,因为这样的x使得

(-a(1)+a(2))*exp(-a(3)*x)的值很小

>> x

x =

  Columns 1 through 10

   17.9000   18.0000   18.1000   18.2000   18.3000   18.4000   18.5000   18.6000   18.7000   18.8000

  Columns 11 through 20

   18.9000   19.0000   19.1000   19.2000   19.3000   19.4000   19.5000   19.6000   19.7000   19.8000

  Columns 21 through 22

   19.9000   20.0000

>> (-a(1)+a(2))*exp(-a(3)*x)

ans =

  1.0e-005 *

  Columns 1 through 10

   -0.1578   -0.1428   -0.1292   -0.1169   -0.1058   -0.0957   -0.0866   -0.0784   -0.0709   -0.0642

  Columns 11 through 20

   -0.0581   -0.0525   -0.0475   -0.0430   -0.0389   -0.0352   -0.0319   -0.0288   -0.0261   -0.0236

  Columns 21 through 22

   -0.0214   -0.0193

由于a(1)=94.7727,与上述值比起来要大很多 ,因此加起来还是等于94.7727。

>> ans+94.7727

ans =

  Columns 1 through 10

   94.7727   94.7727   94.7727   94.7727   94.7727   94.7727   94.7727   94.7727   94.7727   94.7727

  Columns 11 through 20

   94.7727   94.7727   94.7727   94.7727   94.7727   94.7727   94.7727   94.7727   94.7727   94.7727

  Columns 21 through 22

   94.7727   94.7727

 这是不是意味着matlab出错呢?不是的,如果我们换成长格式,让matlab更加精确,就可以看出差别了。

format long

>> ans

ans =

  Columns 1 through 5

  94.772698421642701  94.772698571843264  94.772698707750351  94.772698830724153  94.772698941995472

  Columns 6 through 10

  94.772699042677914  94.772699133779156  94.772699216210967  94.772699290798357  94.772699358287809

  Columns 11 through 15

  94.772699419354808  94.772699474610505  94.772699524607916  94.772699569847461  94.772699610781885

  Columns 16 through 20

  94.772699647820886  94.772699681335155  94.772699711660124  94.772699739099295  94.772699763927278

  Columns 21 through 22

  94.772699786392565  94.772699806719999

这样就很明白了,造成这种问题的原因是值和值之间的相差太小,因此画出的也是直线。

    结论是:  必须把x缩小,再使用对数y轴,如图:

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式