来源:https://ww2.mathworks.cn/help/matlab/ref/polyfit.html?searchHighlight=polyfit&s_tid=doc_srchtitle#bue6sxq-1-n

polyfit

多项式曲线拟合

全页折叠
 

说明

示例

p = polyfit(x,y,n) 返回次数为 n 的多项式 p(x) 的系数,该阶数是 y 中数据的最佳拟合(在最小二乘方式中)。p 中的系数按降幂排列,p 的长度为 n+1

p(x)=p1xn+p2xn−1+...+pnx+pn+1.

[p,S] = polyfit(x,y,n) 还返回一个结构体 S,后者可用作 polyval 的输入来获取误差估计值。

示例

[p,S,mu] = polyfit(x,y,n) 还返回 mu,后者是一个二元素向量,包含中心化值和缩放值。mu(1)mean(x)mu(2)std(x)。使用这些值时,polyfitx 的中心置于零值处并缩放为具有单位标准差

ˆx=x−‾xσx .

这种中心化和缩放变换可同时改善多项式和拟合算法的数值属性。

 

示例

全部折叠

将多项式与三角函数拟合

尝试此示例

View MATLAB Command

在区间 [0,4*pi] 中沿正弦曲线生成 10 个等间距的点。

x = linspace(0,4*pi,10);
y = sin(x);

使用 polyfit 将一个 7 次多项式与这些点拟合。

p = polyfit(x,y,7);

在更精细的网格上计算多项式并绘制结果图。

x1 = linspace(0,4*pi);
y1 = polyval(p,x1);
figure
plot(x,y,'o')
hold on
plot(x1,y1)
hold off

 
 

将多项式与点集拟合

尝试此示例

View MATLAB Command

创建一个由区间 [0,1] 中的 5 个等间距点组成的向量,并计算这些点处的 y(x)=(1+x)−1。

x = linspace(0,1,5);
y = 1./(1+x);

将 4 次多项式与 5 个点拟合。通常,对于 n 个点,可以拟合 n-1 次多项式以便完全通过这些点。

p = polyfit(x,y,4);

在由 0 和 2 之间的点组成的更精细网格上计算原始函数和多项式拟合。

x1 = linspace(0,2);
y1 = 1./(1+x1);
f1 = polyval(p,x1);

在更大的区间 [0,2] 中绘制函数值和多项式拟合,其中包含用于获取以圆形突出显示的多项式拟合的点。多项式拟合在原始 [0,1] 区间中的效果较好,但在该区间外部很快与拟合函数出现差异。

figure
plot(x,y,'o')
hold on
plot(x1,y1)
plot(x1,f1,'r--')
legend('y','y1','f1')

 
 

对误差函数进行多项式拟合

尝试此示例

View MATLAB Command

首先生成 x 点的向量,在区间 [0,2.5] 内等间距分布;然后计算这些点处的 erf(x)

x = (0:0.1:2.5)';
y = erf(x);

确定 6 次逼近多项式的系数。

p = polyfit(x,y,6)
p = 1×7

    0.0084   -0.0983    0.4217   -0.7435    0.1471    1.1064    0.0004

为了查看拟合情况如何,在各数据点处计算多项式,并生成说明数据、拟合和误差的一个表。

f = polyval(p,x);
T = table(x,y,f,y-f,'VariableNames',{'X','Y','Fit','FitError'})
T=26×4 table
X Y Fit FitError
___ _______ __________ ___________ 0 0 0.00044117 -0.00044117
0.1 0.11246 0.11185 0.00060836
0.2 0.2227 0.22231 0.00039189
0.3 0.32863 0.32872 -9.7429e-05
0.4 0.42839 0.4288 -0.00040661
0.5 0.5205 0.52093 -0.00042568
0.6 0.60386 0.60408 -0.00022824
0.7 0.6778 0.67775 4.6383e-05
0.8 0.7421 0.74183 0.00026992
0.9 0.79691 0.79654 0.00036515
1 0.8427 0.84238 0.0003164
1.1 0.88021 0.88005 0.00015948
1.2 0.91031 0.91035 -3.9919e-05
1.3 0.93401 0.93422 -0.000211
1.4 0.95229 0.95258 -0.00029933
1.5 0.96611 0.96639 -0.00028097

在该区间中,插值与实际值非常符合。创建一个绘图,以显示在该区间以外,外插值与实际数据值如何快速偏离。

x1 = (0:0.1:5)';
y1 = erf(x1);
f1 = polyval(p,x1);
figure
plot(x,y,'o')
hold on
plot(x1,y1,'-')
plot(x1,f1,'r--')
axis([0 5 0 2])
hold off

 
 

使用中心化和缩放改善数值属性

尝试此示例

View MATLAB Command

创建一个由 1750 - 2000 年的人口数据组成的表,并绘制数据点。

year = (1750:25:2000)';
pop = 1e6*[791 856 978 1050 1262 1544 1650 2532 6122 8170 11560]';
T = table(year, pop)
T=11×2 table
year pop
____ _________ 1750 7.91e+08
1775 8.56e+08
1800 9.78e+08
1825 1.05e+09
1850 1.262e+09
1875 1.544e+09
1900 1.65e+09
1925 2.532e+09
1950 6.122e+09
1975 8.17e+09
2000 1.156e+10
plot(year,pop,'o')

