数值分析——分段低次插值

关键字:Matalb;曲线拟合;高次病态特性;分段低次插值

系列文章目录

数值分析——拉格朗日插值
数值分析——牛顿插值多项式
数值分析——埃尔米特(Hermit)插值


文章目录

  • 系列文章目录
  • 前言
  • 一、理论推导
    • 1.高次插值的病态特性
    • 2.分段线性插值
    • 3.分段三次Hermit插值
  • 二、MATLAB
    • 1.分段线性插值
    • 2.分段Hermit插值
    • 3.测试程序
  • 总结
  • 参考文献


前言

  一般认为对于区间 [ a , b ] \left[a,b\right] [a,b]上给出的节点做插值多项式 L n ( x ) L_n\left( x \right) Ln(x)近似 f ( x ) f\left( x \right) f(x),一般总认为 L n ( x ) L_n\left( x \right) Ln(x)的次数 n n n越高,插值函数逼近原函数的效果越好,但实际上并非如此。这是因为对于任意的插值节点,当 n → ∞ n\rightarrow \infty n时, L n ( x ) L_n\left( x \right) Ln(x)不一定收敛于 f ( x ) f\left( x \right) f(x)。为了解决高次插值的问题,学者们提出了分段低次插值的方法,即将被拟合函数 f ( x ) f\left( x \right) f(x)分为多个小区间,在小区间上利用低次多项式进行插值拟合。

本文对一些复杂的流程与概念进行了简化与省略,如果想详细了解的小伙伴可以参考李庆扬老师的《数值分析 -第5版》的第2章(需要电子版请私戳)


一、理论推导

1.高次插值的病态特性

  高次插值的病态特性指的是,在对某些函数 f ( x ) f\left( x \right) f(x)进行拟合时,高次多项式的插值函数拟合效果反而不好的特性。例如针对函数:
f ( x ) = 1 x 2 + 1 (1) f\left( x \right)=\frac{1}{x^2+1} \tag{1} f(x)=x2+11(1)使用拉格朗日插值法,在插值节点 x = − 5 , − 4 , − 3 , − 2 , − 1 , 0 , 1 , 2 , 3 , 4 , 5 x=-5,-4,-3,-2,-1,0,1,2,3,4,5 x=5,4,3,2,1,0,1,2,3,4,5拟合十次插值函数:

% 高次插值的动态特性
x=-5:0.05:5;
y=zeros(1,length(x));                                                       % 原函数y值
xInArr=-5:1:5;                                                              % 插值节点x值
yInArr=zeros(1,length(xInArr));                                             % 插值节点y值
yOutArr=zeros(1,length(x));                                                 % 插值函数y值
% 计算插值函数y值
for i=1:1:length(xInArr)yInArr(i)=1/(xInArr(i)^2+1);
end
% 计算十次插值多项式的poly数组
L10=func_LagrangeInterpolation(xInArr,yInArr,11);
% 计算原函数与插值函数y值
for i=1:1:length(x)y(i)=1/(x(i)^2+1);yOutArr(i)=polyval(L10,x(i));
end
% 画图
plot(x,y,'k-',x,yOutArr,'r:','LineWidth',2);
xlabel('x');
ylabel('y');
legend('f(x)','L10(x)');

其中func_LagrangeInterpolation是拉格朗日插值法函数,具体内容可参考数值分析——拉格朗日插值中的代码。得到的对比结果:
Alt

图1.1 高次插值函数的病态特性

其中红色的点线为十次拉格朗日插值函数 L 10 ( x ) L_{10}\left( x \right) L10(x),黑色的曲线为原函数 f ( x ) f\left( x \right) f(x),可以看到插值函数的拟合效果并不是很好。

2.分段线性插值

  分段线性插值就是通过插值点用折现段连接起来逼近 f ( x ) f\left( x \right) f(x)。若在已知节点 a = x 0 < x 1 < ⋯ < x n = b a=x_0<x_1<\cdots<x_n=b a=x0<x1<<xn=b,已知各点的函数值f_0,f_1,f_2,\cdots,f_{n-1},f_n,则可以设计一个插值函数:
