【数值计算方法(黄明游)】函数插值与曲线拟合(二):三次 Hermite 插值【理论到程序】

news2024/11/28 14:51:37


文章目录

  • 一、近似表达方式
    • 1. 插值(Interpolation)
    • 2. 拟合(Fitting)
    • 3. 投影(Projection)
  • 二、Lagrange插值
    • 1. 拉格朗日插值方法
    • 2. Lagrange插值公式
      • a. 线性插值(n=1)
      • b. 抛物插值(n=2)
  • 三、Newton插值
  • 四、三次 Hermite 插值
    • 1. 天书
    • 2. 人话
    • 3. 例题
    • 4. python实现

一、近似表达方式

  插值、拟合和投影都是常用的近似表达方式,用于对数据或函数进行估计、预测或表示。

1. 插值(Interpolation)

  指通过已知数据点之间的插值方法,来估计或推算出在这些数据点之间的数值。插值可以用于构建平滑的曲线或曲面,以便在数据点之间进行预测或补充缺失的数据。

2. 拟合(Fitting)

  指通过选择合适的函数形式和参数,将一个数学模型与已知数据点拟合得最好的过程。拟合的目标是找到一个函数,使其在数据点附近的值与实际观测值尽可能接近。拟合可以用于数据分析、曲线拟合、回归分析等领域。

3. 投影(Projection)

  指将一个向量或一组向量映射到另一个向量空间或子空间上的过程。在线性代数中,投影可以用来找到一个向量在另一个向量或向量空间上的投影或投影分量。投影可以用于降维、数据压缩、特征提取等领域,以及计算机图形学中的投影变换。

二、Lagrange插值

【数值计算方法(黄明游)】函数插值与曲线拟合(一):Lagrange插值【理论到程序】
   Lagrange插值是一种用于通过已知数据点构造一个多项式函数的方法基于拉格朗日插值多项式的原理(该多项式通过每个数据点并满足相应的条件),拉格朗日插值可用于估计数据点之间的值,而不仅仅是在给定数据点上进行插值。

1. 拉格朗日插值方法

  1. 拉格朗日基函数: 对于给定的插值节点 x 0 , x 1 , … , x n x_0, x_1, \ldots, x_n x0,x1,,xn,拉格朗日插值使用如下的拉格朗日基函数:

    L i ( x ) = ∏ j = 0 , j ≠ i n x − x j x i − x j L_i(x) = \prod_{j=0, j\neq i}^{n} \frac{x - x_j}{x_i - x_j} Li(x)=j=0,j=inxixjxxj

  2. 插值条件: 拉格朗日插值要求插值多项式满足插值条件:对所有 i i i P ( x i ) = y i P(x_i) = y_i P(xi)=yi

  3. 插值多项式: 构造插值多项式为: P ( x ) = ∑ i = 0 n y i L i ( x ) P(x) = \sum_{i=0}^{n} y_i L_i(x) P(x)=i=0nyiLi(x)

  通过这种方法,可以在给定的数据点上获得一个平滑的插值函数,使得在这些数据点之间的任何位置上都可以估计函数的值。Lagrange插值在数据点较少或数据点之间存在较大间隔时可能会出现一些问题,例如插值多项式可能会产生振荡现象,这被称为Runge现象

2. Lagrange插值公式

L i ( x ) = ∏ j = 0 , j ≠ i n x − x j x i − x j L_i(x) = \prod_{j=0, j\neq i}^{n} \frac{x - x_j}{x_i - x_j} Li(x)=j=0,j=inxixjxxj P ( x ) = ∑ i = 0 n y i L i ( x ) P(x) = \sum_{i=0}^{n} y_i L_i(x) P(x)=i=0nyiLi(x)

a. 线性插值(n=1)

P ( x ) = y 0 ( x − x 1 ) ( x 0 − x 1 ) + y 1 ( x − x 0 ) ( x 1 − x 0 ) P(x) = y_0 \frac{(x - x_1)}{(x_0 - x_1)} + y_1 \frac{(x - x_0)}{(x_1 - x_0)} P(x)=y0(x0x1)(xx1)+y1(x1x0)(xx0)

b. 抛物插值(n=2)

P ( x ) = y 0 ( x − x 1 ) ( x − x 2 ) ( x 0 − x 1 ) ( x 0 − x 2 ) + y 1 ( x − x 0 ) ( x − x 2 ) ( x 1 − x 0 ) ( x 1 − x 2 ) + y 2 ( x − x 0 ) ( x − x 1 ) ( x 2 − x 0 ) ( x 2 − x 1 ) P(x) = y_0 \frac{(x - x_1)(x - x_2)}{(x_0 - x_1)(x_0 - x_2)} + y_1 \frac{(x - x_0)(x - x_2)}{(x_1 - x_0)(x_1 - x_2)} + y_2 \frac{(x - x_0)(x - x_1)}{(x_2 - x_0)(x_2 - x_1)} P(x)=y0(x0x1)(x0x2)(xx1)(xx2)+y1(x1x0)(x1x2)(xx0)(xx2)+y2(x2x0)(x2x1)(xx0)(xx1)