使用带三个输入的 polyfit 拟合一个使用中心化和缩放的 5 次多项式,这将改善问题的数值属性。polyfityear 中的数据以 0 为进行中心化,并缩放为具有标准差 1,这可避免在拟合计算中出现病态的 Vandermonde 矩阵。

[p,~,mu] = polyfit(T.year, T.pop, 5);

使用带四个输入的 polyval,根据缩放后的年份 (year-mu(1))/mu(2) 计算 p。绘制结果对原始年份的图。

f = polyval(p,year,[],mu);
hold on
plot(year,f)
hold off

 
 

简单线性回归

尝试此示例

View MATLAB Command

将一个简单线性回归模型与一组离散二维数据点拟合。

创建几个由样本数据点 (x,y) 组成的向量。对数据进行一次多项式拟合。

x = 1:50;
y = -0.3*x + 2*randn(1,50);
p = polyfit(x,y,1);

计算在 x 中的点处拟合的多项式 p。用这些数据绘制得到的线性回归模型。

f = polyval(p,x);
plot(x,y,'o',x,f,'-')
legend('data','linear fit')

 
 

具有误差估计值的线性回归

尝试此示例

View MATLAB Command

将一个线性模型拟合到一组数据点并绘制结果,其中包含预测区间为 95% 的估计值。

创建几个由样本数据点 (x,y) 组成的向量。使用 polyfit 对数据进行一次多项式拟合。指定两个输出以返回线性拟合的系数以及误差估计结构体。

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')

 
 

输入参数

全部折叠

x - 查询点
向量

查询点,指定为一个向量。x 中的点对应于 y 中包含的拟合函数值。如果 x 不是向量,则 polyfit 将其转换为列向量 x(:)

x 具有重复(或接近重复)的点或者如果 x 可能需要中心化和缩放时的警告消息结果。

数据类型: single | double
复数支持:

y - 查询点位置的拟合值
向量

查询点位置的拟合值,指定为向量。y 中的值对应于 x 中包含的查询点。如果 y 不是向量,则 polyfit 将其转换为列向量 y(:)

数据类型: single | double
复数支持:

n - 多项式拟合的次数
正整数标量

多项式拟合的次数,指定为正整数标量。n 指定 p 中最左侧系数的多项式幂。

输出参数

全部折叠

p - 最小二乘拟合多项式系数
向量

最小二乘拟合多项式系数,以向量的形式返回。p 的长度为 n+1,包含按降幂排列的多项式系数,最高幂为 n。如果 xy 包含 NaN 值且 n < length(x),则 p 的所有元素均为 NaN

使用 polyval 计算 p 在查询点处的解。

S - 误差估计结构体
结构体

误差估计结构体。此可选输出结构体主要用作 polyval 函数的输入,以获取误差估计值。S 包含以下字段:

字段 说明
R Vandermonde 矩阵 x 的 QR 分解的三角因子
df 自由度
normr 残差的范数

