MATLAB数值分析学习笔记:多项式拟合

Matlab曲线拟合(3)(自用笔记) matlab曲线拟合(3):lsqcurvefit函数 阅读详情

在很多情况下,我们需要估计精确值之间的可能取值,常用的方法是多项式插值法。多项式插值法的原理是n个数据点可以确定n-1次多项式:例如三点确定一条抛物线。

工程上常用的多项式插值的方法有两种:牛顿插值法和拉格朗日插值法。

牛顿插值法

牛顿插值多项式的一般形式如下

f_{n-1}(x)=b_{1}+b_{2}(x-x_{1})+\cdot \cdot \cdot +b_{n}(x-x_{1})(x-x_{2})\cdot \cdot \cdot (x-x_{n-1})

从常系数到高阶过渡地求出系数bn,可以得到如下结果:

b_{1}=f(x_{1})

b_{2}=f[x_{2},x_{1}]

b_{3}=f[x_{3},x_{2},x_{1}]

\cdot \cdot \cdot

b_{n}=f[x_{n},\cdot \cdot \cdot ,x_{2},x_{1}]

其中方括号代表有限均差。例如

 f[x_{i},x_{j}]=\tfrac{f[x_{i}]-f[x_{j}]}{x_{i}-x_{j}}

f[x_{i},x_{j},x_{k}]=\tfrac{f[x_{i},x_{j}]-f[x_{j},x_{k}]}{x_{i}-x_{k}}

均差表

 代码实现

function yint = Newtint(x,y,xx)
%Newtint: Newton interpolating polynomial
%% 说明:使用n-1次多项式来进行插值
%
%输入:
% x=自变量
% y=因变量
% xx=需要被计算的自变量
% 输出:
%yint=需要计算的自变量对应的因变量值(插值多项式中)
%% 牛顿插值法计算多项式系数
n=length(x);
if length(y)~=n, error("自变量和因变量数组长度必须相同"); end 
b=zeros(n,n);
b(:,1)=y(:);
for j=2:n
    for i=1:n-j-1
        b(i,j)=(b(i+1,j-1)-b(i,j-1))/(x(i+j-1)-x(i)); %反复计算有限均差,得到系数
    end
end
xt=1;
%% 计算xx的因变量
yint=b(1,1);
for j=1:n-1
    xt=xt.*(xx-x(j));
    yint=yint+b(1,j+1)*xt;
end

 问题求解

例:作出下面测试数据的牛顿插值多项式图像,与原数据点放在一张图上并作比较

测试数据
x01.8568.29.212
y2616.4155.33.52.0152.548

解:

x=[0 1.8 5 6 8.2 9.2 12];
y=[26 16.415 5.3 3.5 2.015 2.54 8]
xx=0:0.1:12;
yy = Newtint(x,y,xx)
plot(x,y,'o')
hold on
plot(xx,yy)

得到图像如下,发现x=12处估计误差较大 

 拉格朗日插值法

将线性插值多项式看成由直线相连两个点的加权平均,则可以写为

f(x)=L_{1}f(x_{1})+L_{2}f(x_{2})

第一个加权系数可以是x1出等于1、在x2出等于0的直线:

L_{1}=\tfrac{x-x_{2}}{x_{1}-x_{2}}

同理,第二个系数为

L_{2}=\tfrac{x-x_{1}}{x_{2}-x_{1}}

以此类推,可以得到拉格朗日插值多项式的一般形式:

f_{n-1}(x)=\sum_{i=1}^{n}L_{i}(x)f(x_{i})

其中拉格朗日系数为

L_{i}(x)=\prod_{j=1,j\neq i}^{n}\tfrac{x-x_{j}}{x_{i}-x_{j}}

代码实现