I h ( x ) = x − x k + 1 x k − x k + 1 f k + x − x k x k + 1 − x k f k + 1 , x k ≤ x ≤ x k + 1 , k = 0 , 1 , ⋯ , n − 1 (2) I_h\left( x \right)= \frac{x-x_{k+1}}{x_{k}-x_{k+1}}f_k+ \frac{x-x_{k}}{x_{k+1}-x_{k}}f_{k+1}, \ \ x_k \le x \le x_{k+1}, \ \ k=0,1,\cdots,n-1 \tag{2} Ih(x)=xkxk+1xxk+1fk+xk+1xkxxkfk+1,  xkxxk+1,  k=0,1,,n1(2)该插值函数满足:

  1. 函数属于在区间 [ a , b ] [a,b] [a,b]连续的函数空间: I h ( x ) ∈ C [ a , b ] I_h\left( x \right)\in C\left[a,b\right] Ih(x)C[a,b]
  2. 插值函数在所有插值点的数值都等于原函数: I h ( x ) = f k ( k = 0 , 1 , ⋯ , n − 1 ) I_h\left( x \right)=f_k\left(k=0,1,\cdots,n-1\right) Ih(x)=fk(k=0,1,,n1)
  3. 插值函数在每个小区间上是线性函数: I h ( x ) = k x + b I_h\left( x \right)=kx+b Ih(x)=kx+b