如果 y 中的数据是随机的,则 p 的估计协方差矩阵是 (Rinv*Rinv')*normr^2/df,其中 RinvR 的逆矩阵。

如果 y 中数据的误差呈独立正态分布,并具有常量方差,则 [y,delta] = polyval(...) 可生成至少包含 50% 的预测值的误差边界。即 y ± delta 至少包含 50% 对 x 处的未来观测值的预测值。

mu - 中心化值和缩放值
二元素向量

中心化值和缩放值,以二元素向量形式返回。mu(1)mean(x)mu(2)std(x)。这些值以单位标准差将 x 中的查询点的中心置于零值处。

使用 mu 作为 polyval 的第四个输入以计算 p 在缩放点 (x - mu(1))/mu(2) 处的解。

局限性

  • 在涉及很多点的问题中,使用 polyfit 增加多项式拟合的次数并不总能得到较好的拟合。高次多项式可以在数据点之间振动,导致与数据之间的拟合较差。在这些情况下,可使用低次多项式拟合(点之间倾向于更平滑)或不同的方法,具体取决于该问题。

  • 多项式在本质上是无边界的振荡函数。所以,它们并不非常适合外插有界的数据或单调(递增或递减)的数据。

算法

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

xn1xn2⋮xnmxn−11xn−12⋮xn−1m⋯⋯⋱⋯11⋮1p1p2⋮pn+1=y1y2⋮ym  ,

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

扩展功能

tall 数组
对行数太多而无法放入内存的数组进行计算。

用法说明和限制:

XY 必须为列向量。

有关详细信息,请参阅 tall 数组

C/C++ 代码生成
使用 MATLAB Coder 生成 C 代码和 C++ 代码。

用法说明和限制:

GPU 数组
通过使用 Parallel Computing Toolbox 在图形处理单元 (GPU) 上运行来加快代码执行。

matlab中polyfit的更多相关文章

  1. Matlab——plot polyfit polyval

    p=polyfit(x,y,m) 其中, x, y为已知数据点向量, 分别表示横,纵坐标, m为拟合多项式的次数, 结果返回m次拟合多项式系数, 从高次到低次存放在向量p中. y0=polyval(p ...

  2. matlab中help所有函数功能的英文翻译

    doc funname 在帮助浏览器中打开帮助文档 help funname 在命令窗口打开帮助文档 helpbrowser 直接打开帮助浏览器 lookfor funname 搜索某个关键字相关函数 ...

  3. matlab中 注意事项--字符串

    Matlab中的字符串操作 原文链接:http://hi.baidu.com/dreamflyman/item/bd6d8224430003c9a5275a9f (1).字符串是以ASCII码形式存储 ...

  4. MATLAB中拟合算法刚入门

    %%%1.拟合问题:(做预测,主要使用的范围是样本比较小,拟合效果会好,样本比较多,拟合的效果就不是很好) 1.应用预测的场景:已经知道10年的样本,预测第11年以内的数据 2.用拟合的到关系式:样本 ...

  5. MATLAB中插值算法实现

    %%%1.M文件%(1).以往少的程序可以在命令行窗口进行编码,但大量的程序编排到命令行窗口,%会有造成乱码的危险.(2).如果将命令编成程序存储在一个文件中(M文件),依次运行文件中的命令,则可以重 ...

  6. MATLAB中绘制质点轨迹动图并保存成GIF

    工作需要在MATLAB中绘制质点轨迹并保存成GIF以便展示. 绘制质点轨迹动图可用comet和comet3命令,使用例子如下: t = 0:.01:2*pi;x = cos(2*t).*(cos(t) ...

  7. matlab 中 eps 的分析

    eps(a)是|a|与大于|a|的最小的浮点数之间的距离,距离越小表示精度越高.默认a=1: 这里直接在matlab中输入:eps == eps(1)(true). 我们知道浮点数其实是离散的,有限的 ...

  8. matlab中patch函数的用法

    http://blog.sina.com.cn/s/blog_707b64550100z1nz.html matlab中patch函数的用法——emily (2011-11-18 17:20:33) ...

  9. paper 121 :matlab中imresize函数

    转自:http://www.cnblogs.com/rong86/p/3558344.html matlab中函数imresize简介: 函数功能:该函数用于对图像做缩放处理. 调用格式: B = i ...

随机推荐

  1. 基于Log4Net记录日志到SQLServer(自定义字段)

    本文记录通过log4net将日志信息记录到SQLServer数据库中. 1.新建控制台应用程序 Log4NetDemo: 2.通过NuGet安装Log4Net (项目版本2.0.8): 3.项目根目录 ...

  2. Photon Server伺服务器在LoadBalancing的基础上扩展登陆服务

    一,如何创建一个Photon Server服务 参见此博客 快速了解和使用Photon Server 二, 让LoadBalancing与自己的服务一起启动 原Photonserver.config文 ...

  3. 如何配置node环境变量

    1,安装node.js   最后安装的目录在 检测node安装成功   node -v 如果报错   没有默认装在c盘  pro 需要配置环境变量 Npm   node  package  manag ...

  4. Johnson全源最短路

    例题:P5905 [模板]Johnson 全源最短路 首先考虑求全源最短路的几种方法: Floyd:时间复杂度\(O(n^3)\),可以处理负权边,但不能处理负环,而且速度很慢. Bellman-Fo ...

  5. rank,dense_rank和row_number函数区别

    我对技术一般抱有够用就好的态度,一般在网上或者书上找了贴合的解决方案,放到实际中发现好用就行了,不再深究,等出了问题再说. 因此,我对Oracle中中形成有效序列的方法集中在rownum,row_nu ...

  6. GuestOS? HostOS?

    起因 今天在网上看到一篇文章  有几个陌生的关键词不太熟悉,就随笔记一下. 名词解释 # OS :操作系统 # VM(虚拟机)    里的OS 称为        GuestOS # 物理机      ...

  7. python基础:用yagmail模块发邮件

    一.yagmail模块安装 网上下载的yagmail模块安装以后,在使用过程中,如果附件有中文,会显示乱码. pip install yagmail-0.10.212-py2.py3-none-any ...

  8. SpringBoot版不需要配置文件注解获取当前登录用户

    本文讯(2019年3月30日 飞快的蜗牛博客)   我是一个懒人,很久不写博客,想起来看到也不一定会写,只有心血来潮的时候写写,"钱塘江上潮信来,今日方知我是我"...... 空杯 ...

  9. docker下部署jira破解版

    1. 制作Docker破解容器 在/opt/jira下新建一个Dockerfile文件 touch Dockerfile 编辑Dockerfile文件 vim Dockerfile FROM cpta ...

  10. oracle之二数据字典表和动态性能视图

    数据字典表和动态性能视图 Oracle提供了大量的内部表,它们记录了数据库对象的更改和修正.可以将这些内部表划分为两种主要类型:静态的数据字典表和动态的性能表.这些内部表是由oracle维护的,可以说 ...