function yint = Lagrangeint(x,y,xx)
%Lagrangeint: Lagrange interpolating polynomial
%% 说明:使用n-1次多项式来进行插值
%
%输入:
% x=自变量
% y=因变量
% xx=需要被计算的自变量
% 输出:
%yint=需要计算的自变量对应的因变量值(插值多项式中)
%% 拉格朗日插值法计算多项式系数
n=length(x);
if length(y)~=n, error("自变量和因变量数组长度必须相同"); end 
s=0;
for i=1:n
    product = y(i);
    for j=1:n
        if i~=j
            product = product.*(xx-x(j))/(x(i)-x(j));
        end
    end
    s=s+product;
yint=s;   
end

 上例求解

x=[0 1.8 5 6 8.2 9.2 12];
y=[26 16.415 5.3 3.5 2.015 2.54 8]
xx=0:0.1:13;
yy = Lagrangeint(x,y,xx)
plot(x,y,'o')
hold on
plot(xx,yy)

 内置函数

MATLAB中用于多项式插值的函数主要有polyfit和polyval

其中polyfit用于实现多项式回归,具体语法如下

p = polyfit(x,y,n)
[p,S] = polyfit(x,y,n)
[p,S,mu] = polyfit(x,y,n)

polyval用于多项式插值

y = polyval(p,x)
[y,delta] = polyval(p,x,S)
y = polyval(p,x,[],mu)
[y,delta] = polyval(p,x,S,mu)

应用起来很简单,用上例举例

测试数据
x01.8568.29.212
y2616.4155.33.52.0152.548
x=[0 1.8 5 6 8.2 9.2 12];
y=[26 16.415 5.3 3.5 2.015 2.54 8];
xx=0:0.1:12
p=polyfit(x,y,4);
yy=polyval(p,xx);
plot(x,y,'o')
hold on
plot(xx,yy)

Remark: 

  •  横坐标不等距通常会引起多项式插值的振荡
  • 高次多项式插值的风险(Runge函数)

f(x)=\tfrac{1}{1+25x^{2}} 

        对于下面的Runge函数,发现随着多项式次数增加。插值多项式与原曲线误差越来越大,下面分别取5个和11个点,进行4次和10次多项式拟合

x1=linspace(-1,1,5);%四次插值
y1=1./(1+25*x1.^2);
x2=linspace(-1,1,11);%十次插值
y2=1./(1+25*x2.^2);

xx=linspace(-1,1);
yi=1./(1+25*xx.^2);
p1=polyfit(x1,y1,4);%四次插值
y_1=polyval(p1,xx);
p2=polyfit(x2,y2,10);%十次插值
y_2=polyval(p2,xx);
pl1=plot(x1,y1,'o',xx,y_1,'b',xx,yi,'--',xx,y_2)
hold on 
pl2=plot(x2,y2,'*',xx,y_2,'k')
legend([pl1(3),pl1(2),pl2(2)],{'原始曲线','四次插值','十次插值'})

 可以发现,多项式插值不是次数越高越好,边缘可能会出现振荡。

声明:文章来源于笔者学习【美】Steven C. CHapra所著,林赐译 《工程与科学数值方法的MATLAB实现》(第4版)的笔记,如有谬误或想深入了解,请翻阅原书。

数值分析——牛顿插值多项式 在之前的文章中简单介绍了线性插值、抛物线插值、拉格朗日插值,以上的插值方法推导简单、公式结构紧凑是许多曲线拟合的首选方式。但是如果遇到增减插值点的情况时,需要全部进行重新计算。为了计算的方便,逐次生成插值多项式的插值函数——牛顿插值多项式便应运而生。 阅读详情

相关推荐

MATLAB曲面拟合

