kirin 发表于 2011-11-13 23:14:30

我做的多项式拟合--附例

数据拟合在excel中原本很简单的事,我在excel中做一个多项式拟合,并通过趋势线得到拟合公式。

等把公式的系数代入检验,却发现相差甚远,估计是小数点后面截掉了,精度不够,但又不知 excel如何设置系数的精度......

于是就自己编了个多项式拟合程序,通过“长精度”(format long)数据格式,把系数的小数点后面的数字都显示出来,就解决了问题。

关键就是一个polyfit(x,y,N)吧。—— 贡献出来,以供有类似问题的朋友分享!

待拟合的原数据:
x y
0.1 0.9
49.49990 21.0372
105.4909 30.3963
187.3109 37.18
324.7398 43.4373
456.8755 46.5135
650.8909 48.8286
846.3265 50

% 多项式拟合(曲线)
clear;clc
N=4;% N-幂次...需修改!
n=8;% n-数据个数(行数)...需修改!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 从文件读入x、y
fid=fopen('polyfit_data.txt','r');
S=fscanf(fid,'%g',); %从文件读入数据
fclose(fid);
x=S(1,:); y=S(2,:);
format long
p=polyfit(x,y,N)% 计算N阶多项式的系数
%%%%%%%%%%%%%%%%%%%以下求相关系数%%%%%%%%%%%%%%%%%%
% 计算拟合值y1(1:n)
for i=1:n
y1(i)=p(1)*x(i)^4+p(2)*x(i)^3+p(3)*x(i)^2+p(4)*x(i)+p(5);
end
% 求相关系数R^2
y_m=mean(y);
S_all=0;
S_fit=0;
for i=1:n
    S_all=S_all+(y(i)-y_m)^2;
    S_fit=S_fit+(y1(i)-y_m)^2;
end
format short
R_2=S_fit/S_all   %计算相关系数

伤痕累累 发表于 2011-11-14 14:57:51

灰常感谢

nwcwww 发表于 2011-11-14 21:43:39

如果已知x, y而且目的单纯是拟合的话直接cftool最省事。具体到楼主这组数据,用二项指数a*exp(b*x)+c*exp(d*x)来拟合应该会更好。
页: [1]
查看完整版本: 我做的多项式拟合--附例