求教MATLAB指数拟合问题:指数拟合y=a(exp(bx)-1),要求精度高一些,画出原始数据和拟合曲线的重合情况。 100
拟合问题和很多因素有关,包括拟合函数的形式、优化算法、初值等。
对于楼主给的数据而言,指数函数似乎并非一个好的选择。从下图可以看到,四次多项式拟合的效果要比指数拟合效果好很多。事实上,即使用二次多项式(抛物线)拟合,也比指数拟合的效果要好。所以,建议楼主重新考虑一下拟合函数的形式,如果允许,可尝试采用多项式拟合。
参考代码
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)
你好,这是我的解答,希望对你有帮助,哪里有疑问请追问,若满意还望采纳,祝生活愉快!
代码:
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
精度能不能再高些?
这个要用非线性拟合,我尝试了一些这个函数的优化设置,但效果没有提升,好像只能拟合到这个精度了,你试试吧:
% 建立一个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 );
这精度达不到要求啊
那我暂时也没有别的办法了
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下运行通过的。
至于精度问题,只能归结于题主提供的模型不够精确。请修改模型。