基于最小二乘法的曲面拟合 a=2;b=2;c=-5;d=2;e=6;f=7;; %系数 n=1:0.2:20; x=repmat(n,96,1); y=repmat(n',1,96); z=a*x.^2+b*y.^2+c*x.*y+d*x+e*y +f; %原始模型 surf(x,y,z) N=100; ind=int8...

s0302017的博客 4139

matlab拟合多自变量函数,多个自变量的函数拟合问题

有七组数据(1,50):x=[ 13.4171 5.652496 7.560203 7.005844 11.98577 7.746066 10.69772 8.115705 14.04746 10.89177 8.992618 13.90936 6.104227 11.04632 5.09778 14.52481 5.335827 13.0791 14.87349 14.3976 11.20755...

weixin_30489285的博客 1万+

数值分析matlab学习第一课---Matlab拟合曲线

一、(1)已知数据如下:x 1.0 1.4 1.8 2.2 2.6 y 0.931 0.473 0.297 0.224 0.168 求形如拟合函数。解:y1=polyfit(x,y,N)函数的说明:这里函数polyfit第一个参数传递的是拟合数据的自变量,第二个参数是因变量,第三个参数是拟合多项式的阶数,这个由我们给定。如下图。我们可以给定不同的N,运用不同的多项式进行拟合。多...

UE4小白 2274

matlab复杂函数多元函数拟合

本文介绍了一个具有3个变量,14个参数的复杂多元函数的拟合实现,通过matlab的lsqnonlin方法实现,并分享了一些拟合的技巧心得。中间过程的脚本和数据,以及心得技巧在此分享给有需要的人,共勉链接:https://pan.baidu.com/s/1JO2DFQ5b1AP0GGtFErn19w?pwd=ptty提取码:ptty。

xiyangxiaoguo的博客 2万+

Matlab:多项式曲线拟合

多项式曲线拟合是一种常用的数学方法,用于根据给定的数据点,找到一个多项式函数来逼近这些数据点的趋势。首先,我们需要准备一组数据点,这些数据点将作为我们要拟合的目标。假设我们有一组自变量x和对应的因变量y,我们的目标是找到一个多项式函数,使其可以尽可能准确地拟合这些数据点。通过调整阶数和观察拟合曲线与实际数据的拟合程度,我们可以优化拟合结果。我们可以根据给定的数据点和阶数,得到一个多项式函数来拟合这些数据点。我们可以根据实际需求选择合适的阶数,一般情况下,阶数越高,拟合的精度越高,但也容易出现过拟合的问题。

与其临渊羡鱼,不如退而结网 1067

浅析matlab多变量拟合.doc

浅析matlab多变量拟合.doc

MATLAB —— polyfit()多项式曲线拟合(线性拟合/线性回归)

多项式曲线拟合公式: p(x) = p(1)*x^n + p(2)*x^(n-1) + ... + p(n)*x + p(n+1).

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 4万+

手把手教你学Simulink--基于故障诊断与容错控制的场景实例:电动汽车电机驱动系统的故障检测与隔离

本文介绍了基于Simulink的电动汽车电机驱动系统故障诊断与隔离(FDI)仿真建模方法。通过构建永磁同步电机(PMSM)驱动系统模型,实现了IGBT开路、电流传感器漂移等典型故障的注入与检测。重点阐述了基于观测器的残差生成方法,以及利用Stateflow实现的故障隔离逻辑。仿真结果表明,该系统能在85ms内准确识别故障类型,隔离准确率达97%,并支持容错控制。文章还探讨了AI故障预测、数字孪生等高级应用方向,为电动汽车电驱系统安全提供了完整的仿真解决方案。

MHD0815的博客 961

多项式拟合——用Matlab实现并分析

多项式拟合——用Matlab是实现并分析 1、问题 编程实现多项式拟合例子,体会overfitting。 2、方法 可以使用matlab中的方法实现多项式拟合。polyfit(x,y,n),其中n表示预测的多项式为n次。[p,S]=polyfit(x,y,n),p返回的是多项式的系数,S返回的有R,df以及normr,分别代表triangula 3、具体实现 Matlab代码:

孙琨SealSun 3万+

手机移动端-纯js浏览器h5调用摄像头扫描识别解析 条形码+二维码

一、场景 h5原生js 浏览器端解决识别二维码条形码功能; 不借助Hbuilder.需要自己打包成APP,比如用Hbuilder打包,浏览器端项目h5无打包成app部署X不采用 不借助微信扫一扫,调用微信js-jdk有多麻烦,还要认证服务号,也不适用其它浏览器打开X不采用 二、思路 1.思路一:input(相机拍照)+条形码或二维码识别js支持库 通过h5-input[camera]调用相机进行拍照成图片,通过条形码等识别库解析出数据; <input @cha...

徐子厚的博客 3万+

项目回顾一:《高速多端口共享缓存模块》

本帖子仅为了回顾一下一年前自己动手完成的第一个数字ic设计项目的历程,为复试做一下准备,完成的这个sramc模块花了整整四个月的时间,从0到12个模块的代码产出以及模块的验证,虽然没有拿奖,也没有进入复赛,设计过程中使用的技术手段和算法也不太成熟,但这这是一个值得记录的过程!

weixin_60261760的博客 1254

用正交多项式作最小二乘拟合

最近在做数值分析大作业,用到了正交多项式曲线拟合,不调用MATLAB曲线拟合的函数实现,下面分享给大家,由于本人水平有限代码仅供参考,大佬勿喷。

qq_53799678的博客 8736

用户行为数据分析 User Behavior Data from Taobao for Recommendation

一、提出问题 二、理解数据 数据来源 阿里云天池数据集:(https://tianchi.aliyun.com/dataset/dataDetail?dataId=649) 本文选取的数据集为UserBehavior.csv,共有5242880条数据。数据的具体类别如下表所示: 用户行为种类有四种,如下表所示 对于数据维度的说明如下: 在本文选取的2017年11月25日到2017年12月3日的时间范围内,不重复的用户数量为10202,不重复的商品ID数为412369,不重复的商品类目ID数为5859,

cccxxxqq的博客 5206

基于MATLAB的B样条插值拟合算法与分段多项式(附完整代码)

一. B样条函数 B样条函数的MATLAB代码如下: S=spapi(k,x,y) %k为用户选定的B样条阶次,一般以4和5居多 例题1 分别用B样条函数对y和f(x)中的自选数据进行5次B样条函数拟合,并与三次分段多项式样条函数拟合的结果相比较。 解: MATLAB代码如下: clc;clear; %%y函数部分 x0=[0,0.4,1,2,pi]; y0=sin(x0); ezplot('sin(t)',[0,pi]); hold on %三次分段多项式样条插值 sp1=c..

forest_LL的博客 1万+

Win10自动更新怎么永久关闭?有效的Win10强制更新关闭方法

之前小编为大家分享过一些Win10彻底关闭Windows Update自动更新的方法,主要是通过一些如设置流量计费或借助一些专门的小工具来实现,但往往会发现,Win10自动更新就像打不死的小强,不管怎么关闭,之后还是会自动更新,让不少小伙伴颇为不爽。今天小编带来了这篇改进型教程,通过全方位设置,彻底关闭Win10自动更新,感兴趣的小伙伴不妨试试吧。 ...

jianai0602的博客 108万+

基于CubeMX与lwip的STM32轻量级HTTP服务器搭建及VSCode高效开发指南

本文详细介绍了如何在STM32单片机上,利用STM32CubeMX图形化配置工具和轻量级TCP/IP协议栈lwIP,快速搭建一个轻量级HTTP服务器。通过结合VSCode的高效代码编辑能力,提供了一套从硬件连接到动态网页交互(SSI/CGI)的完整开发指南,旨在为嵌入式设备提供零成本、跨平台的Web交互界面。

weixin_29163857的博客 582

多项式拟合一般方程法详细推导

多项式拟合之一般方程法 文章目录多项式拟合之一般方程法1 什么是多项式拟合?2 怎样拟合?3 求bbb正交矩阵QR分解施密特正交化matlab测试函数 之前经常会用到多项式拟合来拟合函数关系,十分好用,得出的表达式使用起来超级方便。在此对多项式拟合原理进行分析。 1 什么是多项式拟合? y=a0+a1x+a2x2+⋯+anxn=∑i=0naixi \begin{aligned} y&=a_0+a_1x+a_2x^2+\cdots +a_nx^n\\ &=\sum_{i=0}^{n}{a_

qq_39545674的博客 2万+

PADS VX2.4 缝合孔(阵列过孔)的添加方法

缝合孔的主要目的是:①:增加底层和顶层的地铜皮的连接性,②:起到屏蔽外界信号干扰的作用。铺完铜后,右击空区域选择“选择形状”命令,选取整板中的一块大铜皮,右击选择“覆铜区域内过孔阵列模式”→“沿周边”指令后,再右击选择“覆铜区域内过孔阵列”,便能看到已选区域内添加的缝合孔(过孔阵列),也可以通过铜皮显示或隐藏的无模命令:PO进行查看。完成上面的“防止错误”和“过孔样式”的设置后,开始对整板进行铺铜处理,点击“工具栏”→覆铜平面指示器,在弹出的对话框点击“开始”,便能观察铺铜后的板子。

tianpu2320959696的博客 3047

matlab如何做正交多项式曲线拟合,matlab正交多项式拟合

在实验模态分析中用 Matlab 实现离散化正交多项式算法 [C], 马永列; 陈章 位; 胡海清 4.在实验模态分析中用 Matlab 实现离散化正交多项式算法 [C], 马永列......变换后的条件数上限表如下: 拟合次数 1 =1 cond2 ( A) 2 <9.9 3 <50.3 4 <435 ④在实际应用中还可以利用正交多项式求拟合多项式。一种方法是构造离散........

weixin_39625162的博客 2814

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之OS模块配置详解(中)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之OS模块配置详解(中)

weixin_42412049的博客 1513

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

基于Matlab的多项式插值与多项式拟合

基于matlab的多项式插值与多项式拟合。在数值分析的领域里,多项式插值与多项式拟合是极为重要的工具,它们帮助我们根据给定的数据点来构造合适的多项式函数,以逼近真实的函数关系。Matlab 作为强大的数学计算软件,为实现这两种方法提供了便捷的途径。

2500_94317807的博客 680

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数值分析与matlab学习笔记——多项式插值法

一点关于多项式插值的笔记和matlab实现拉格朗日插值函数和牛顿插值多项式的代码

L_reindeer的博客 4505

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

matlab数值分析拟合实例,数值分析函数拟合matlab代码.doc

数值分析函数拟合matlab代码.doc 第一题MATLAB代码用SPLINE作图XI0204060810YI098092081064038X10012Y1NEWTON3XI,YI,X源代码见M文件Y2SPLINEXI,YI,XPLOTXI,YI, O ,X,Y1, R ,X,Y2, K 用CSAPE作图XI0204060810YI098092081064038X10012Y1NEWTON3XI,...

weixin_29791743的博客 364

多项式拟合程序matlab,matlab练习程序(最小二乘多项式拟合)

最近在分析一些数据,就是数据拟合的一些事情,用到了matlab的polyfit函数,效果不错。因此想了解一下这个多项式具体是如何拟合出来的,所以就搜了相关资料。这个文档介绍的还不错,我估计任何一本数值分析教材上讲的都非常清楚。推导就不再写了,我主要参考下面两页PPT,公式和例子讲的比较清楚。公式: 例子: matlab代码如下:clear all;close all;clc;N=10; ...

weixin_35949064的博客 1086

matlab练习程序(最小二乘多项式拟合)

最近在分析一些数据,就是数据拟合的一些事情,用到了matlab的polyfit函数,效果不错。 因此想了解一下这个多项式具体是如何拟合出来的,所以就搜了相关资料。 这个文档介绍的还不错,我估计任何一本数值分析教材上讲的都非常清楚。 推导就不再写了,我主要参考下面两页PPT,公式和例子讲的比较清楚。 公式: 例子: matlab代码如下: clear all; close...

weixin_34358365的博客 2290
上一篇: MATLAB数值分析学习笔记:线性最小二乘回归
下一篇: 在unbuntu里建立你的第一个深度学习docker
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值