首页 > 代码库 > Matlab实例学习------多项式和非多项式曲线拟合(实例)

Matlab实例学习------多项式和非多项式曲线拟合(实例)


具体实例:(多项式和非多项式,附带程序注释)

% 曲线拟合

%% 多项式曲线拟合
x=-pi:0.1:pi;
y=sin(x);
plot(x,y);%原始曲线

p0=polyfit(x,y,4);%绘制4阶拟合曲线  返回多项式的系数向量

y1=polyval(p0,x);%多项式求值
% The polynomial  is evaluated at x =5, 7, and 9 with
% p = [3 2 1];
% polyval(p,[5 7 9])
% 
% which results in
% ans =
%     86   162   262

plot(x,y,x,y1,'r');  %绘制原始图形和拟合图形
poly2sym(p0)%将多项式打印出来
%结果:
% ans =
%  
% - (2504756088051987*x^4)/2305843009213693952 - (3360678413491453*x^3)/36028797018963968 + (2066488371929293*x^2)/288230376151711744 + (7714426024601503*x)/9007199254740992 - 2922386864273423/576460752303423488

%% 多项式拟合正弦函数曲线
% 原始数据点
x0 = -pi:0.1:pi;
y0 = sin(x0);
% 4次多项式拟合
p0 = polyfit(x0, y0, 4);
y1 = polyval(p0, x0);
plot(x0, y0, x0, y1, 'r');

%% 多项式拟合效果
% 阶次越高,并不一定拟合效果越好
x1 = -1:0.2:1;
y1 = 1./(1 + 25*x1.^2);
% 分别使用3次、5次、8次多项式拟合
p3 = polyfit(x1, y1, 3);
p5 = polyfit(x1, y1, 5);
p8 = polyfit(x1, y1, 8);

x  = -1:0.01:1;
y  = 1./(1 + 25*x.^2);
y3 = polyval(p3, x);
y5 = polyval(p5, x);
y8 = polyval(p8, x);
figure
plot(x, y, x, y3, 'r-', x, y5, 'm:', x, y8, 'b--');
legend('原始', '3次', '5次', '8次');

%% 使用非多项式拟合方法
x  = -1:0.01:1;
y  = 1./(1 + 25*x.^2);
% 首先建立拟合选项结构体
options = fitoptions('Method', 'NonlinearLeastSquare');
options.Lower = [-Inf, -Inf, -Inf];%设置a,b,c三个参数的最大值和最小值范围
options.Upper = [Inf, Inf, Inf];
% 通过fittype建立非线性拟合模型
type    = fittype('a/(b + c*x^n)', 'problem', 'n', 'options', options);
%参数介绍
% a/(b + c*x^n)为模型,本例中要拟合的是:1/(1+25*x^2)
% 'problem', 'n'指定了n不是系数并且n的值是可变的
% 'optoins',指定fitoptions
% 返回值:
% g = fittype('a*cosh((x-x0)/a)+y0')
% 
% g = 
%      General model:
%      g(a,x0,y0,x) = a*cosh((x-x0)/a)+y0

% 拟合
[cfun gof] = fit(x', y', type, 'problem', 2);
% 注意:要使用列向量,由于模型中规定了problem,所以要给n一个具体的值
% 返回值:
% cfun表示拟合的函数,包含模型,系数,n的值等各种信息
% gof表示拟合的好坏

% 拟合效果
ynp = feval(cfun, x);%根据fit返回的cfun和x的值得到x对应的y值,用来绘制曲线
figure
hl = plot(x, y, 'k');%绘制原来的曲线
set(hl, 'LineWidth', 10);%设置曲线的宽度,方便进行比较
hold on  %保持当前的图像,并且将新的图像添加到当前图像中
plot(x, ynp, 'r');%绘制使用非多项式拟合后的图像
legend('原来的曲线','使用非多项式拟合的曲线');

实验结果:(多项式拟合正弦函数曲线和非多项式拟合实例结果)



Matlab实例学习------多项式和非多项式曲线拟合(实例)