三、Newton插值

【数值计算方法(黄明游)】函数插值与曲线拟合(二):Newton插值【理论到程序】

四、三次 Hermite 插值

1. 天书

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2. 人话

  我们有两个插值节点 x 0 x_0 x0 x 1 x_1 x1,已知在这些节点上的函数值 y 0 = f ( x 0 ) y_0 = f(x_0) y0=f(x0) y 1 = f ( x 1 ) y_1 = f(x_1) y1=f(x1) 和导数值 m 0 = f ′ ( x 0 ) m_0 = f'(x_0) m0=f(x0) m 1 = f ′ ( x 1 ) m_1 = f'(x_1) m1=f(x1)。要求一个三次多项式 H ( x ) H(x) H(x),满足以下插值条件:

  1. H ( x 0 ) = y 0 H(x_0) = y_0 H(x0)=y0,即在 x 0 x_0 x0 节点上的函数值相等。
  2. H ′ ( x 0 ) = m 0 H'(x_0) = m_0 H(x0)=m0,即在 x 1 x_1 x1 节点上的导数值相等。
  3. H ( x 1 ) = y 1 H(x_1) = y_1 H(x1)=y1,即在 x 1 x_1 x1 节点上的函数值相等。
  4. H ′ ( x 1 ) = m 1 H'(x_1) = m_1 H(x1)=m1,即在 x 1 x_1 x1 节点上的导数值相等。

这样的插值问题可以通过构造一个三次多项式 H ( x ) H(x) H(x)来解决。一般而言,Hermite插值的基本形式为:

H ( x ) = h 0 ( x ) y 0 + h 1 ( x ) m 0 + h 2 ( x ) y 1 + h 3 ( x ) m 1 H(x) = h_0(x) y_0 + h_1(x) m_0 + h_2(x) y_1 + h_3(x) m_1 H(x)=h0(x)y0+h1(x)m0+h2(x)y1+h3(x)m1

  其中 h 0 ( x ) , h 1 ( x ) , h 2 ( x ) , h 3 ( x ) h_0(x), h_1(x), h_2(x), h_3(x) h0(x),h1(x),h2(x),h3(x)是一组基函数,它们的形式可以通过需求的导数条件来确定。由于我们要求满足函数值和一阶导数值的条件,基函数的形式可以通过Lagrange插值多项式的导数来得到。

待完善……

3. 例题

在这里插入图片描述

4. python实现

def hermite_interpolation(x, y, m, xi):
    """
    三次 Hermite 插值

    Parameters:
    - x: 插值节点的 x 坐标
    - y: 插值节点的函数值
    - m: 插值节点的一阶导数值
    - xi: 要进行插值的点的 x 坐标

    Returns:
    - interpolated_value: 在 xi 处的插值结果
    """
    t = (xi - x[0]) / (x[1] - x[0])

    h0 = (1 - 3 * t**2 + 2 * t**3)
    h1 = t * (1 - t)**2
    h2 = xi * (1 - t)**2
    h3 = xi**2 * (3 - 2 * t)

    interpolated_value = h0 * y[0] + h1 * y[1] + h2 * m[0] + h3 * m[1]

    return interpolated_value


# 示例数据
x_nodes = [1, 2]
y_values = [2, 3]
derivatives = [1, 2]
xi_value = 1.5

# 进行三次 Hermite 插值
interpolated_result = hermite_interpolation(x_nodes, y_values, derivatives, xi_value)

# 打印插值结果
print("插值结果:", interpolated_result)

输出:

插值结果: 10.75

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ISP IC/FPGA设计-第一部分-MT9V034摄像头分析(0)

MT9V034为CMOS图像传感器,有着极其优秀的图像成像性能,同时支持丰富的功能用于isp的开发;MT9V034 的HDR宽动态、10bit数据深度、RAW格式(bayer阵列)图像、dvp和lvds接口、60fps正是学习isp开发的理想传感器&#xff1b…

接触刚性环境任务下的机器人力控(阻抗)性能测试

内涵 接触刚性环境任务下的机器人力控(阻抗)性能测试旨在评估机器人在与刚性物体交互时的性能表现。这种测试通过调整机器人的控制参数,如期望刚度和期望阻尼等,并分析记录的数据,旨在确保机器人能够在执行任务时保持…

快速测试 3节点的redis sentinel集群宕机2个节点以后是否仍能正常使用

有同事问我,三个redis sentinel节点,宕机两个节点以后,是否还能够正常的通过redis sentinel正常访问redis的数据。我想了想,理论上是可以的,但是我没试过,今天有时间就测试了一下。搭建环境和测试代码的过程…

4 向微服务架构转变

文章目录 小型单体系统为什么选择小型单体系统微服务与生俱来的问题小型单体系统适用于小团队拥抱重构 规划未来拆分的小型单体应用程序新需求和游戏化用户故事游戏化:积分、徽章和排行榜 转向微服务独立的工作流程水平可伸缩性细粒度的非功能需求其他优势劣势 架构…

