求教MATLAB指数拟合问题:指数拟合y=a(exp(bx)-1),要求精度高一些,画出原始数据和拟合曲线的重合情况。 100

x=[2.02.12.22.32.42.52.62.72.82.93.03.13.23.33.43.53.63.73.83.94.04.14.24.34.44.54.64... x=[2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 ],y=[5.7932E-9 12.2956E-9 34.9388E-9 134.7271E-9 641.1419E-9 3.9656E-6 31.2668E-6 157.8480E-6 412.3921E-6 783.3082E-6 1.2699E-3 1.9087E-3 2.7278E-3 3.7540E-3 5.0654E-3 6.5450E-3 8.2685E-3 10.2270E-3 12.4299E-3 14.8553E-3 17.4864E-3 20.3293E-3 23.3594E-3 26.5548E-3 29.9253E-3 33.4524E-3 37.1170E-3 40.9220E-3 44.8524E-3 48.8980E-3 53.0623E-3] 展开
 我来答
tianxiawulang
2014-04-29 · TA获得超过2.7万个赞
知道大有可为答主
回答量:4732
采纳率:89%
帮助的人:2607万
展开全部

拟合问题和很多因素有关,包括拟合函数的形式、优化算法、初值等。

 

对于楼主给的数据而言,指数函数似乎并非一个好的选择。从下图可以看到,四次多项式拟合的效果要比指数拟合效果好很多。事实上,即使用二次多项式(抛物线)拟合,也比指数拟合的效果要好。所以,建议楼主重新考虑一下拟合函数的形式,如果允许,可尝试采用多项式拟合。

 

参考代码

x=[2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 ];
y=[5.7932E-9 12.2956E-9 34.9388E-9 134.7271E-9 641.1419E-9 3.9656E-6 31.2668E-6 157.8480E-6 412.3921E-6 783.3082E-6 1.2699E-3 1.9087E-3 2.7278E-3 3.7540E-3 5.0654E-3 6.5450E-3 8.2685E-3 10.2270E-3 12.4299E-3 14.8553E-3 17.4864E-3 20.3293E-3 23.3594E-3 26.5548E-3 29.9253E-3 33.4524E-3 37.1170E-3 40.9220E-3 44.8524E-3 48.8980E-3 53.0623E-3];
f = @(c,x) c(1)*(exp(c(2)*x)-1);
x0 = [1 1];
c=lsqcurvefit(f,x0,x,y)
y1 = f(c,x);
p = polyfit(x,y,4);
y2 = polyval(p,x);
plot(x,y,'ro',x,y1,'.-',x,y2,'-x')
r1 = norm(y-y1);
r2 = norm(y-y2);
legend('原始数据', ['指数拟合, 残差范数=' num2str(r1)],['4次多项式拟合,残差范数=' num2str(r2)],2)

shake075618
2014-04-29 · TA获得超过289个赞
知道小有建树答主
回答量:200
采纳率:100%
帮助的人:217万
展开全部

你好,这是我的解答,希望对你有帮助,哪里有疑问请追问,若满意还望采纳,祝生活愉快!

代码:

clear;clc

syms K1 K2; 

x=[2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 ];

 y=[5.7932E-9 12.2956E-9 34.9388E-9 134.7271E-9 641.1419E-9 3.9656E-6 31.2668E-6 157.8480E-6 412.3921E-6 783.3082E-6 1.2699E-3...

     1.9087E-3 2.7278E-3 3.7540E-3 5.0654E-3 6.5450E-3 8.2685E-3 10.2270E-3 12.4299E-3 14.8553E-3 17.4864E-3 20.3293E-3...

     23.3594E-3 26.5548E-3 29.9253E-3 33.4524E-3 37.1170E-3 40.9220E-3 44.8524E-3 48.8980E-3 53.0623E-3];

fun=inline('a(1).*(exp(a(2).*x)-1)','a','x');%输入函数表达式

a=lsqcurvefit(fun,[0.01 1],x,y)%拟合,并给定初始值

plot(x,y,'r')

hold on 

grid on

z=a(1).*(exp(a(2).*x)-1);

plot(x,z,'b')

legend('红色原来数据曲线','蓝色拟合数据曲线')

输出结果:

a =


    0.0001    1.2818

即a=a(1)=0.0001,b=a(2)=1.2818

追问
精度能不能再高些?
追答

你好,我也尝试把表达式中a(exp(bx)-1)的1作为变量c进行模拟,中间两行的代码就变为

fun=inline('a(1)*(exp(a(2)*x)-a(3))','a','x');%输入函数表达式

a=lsqcurvefit(fun,[0.0001 1.2818 1],x,y)%拟合,并给定初始值

但是结果还不如之前的结果,输出结果是:

a =


    0.0004    1.0034   13.3923



接着直接把1尝试改成其他数,如2,3,正负的改,也很难找到十分靠近的曲线。也许这是拟合的固有问题吧,其他其他高手能解决你的疑惑!

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友1c6e06f
2014-04-29 · TA获得超过2894个赞
知道小有建树答主
回答量:695
采纳率:66%
帮助的人:653万
展开全部

这个要用非线性拟合,我尝试了一些这个函数的优化设置,但效果没有提升,好像只能拟合到这个精度了,你试试吧:

% 建立一个shiyan1.m文件,运行以下代码

function shiyan1
close all;

x=[2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 ];
y=[5.7932E-9 12.2956E-9 34.9388E-9 134.7271E-9 641.1419E-9 3.9656E-6 31.2668E-6 157.8480E-6 412.3921E-6 783.3082E-6 1.2699E-3 1.9087E-3 2.7278E-3 3.7540E-3 5.0654E-3 6.5450E-3 8.2685E-3 10.2270E-3 12.4299E-3 14.8553E-3 17.4864E-3 20.3293E-3 23.3594E-3 26.5548E-3 29.9253E-3 33.4524E-3 37.1170E-3 40.9220E-3 44.8524E-3 48.8980E-3 53.0623E-3] ;

a0 = [ 1, 1 ];% 随便给个初值
[ a, resnorm ] = lsqcurvefit( @subfun, a0, x, y )

yy = a( 1 ) * ( exp( a( 2 ) * x ) - 1 );

figure( 1 );
plot( x, y, 'r*' );
hold on;
plot( x, yy, 'b-' );

legend( '原始数据', '拟合曲线' );


function y = subfun( a, x )
y = a( 1 ) * ( exp( a( 2 ) * x ) - 1 );


追问
这精度达不到要求啊
追答
那我暂时也没有别的办法了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
WM_THU
2014-04-29 · TA获得超过7164个赞
知道大有可为答主
回答量:4285
采纳率:80%
帮助的人:3901万
展开全部
% 原始数据
x=[2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 ];;
y=[5.7932E-9 12.2956E-9 34.9388E-9 134.7271E-9 641.1419E-9 3.9656E-6 31.2668E-6 157.8480E-6 412.3921E-6 783.3082E-6 1.2699E-3 1.9087E-3 2.7278E-3 3.7540E-3 5.0654E-3 6.5450E-3 8.2685E-3 10.2270E-3 12.4299E-3 14.8553E-3 17.4864E-3 20.3293E-3 23.3594E-3 26.5548E-3 29.9253E-3 33.4524E-3 37.1170E-3 40.9220E-3 44.8524E-3 48.8980E-3 53.0623E-3];
x = x(:);
y = y(:);
% 拟合函数
ff = @(a,b,x) a*(exp(b*x)-1);
typ = fittype(ff);
% Curve Fit方法
[fitobject,gof] = fit(x, y, typ, 'StartPoint', [1 2]);
ci = coeffvalues(fitobject); % 拟合得到的系数
% 画结果
fydata = ff(ci(1),ci(2), x);
plot(x, y, 'o', x, fydata, 'r');
追问
出错了是什么原因呢?
追答

题主不说出错原因和行数我也不知道原因。

这样,我把源码的m文件附上,我在matlab2013b下运行通过的。

至于精度问题,只能归结于题主提供的模型不够精确。请修改模型。


已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式