具体实例:(多项式和非多项式,附带程序注释)
% 曲线拟合 %% 多项式曲线拟合 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('原来的曲线','使用非多项式拟合的曲线');
实验结果:(多项式拟合正弦函数曲线和非多项式拟合实例结果)
时间: 2024-10-05 13:09:16