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多项式拟合体会)