3.分段三次Hermit插值

  分段线性插值函数的导数是间断的,如果在插值节点 a = x 0 < x 1 < ⋯ < x n = b a=x_0<x_1<\cdots<x_n=b a=x0<x1<<xn=b上,不仅已知函数值 f 0 , f 1 , f 2 , ⋯ , f n − 1 , f n f_0,f_1,f_2,\cdots,f_{n-1},f_n f0,f1,f2,,fn1,fn,而且已知函数导数值 f 0 ′ , f 1 ′ , f 2 ′ , ⋯ , f n − 1 ′ , f n ′ f^{'}_0,f^{'}_1,f^{'}_2,\cdots,f^{'}_{n-1},f^{'}_n f0,f1,f2,,fn1,fn,则可以设计一个插值函数:
I h ( x ) = ( x − x k + 1 x k − x k + 1 ) 2 ( 1 + 2 x − x k x k + 1 − x k ) f k + ( x − x k x k + 1 − x k ) 2 ( 1 + 2 x − x k + 1 x k − x k + 1 ) f k + 1 + ( x − x k + 1 x k − x k + 1 ) 2 ( x − x k ) f k ′ + ( x − x k x k + 1 − x k ) 2 ( x − x k + 1 ) f k + 1 ′ , x k ≤ x ≤ x k + 1 , k = 0 , 1 , ⋯ , n − 1 (3) \begin{align} I_h\left( x \right)= &\left(\frac{x-x_{k+1}}{x_{k}-x_{k+1}}\right)^2 \left( 1+2\frac{x-x_k}{x_{k+1}-x_{k}} \right)f_k+ \left(\frac{x-x_{k}}{x_{k+1}-x_{k}}\right)^2\left( 1+2\frac{x-x_{k+1}}{x_{k}-x_{k+1}} \right)f_{k+1} \\ &+\left(\frac{x-x_{k+1}}{x_{k}-x_{k+1}}\right)^2\left( x-x_k \right)f^{'}_k+\left(\frac{x-x_{k}}{x_{k+1}-x_{k}}\right)^2\left( x-x_{k+1} \right)f^{'}_{k+1}, \ \ x_k \le x \le x_{k+1}, \ \ k=0,1,\cdots,n-1 \end{align} \tag{3} Ih(x)=(xkxk+1xxk+1)2(1+2xk+1xkxxk)fk+(xk+1xkxxk)2(1+2xkxk+1xxk+1)fk+1+(xkxk+1xxk+1)2(xxk)fk+(xk+1xkxxk)2(xxk+1)fk+1,  xkxxk+1,  k=0,1,,n1(3)该插值函数满足:

  1. 插值函数属于在区间 [ a , b ] [a,b] [a,b]上一阶导数连续的函数空间: I h ( x ) ∈ C 1 [ a , b ] I_h\left( x \right)\in C^1\left[a,b\right] Ih(x)C1[a,b]
  2. 插值函数在所有插值点的数值都等于原函数: I h ( x ) = f k ( k = 0 , 1 , ⋯ , n − 1 ) I_h\left( x \right)=f_k\left(k=0,1,\cdots,n-1\right) Ih(x)=fk(k=0,1,,n1)
  3. 插值函数一阶导数在所有插值点的数值都等于原函数一阶导数: I h ′ ( x ) = f k ′ ( k = 0 , 1 , ⋯ , n − 1 ) I_h^{'}\left( x \right)=f_k^{'}\left(k=0,1,\cdots,n-1\right) Ih(x)=fk(k=0,1,,n1)
  4. 插值函数在每个小区间上是三次多项式: I h ( x ) = a x 3 + b x 2 + c x + d I_h\left( x \right)=ax^3+bx^2+cx+d Ih(x)=ax3+bx2+cx+d

二、MATLAB

1.分段线性插值

% 分段线性插值
function [yOutArr]=func_PiecewiseLinearInterpolation(xInArr,yInArr,xQuery)% ************************************************************% 识别误差% ************************************************************xInLength=length(xInArr);yInLength=length(yInArr);% 插值数组不匹配if xInLength~=yInLengtherror('Error:The xInArr %d and the yInArr %d are not equal in length.',xInLength,yInLength);end% ************************************************************% 计算查询节点在插值函数上的函数值% ************************************************************% 只一个插值节点if xInLength==1yOutArr=yInArr;return;end% 有多个插值节点xQueryLength=length(xQuery);yOutArr=zeros(1,xQueryLength);pos=1;for i=1:1:xQueryLengthfor j=pos:1:xInLength-1% 查询节点如果超出插值节点范围则报错if xQuery(i)>xInArr(xInLength)||xQuery(i)<xInArr(1)error('Error:The num of the xQuery should gainer than %d and lesser than %d.',xInArr(1),xInArr(xInLength));end% 定位查询数组在插值节点的位置if (xQuery(i)>xInArr(j)&&xQuery(i)<xInArr(j+1))||(xQuery(i)==xInArr(j))pos=j;break;endend% 计算查询节点在插值函数上的函数值yOutArr(i)=polyval(func_LinearInterpolation(xInArr(pos),yInArr(pos),xInArr(pos+1),yInArr(pos+1)),xQuery(i));end
end

2.分段Hermit插值

% 分段三次Hermit插值
function [yOutArr]=func_PiecewiseCubeHermitInterpolation(xInArr,yInArr,dyInArr,xQuery)% ************************************************************% 识别误差% ************************************************************xInLength=length(xInArr);yInLength=length(yInArr);% 插值数组不匹配if xInLength~=yInLengtherror('Error:The xInArr %d and the yInArr %d are not equal in length.',xInLength,yInLength);end% ************************************************************% 计算查询节点在插值函数上的函数值% ************************************************************% 只一个插值节点if xInLength==1yOutArr=yInArr;return;end% 有多个插值节点xQueryLength=length(xQuery);yOutArr=zeros(1,xQueryLength);pos=1;for i=1:1:xQueryLengthfor j=pos:1:xInLength-1% 查询节点如果超出插值节点范围则报错if xQuery(i)>xInArr(xInLength)||xQuery(i)<xInArr(1)error('Error:The num of the xQuery should gainer than %d and lesser than %d.',xInArr(1),xInArr(xInLength));end% 定位查询数组在插值节点的位置if (xQuery(i)>xInArr(j)&&xQuery(i)<xInArr(j+1))||(xQuery(i)==xInArr(j))pos=j;break;endend% 计算查询节点在插值函数上的函数值yOutArr(i)=polyval(func_2dotsCubicHermitInterpolation(xInArr(pos:1:pos+1),yInArr(pos:1:pos+1),dyInArr(pos),dyInArr(pos+1)),xQuery(i));end
end

3.测试程序

% 测试分段低次插值函数——func_PiecewiseLinearInterpolatio、func_PiecewiseCubeHermitInterpolation
clc;
clear;
close all;x=-0.2*pi:0.2*pi:10*pi;
y=sin(x);
dy=diff(y,1);xq=0:0.01*pi:10*pi;
yq1=func_PiecewiseLinearInterpolation(x(2:1:length(x)),y(2:1:length(x)),xq);
yq2=func_PiecewiseCubeHermitInterpolation(x(2:1:length(x)),y(2:1:length(x)),dy,xq);
plot(x,y,'k*',xq,yq1,'r-',xq,yq2,'b-');

Alt

图2.1 分段线性与Hermit插值

总结

  以上在本文中对分段低次插值的两种常见方法的推导进行了简单介绍,并提供了MATLAB的实现代码与测试用例。

参考文献

[1]李庆扬,王能超,易大义. 数值分析.第5版[M]. 清华大学出版社, 2008.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/389038.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跟张良均老师学大数据人工智能-批量集训营开班中

随着我国大数据和人工智能产业的飞速发展&#xff0c;未来社会对高素质科技人才的需求日益旺盛。为助力广大青少年提前掌握前沿技术&#xff0c;实现自我价值&#xff0c;泰迪智能科技多名优秀老师联合打造暑期大数据人工智能集训营&#xff0c;旨在培养具备创新精神和实战能力…

工厂客流人数管控系统,智能识别统计员工人数

在当今高度自动化和智能化的工业环境中&#xff0c;工厂客流人数管控系统正发挥着至关重要的作用。这一系统不仅能够智能识别并统计员工人数&#xff0c;还为工厂的运营管理带来了诸多优势。 一、系统介绍 工厂客流人数管控系统采用高精度视觉技术和深度学习算法&#xff0c;通…

CTFHUB-文件上传-双写绕过

开启题目 1.php内容&#xff1a; <?php eval($_POST[cmd]);?> 上传一句话木马 1.php&#xff0c;抓包&#xff0c;双写 php 然后放包&#xff0c;上传成功 蚁剑连接 在“/var/www/html/flag_484225427.php”找到了 flag

泛化的最近点迭代法(Generalized-ICP)

Generalized-ICP算法是由斯坦福大学的Aleksandr V. Segal、Dirk Haehnel和Sebastian Thrun提出的&#xff0c;于2009年在Robotics science and system会议上发表。 GICP是一种ICP算法的变体&#xff0c;其原理与ICP算法相同&#xff0c;之所以称为泛化的ICP算法是因为大多数ICP…

react-日期选择器封装

文件 import { useMemo, useState, useEffect } from "react" import dayjs, { Dayjs } from "dayjs" import "dayjs/locale/zh-cn" import "./App.css" dayjs.locale("zh-cn")function SimpleCalendar() {// 当前时间对象…

802.11 wireshark 抓包

80211 wireshark 抓包 前言配置 monitor软件配置wireshark 操作 前言 本人习惯使用 Omnipeek 抓包分析&#xff0c;所以 wireshark 的实验只讲到抓包完成。 Windows 环境采用 wireshark 抓包是比较麻烦的&#xff0c;因为支持在 Windows 环境中支持抓包的网卡并不多&#xff0…

Spring面试篇章——Spring基本概述

Spring 的基本概述 Spring学习的核心内容—一图胜千言 IOC&#xff1a;控制反转&#xff0c;可以管理 Java 对象AOP&#xff1a;切面编程JDBCTemplate&#xff1a;是Spring提供一套访问数据库的技术&#xff0c;应用性强&#xff0c;相对好理解声明式事务&#xff1a;基于IOC …

docker compse简介与安装

目录 1. Docker Compose 简介 2. Docker Compose 安装 2.1 在 Ubuntu 上安装 Docker Compose 2.1.1 通过 apt 安装 2.1.2 使用官方脚本安装最新版本 2.2 在 CentOS 上安装 Docker Compose 2.2.2 使用官方脚本安装最新版本 2.2.3 使用 pip 安装 2.3 在 openEuler 上安装…

Python面试宝典第25题:括号生成

题目 数字n代表生成括号的对数&#xff0c;请设计一个函数&#xff0c;用于能够生成所有可能的并且有效的括号组合。 备注&#xff1a;1 < n < 8。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()"…

【ArcGIS+CityEngine】自行制作Lod1城市大尺度白膜数据

数据准备 50多个城市建筑矢量数据 链接&#xff1a;https://pan.baidu.com/s/1FiwTfXDwQ6tMDRACAwUZwQ 提取码&#xff1a;DYSK 数据分析 数据属性Floor&#xff0c;为建筑物楼层信息&#xff0c;据此信息下面将在CityEngine软件生成Lod1白膜数据。 软件准备 CityEngi…

创建了Vue项目,需要导入什么插件以及怎么导入

如果你不知道怎么创建Vue项目,建议可以看一看这篇文章 怎么安装Vue的环境和搭建Vue的项目-CSDN博客 1.在idea中打开目标文件 2.系在一个插件Vue.js 3.下载ELement UI 在Terminal中输入 # 切换到项目根目录 cd vueadmin-vue # 或者直接在idea中执行下面命令 # 安装element-u…

[GYCTF2020]Blacklist1

打开题目 判断注入类型&#xff0c;输入1试试 输入2 输入1 判断为字符型注入 堆叠查询2;show databases;# 然后来输入2; show tables;#来查看数据库的表 然后我们通过FlagHere表来查看列输入2;show columns from FlagHere;# 来查看列 、 重新构造payload&#xff1a;0;HAND…

基于FPGA的高精度多通道同步AD采集系统开发及数字信号处理算法应用,基于FPGA的多通道同步AD采集系统开发及数字信号处理算法实现

FPGA多通道同步AD采集 AD7606 8通道16位高精度同步采集系统开发&#xff0c;采样率200KSPS&#xff0c;采集数据支持DDR3缓存、串口发送、USB2.0上传、千兆以太网上传等。 支持基于FPGA的数字信号处理算法开发 ID:77500703611886617 塞纳河山 FPGA多通道同步AD采集是一项基于…

官宣!新增博士硕士点审核结果已出!附查询方法

2024年7月31日&#xff0c;新增博士硕士学位授权结果正式公示&#xff01; 多所高校&#xff0c;新增博士和硕士学位授权点 大家可前往该网站查询&#xff1a;https://zjpy.cdgdc.edu.cn/sqshjggb 另外说明一下&#xff0c;这些学校不一定今年就开展招生工作 一切以学校的官…

9.Redis的Set类型

Redis的Set结构与java中的HashSet类似。 可以看做是一个value为null的HashMap。 特点 1.无序 2.元素不可重复 3.查找快 4.支持交集、并集、差集等功能 应用场景 实现共同关注&#xff0c;共同好友。 常见命令 sadd key 元素1 元素2 给set集合添加一个或多个元素 smem…

Kimi+AiPPT的正确打开方式!文档一键转换PPT!限时免费!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之路不迷路,2024我们一起变强。 我之前…

做管理,一定要避开这6个坑,才能成就优秀管理者

做管理&#xff0c;一定要避开这6个坑&#xff0c;才能成就优秀管理者 一、被平庸的员工绑架 要是领导不敢或者不愿意惩罚或者开除那些没完成任务的员工&#xff0c;那优秀的员工就会觉得&#xff0c;做得好做得差都一样&#xff0c;那谁还愿意努力呢&#xff1f; 二、总想改变…

基于双PI控制器结构的六步逆变器供电无刷直流电机调速simulink仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 无刷直流电机&#xff08;BLDCM&#xff09;原理 4.2 六步换相逆变器 4.3 双PI控制器设计 5.完整工程文件 1.课题概述 基于双PI控制器结构的六步逆变器供电无刷直流电机调速simulink仿真。双PI控制…

DockerCompose部署示例

目录 前言 1. 初识DockerCompose 2. 安装DockerCompose 3. 部署微服务项目 1&#xff09;找一个目录&#xff0c;创建一个新的cloud-demo文件夹。 2&#xff09;在cloud-demo文件夹创建一个docker-compose.yml文件&#xff0c;然后编写下面内容&#xff1a; 3&#xff09…

【视频讲解】后端增删改查接口有什么用?

B站视频地址 B站视频地址 前言 “后端增删改查接口有什么用”&#xff0c;其实这句话可以拆解为下面3个问题。 接口是什么意思&#xff1f;后端接口是什么意思&#xff1f;后端接口中的增删改查接口有什么用&#xff1f; 1、接口 概念&#xff1a;接口的概念在不同的领域中…