Matlab指数拟合问题:谁能帮我看看为什么画出来的图像函数部分是一条直线呢?
来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/07/19 06:31:07
Matlab指数拟合问题:谁能帮我看看为什么画出来的图像函数部分是一条直线呢?
程序如下:
第一步:生成目标函数的函数文件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)
我的曲线画出来为什么是直线呢?
谁能帮我看看^
程序如下:
第一步:生成目标函数的函数文件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)
我的曲线画出来为什么是直线呢?
谁能帮我看看^
你的代码没错,你要拟合的曲线是 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轴,如图:
![](http://img.wesiedu.com/upload/1/29/1296906132ed61d4634fb611e65a3fd4.jpg)
问题就出在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轴,如图:
![](http://img.wesiedu.com/upload/1/29/1296906132ed61d4634fb611e65a3fd4.jpg)
Matlab指数拟合问题:谁能帮我看看为什么画出来的图像函数部分是一条直线呢?
如何用matlab画出抽样函数的图像 我画的只是一条直线是怎么回事?
怎样用MATLAB拟合两个自变量的函数系数和指数?
为什么我用matlab画出来的图是这样的,我需要的是一条上升的曲线.
用matlab拟合 对数函数的问题
为什么Matlab画出的是直线
为什么我用MATLAB多项式拟合得到的函数,再用函数去作图时两者的曲线会不一样呢?
matlab的拟合问题
matlab拟合多元函数问题
用matlab拟合指数形式的曲线
PS画直线问题、为什么我用Shift画出来的不是直线.、.是射线.是哪没设置对么?
SPSS拟合函数我用spss回归分析,拟合一个函数,选的是平方,谁能帮我看看,Model Summary and Par