欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

3月24 matlab函数polyfit(x,y,n)分析

程序员文章站 2022-04-06 23:34:40
...
yB_L1 = polyfit(y_L1_Pt(:,1),y_L1_Pt(:,2),3);  %%使用最小二乘法对后向车道线方程进行拟合

p=polyfit(x,y,n):最小二乘法计算拟合多项式系数。x,y为拟合数据向量,要求维度相同,n为拟合多项式次数。返回p向量保存多项式系数,由最高次向最低次排列。
y=polyval(p,x):计算多项式的函数值。返回在x处多项式的值,p为多项式系数,元素按多项式降幂排序。

http://www.ece.northwestern.edu/local-apps/matlabhelp/techdoc/ref/polyfit.html

3月24 matlab函数polyfit(x,y,n)分析

官方解法

https://ww2.mathworks.cn/help/matlab/ref/polyfit.html

  • 使用中心化和缩放改善数值属性
[p,~,mu] = polyfit(T.year, T.pop, 5);
f = polyval(p,year,[],mu);
  • 具有误差估计值的线性回归,将一个线性模型拟合到一组数据点并绘制结果,其中包含预测区间为 95% 的估计值。
x = 1:100; 
y = -0.3*x + 2*randn(1,100); 
[p,S] = polyfit(x,y,1); 
%计算以 p 为系数的一次多项式在 x 中各点处的拟合值。将误差估计结构体指定为第三个输入,以便 polyval 计算标准误差的估计值。标准误差估计值在 delta 中返回。

[y_fit,delta] = polyval(p,x,S);
%绘制原始数据、线性拟合和 95% 预测区间 y±2Δ。

plot(x,y,'bo')
hold on
plot(x,y_fit,'r-')
plot(x,y_fit+2*delta,'m--',x,y_fit-2*delta,'m--')
title('Linear Fit of Data with 95% Prediction Interval')
legend('Data','Linear Fit','95% Prediction Interval')

3月24 matlab函数polyfit(x,y,n)分析

算法

polyfit 使用 x 构造具有 n+1 列和 m = length(x) 行的 Vandermonde (范德蒙德(Vandermonde)方阵)矩阵 V 并生成线性方程组

3月24 matlab函数polyfit(x,y,n)分析

其中 polyfit 使用 p = V\y 求解。由于 Vandermonde 矩阵中的列是向量 x 的幂,因此条件数 V 对于高阶拟合来说通常较大,生成一个奇异系数矩阵。在这些情况下,中心化和缩放可改善系统的数值属性以产生更可靠的拟合。

浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理

https://www.cnblogs.com/gzy-cjoier/p/9741950.html

polyfit是线性拟合而lsqcurvefit 是非线性拟合

https://www.ilovematlab.cn/forum.php?mod=viewthread&tid=262388

%g = fittype('a*x.^2+b*x+c','independent', 'x') 
%fy=fit(x,y,g)

function f=conf(a,x)
f=a(1)*x.^2+a(2)*x+a(3)

xev=lsqcurvefit(@conf,[0 0 0],x,y);

lsqcurvefit 和 polyfit的拟合算法不一样,拟合出的结果当然有可能不一样。

首先,lsqcurvefit 使用的是非线性最小二乘算法,本质上利用的是内部映射牛顿法来迭代搜索(见lsqcurvefit help文档里的算法部分),所以,它不是一次性算出来的多项式系数,而是多次数值迭代找到一个最小二乘意义上的解。另外,它的拟合结果还可能跟拟合时设定的初值有关,初值给得不好,结果也可能不一样。

其次,polyfit 可以看作线性最小二乘法拟合,因为polyfit函数算法描述部分是将x的不同次数构造范德蒙矩阵,然后用矩阵左除求出多项式系数(见help文档的算法部分),这是非常典型的线性最小二乘算法。它是一次性算出系数,无需任何迭代。所以,结果是确定性的(不依赖任何初值的设定),即只要输入数据相同,必然得到相同的拟合系数

至于 fit 函数,help 里没有对其算法原理有详细说明,不过可以看出,它支持很多种拟合算法,有自定义的函数,也有特定的参数,如:‘poly2’。这里poly2就是二次多项式拟合。你可以试试poly2,再看看跟polyfit有什么区别

函数性能

function dpolydengyaxuanzexing(n)
clc;
x=[238,258,278,298,318,338,358];
y1=[2.409,4.219,5.553,9.241,23.425,23.75,25.142];
y2=[3.060,5.270,9.421,13.423,25.909,31.125,31.833];
y3=[3.393,5.452,9.077,11.5,25.454,29.315,29.333];
y4=[3.803,5.381,7.078,9.667,25.3,28.5,28.666];
plot(x,y1,'gx')
hold on
plot(x,y2,'b*')
hold on
plot(x,y3,'r+')
hold on
plot(x,y4,'mo')
xlabel('temperature(K)');ylabel('adsorption capacity(mmol/g)');
p1=polyfit(x,y1,n);
p2=polyfit(x,y2,n);
p3=polyfit(x,y3,n);
p4=polyfit(x,y4,n);
y1=polyval(p1,x);
y2=polyval(p2,x);
y3=polyval(p3,x);
y4=polyval(p4,x);
plot(x,y1,'g-');
hold on
plot(x,y2,'b-')
hold on
plot(x,y3,'r-')
hold on
plot(x,y4,'m-')
legend('100kpa in MCM-41 without APTS','100kpa in MCM-41 with 15APTS',...
    '100kpa in MCM-41 with 30APTS','100kpa in MCM-41 with 45APTS');
hold off
end

可以分别试试 interp1 spline csaps spap2 spaps 等函数
http://muchong.com/html/201011/2644558_2.html

function dpolydengyaxuanzexing
clc;
x=[238,258,278,298,318,338,358];
y1=[2.409,4.219,5.553,9.241,23.425,23.75,25.142];
y2=[3.060,5.270,9.421,13.423,25.909,31.125,31.833];
y3=[3.393,5.452,9.077,11.5,25.454,29.315,29.333];
y4=[3.803,5.381,7.078,9.667,25.3,28.5,28.666];
plot(x,y1,'gx')
hold on
plot(x,y2,'b*')
hold on
plot(x,y3,'r+')
hold on
plot(x,y4,'mo')
xlabel('temperature(K)');ylabel('adsorption capacity(mmol/g)');
yy1=fit(x',y1','smoothingspline');
yy2=fit(x',y2','smoothingspline');
yy3=fit(x',y3','smoothingspline');
yy4=fit(x',y4','smoothingspline');
plot(yy1,'g-');
hold on
plot(yy2,'b-')
hold on
plot(yy3,'r-')
hold on
plot(yy4,'m-')
legend('100kpa in MCM-41 without APTS','100kpa in MCM-41 with 15APTS',...
    '100kpa in MCM-41 with 30APTS','100kpa in MCM-41 with 45APTS');
hold off
end

Year=[1625 1830 1930 1960 1974 1987 1999];
Population=[5 10 20 30 40 50 60];
Year1=1625:2020;
Year2=2000:2020;
[P2 S2]=polyfit(Year,Population,3);
Population1=polyval(P2,Year1);
Population2=polyval(P2,Year2);
plot(Year,Population,'*',Year2,Population2,'X',Year1,Population1);
%这里的S2是误差的大小~
相关标签: 优化