一文搞懂Lombok Plugins使用与原理

目录 一文搞懂Lombok使用与原理 1.前言2.什么是Lombok3. IntelliJ安装Lombok3.1通过IntelliJ的插件中心安装3.2在项目中使用Lombok Plugins 4.Lombok 注解大全说明4.1POJO类常用注解4.2其他注解 5.Lombok常见问题6.总结7.参考 文章所属专区 超链接 1.前言 2.什么是Lombok Lo…

MyBatis 四大核心组件之 Executor 源码解析

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

EP15:动态内存管理概述(c语言)malloc,calloc,realloc函数的介绍使用及柔性数组的介绍

如果学习方向是c方向那么c语言有三个板块的知识是非常重要的. 1:指针 2:结构体 3;动态内存管理. 序言:在c语言中,什么是动态内存 C语言中的动态内存是指在程序运行时,根据需要动态地分配内存空间的一种内存管理方式。与静态内存相比,动态内存的大小和生…

美化博客园的个人主页

进入博客园个人主页 将博客皮肤改为:SimpleMemory 然后打开github网站:Cnblogs-Theme-SimpleMemory/docs/v2/Docs/GettingStarted/install.md at v2 BNDong/Cnblogs-Theme-SimpleMemory (github.com) 按照他上面写的做进行了: 复制到&#…

二叉搜索树中第K小的元素[中等]

优质博文:IT-BLOG-CN 一、题目 给定一个二叉搜索树的根节点root,和一个整数k,请你设计一个算法查找其中第k个最小元素(从1开始计数)。 示例 1: 输入:root [3,1,4,null,2], k 1 输出&#x…

Spring Boot 3 集成 MyBatis详解

MyBatis是一款开源的持久层框架,它极大地简化了与数据库的交互流程。与类似Hibernate的ORM框架不同,MyBatis更具灵活性,允许开发者直接使用SQL语句与数据库进行交互。Spring Boot和MyBatis分别是两个功能强大的框架,它们的协同使用…

SVN修改已提交版本的日志方法

1.在工做中一直是使用svn进行項目的版本控制的,有时候因为提交匆忙,或是忘了添加Log,或是Log内容有错误。遇到此类状况,想要在查看项目的日志时添加log或是修改log内容,遇到以下错误: Repository has not b…

[强网拟态决赛 2023] Crypto

文章目录 Bad_rsaClasslcal Bad_rsa 题目描述: from Crypto.Util.number import *f open(flag.txt,rb) m bytes_to_long(f.readline().strip())p getPrime(512) q getPrime(512) e getPrime(8) n p*q phi (p-1)*(q-1) d inverse(e,phi) leak d & ((1…

c语言一维数组总结详解

目录 介绍: 一维整型数组: 声明: 初始化: 打印输出: 输出结果: 浮点型数组: 代码: 运行结果: 补充: 一维字符数组: 字符数组声明及初始…

前端入门:HTML初级指南,网页的简单实现!

代码部分&#xff1a; <!DOCTYPE html> <!-- 上方为DOCTYPE声明&#xff0c;指定文档类型为HTML --> <html lang"en"> <!-- html标签为整个页面的根元素 --> <head> <!-- title标签用于定义文档标题 --> <title>初始HT…

SmartChart:一站式数据可视化解决方案

在当今的数据驱动的世界中&#xff0c;数据可视化已经成为了一个重要的工具&#xff0c;它可以帮助我们理解复杂的数据集&#xff0c;并从中提取有价值的信息。SmartChart就是这样一个强大的数据可视化工具&#xff0c;它提供了一站式的数据可视化解决方案&#xff0c;无论你是…

C/C++ 编程规范总结

目录 前言 一、编程规范的作用 二、规范的三种形式 三、规范的内容 1. 基本原则 原则1-1 原则1-2 原则1-3 原则1-4 原则1-5 原则1-6 原则1-7 2. 布局 规则2-1-1 规则2-1-2 规则2-1-3 规则2-1-4 规则2-1-5 规则2-1-6 规则2-2-1 规则2-2-2 规则2-2-3 建议2…

[ 蓝桥杯Web真题 ]-布局切换

目录 介绍 准备 目标 规定 思路 解法参考 介绍 经常用手机购物的同学或许见过这种功能&#xff0c;在浏览商品列表的时候&#xff0c;我们通过点击一个小小的按钮图标&#xff0c;就能快速将数据列表在大图&#xff08;通常是两列&#xff09;和列表两种布局间来回切换。…

HarmonyOS鸿蒙应用开发——HTTP网络访问与封装

文章目录 基本使用封装参考 基本使用 鸿蒙应用发起HTTP请求的基本使用&#xff0c;如下&#xff1a; 导入http模块创建httpRequest对象发起http请求&#xff0c;并处理响应结果 第一、导入http模块&#xff1a; import http from ohos.net.http第二、创建httpRequest对象&a…

本地搭建Linux DataEase数据可视化分析工具并实现公网访问

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

排序算法之七:归并排序(递归)

基本思想 基本思想&#xff1a; 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1…