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

本文主要是介绍【数值计算方法(黄明游)】函数插值与曲线拟合(二):Newton插值【理论到程序】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


文章目录

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

一、近似表达方式

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

1. 插值(Interpolation)

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

2. 拟合(Fitting)

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

3. 投影(Projection)

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

二、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插值

1. 天书

在这里插入图片描述

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

2. 人话

  Newton插值基于差商的概念:通过给定的一组数据点,Newton插值可以生成一个通过这些点的多项式,从而在给定的数据范围内进行插值和外推。
  Newton插值的基本思想是使用差商来递归地构建一个多项式。差商是通过递归地计算数据点之间的差分来定义的。具体而言,对于给定的数据点 ( x 0 , y 0 ) , ( x 1 , y 1 ) , . . . , ( x n , y n ) (x_0, y_0), (x_1, y_1), ..., (x_n, y_n) (x0,y0),(x1,y1),...,(xn,yn),差商可以表示为:

f [ x 0 ] = y 0 f[x_{0}] = y_{0} f[x0]=y0 f [ x 1 , x 0 ] = ( f [ x 1 ] − f [ x 0 ] ) ( x 1 − x 0 ) f[x_{1}, x_{0}] =\frac{ (f[x_{1}] - f[x_{0}]) }{ (x_{1} - x_{0})} f[x1,x0]=(x1x0)(f[x1]f[x0]) f [ x 2 , x 1 , x 0 ] = ( f [ x 2 , x 1 ] − f [ x 1 , x 0 ] ) ( x 2 − x 0 ) f[x_{2}, x_{1}, x_{0}] =\frac{ (f[x_{2}, x_{1}] - f[x_{1}, x_{0}]) }{ (x_{2} - x_{0})} f[x2,x1,x0]=(x2x0)(f[x2,x1]f[x1,x0]) … … … … ………… ………… f [ x n , x n − 1 , . . . , x 0 ] = ( f [ x n , x n − 1 , . . . , x 1 ] − f [ x n − 1 , . . . , x 0 ] ) ( x n − x 0 ) f[x_{n}, x_{n-1}, ..., x_{0}] = \frac{(f[x_{n}, x_{n-1}, ..., x_{1}] - f[x_{n-1}, ..., x_{0}])}{(x_{n} - x_{0})} f[xn,xn1,...,x0]=(xnx0)(f[xn,xn1,...,x1]f[xn1,...,x0])
然后,通过将这些差分商逐步添加到多项式中,可以得到一个多项式,表示为:
P ( x ) = f [ x 0 ] + f [ x 1 , x 0 ] ( x − x 0 ) + f [ x 2 , x 1 , x 0 ] ( x − x 0 ) ( x − x 1 ) + . . . P(x) = f[x_{0}] + f[x_{1}, x_{0}](x - x_{0}) + f[x_{2}, x_{1}, x_{0}](x - x_{0})(x - x_{1}) + ... P(x)=f[x0]+f[x1,x0](xx0)+f[x2,x1,x0](xx0)(xx1)+...

  Newton插值的优点之一是它可以通过添加更多的数据点来逐步改进插值结果。然而,同Lagrange插值一样,它也存在龙格现象(Runge’s phenomenon),导致在边界处产生振荡。

3. 例题

在这里插入图片描述

4. python实现

def newton_interpolation(x, y, xi):# 计算差分商n = len(x)f = [[0] * n for _ in range(n)]for i in range(n):f[i][0] = y[i]for j in range(1, n):for i in range(n - j):f[i][j] = (f[i + 1][j - 1] - f[i][j - 1]) / (x[i + j] - x[i])# 构建插值多项式result = f[0][0]for j in range(1, n):term = f[0][j]for i in range(j):term *= (xi - x[i])result += termreturn result# 示例数据
x = [0.32, 0.34, 0.36]
y = [0.314567, 0.333487, 0.352274]
xi = 0.3367# 进行插值
interpolated_value = newton_interpolation(x, y, xi)
print("插值结果:", interpolated_value)

输出:

插值结果: 0.3303743620375

5. C语言实现

#include <stdio.h>double newton_interpolation(double x[], double y[], int n, double xi) {// 计算差分商double f[n][n];for (int i = 0; i < n; i++) {f[i][0] = y[i];}for (int j = 1; j < n; j++) {for (int i = 0; i < n - j; i++) {f[i][j] = (f[i+1][j-1] - f[i][j-1]) / (x[i+j] - x[i]);}}// 构建插值多项式double result = f[0][0];for (int j = 1; j < n; j++) {double term = f[0][j];for (int i = 0; i < j; i++) {term *= (xi - x[i]);}result += term;}return result;
}int main() {// 示例数据double x[] = {0.32, 0.34, 0.36};double y[] = {0.314567, 0.333487, 0.352274};int n = sizeof(x) / sizeof(x[0]);double xi = 0.3367;// 进行插值double interpolated_value = newton_interpolation(x, y, n, xi);printf("插值结果: %f\n", interpolated_value);return 0;
}

输出:

插值结果: 0.330374

  • Lagrange插值使用基于Lagrange多项式的方法来构建插值多项式.
    • Lagrange多项式是通过将每个数据点与一个基函数相乘,并使得在其他数据点上该基函数为零来构造的。最终的插值多项式是将所有这些基函数相加得到的。
    • Lagrange插值的优点是易于理解和实现,但在数据点较多时可能会导致计算复杂度较高的问题。
  • Newton插值使用差商的概念来构建插值多项式。
    • 差商是一个递归定义的概念,用于计算插值多项式中的系数。差商的计算可以通过表格形式进行,其中每一列都表示不同阶数的差商,通过计算差商,可以逐步构建插值多项式。
    • Newton插值的优点是在计算差商时可以重复使用已计算的差商值,从而减少计算量。

这篇关于【数值计算方法(黄明游)】函数插值与曲线拟合(二):Newton插值【理论到程序】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/456442

相关文章

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

python中update()函数的用法和一些例子

《python中update()函数的用法和一些例子》update()方法是字典对象的方法,用于将一个字典中的键值对更新到另一个字典中,:本文主要介绍python中update()函数的用法和一些... 目录前言用法注意事项示例示例 1: 使用另一个字典来更新示例 2: 使用可迭代对象来更新示例 3: 使用

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.