【数值计算方法】曲线拟合与插值:Lagrange插值、Newton插值及其python/C实现

这篇具有很好参考价值的文章主要介绍了【数值计算方法】曲线拟合与插值:Lagrange插值、Newton插值及其python/C实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、近似表达方式

插值(Interpolation)

拟合(Fitting)

投影(Projection)

二、插值

1. Lagrange插值

Lagrange插值公式

线性插值(n=1)

抛物插值(n=2)

python实现

C语言实现

2. Newton插值

python实现

C语言实现


一、近似表达方式

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

  • 插值(Interpolation)

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

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

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

二、插值

        Lagrange插值和Newton插值都是常见的多项式插值方法,用于通过给定的一组数据点来估计在其他点上的函数值。它们之间的主要区别在于插值多项式的构建方法。

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

1. Lagrange插值

        Lagrange插值是一种用于通过已知数据点构造一个多项式函数的方法。它是基于拉格朗日插值多项式的原理,该多项式通过每个数据点并满足相应的条件。拉格朗日插值可用于估计数据点之间的值,而不仅仅是在给定数据点上进行插值。

        使用Lagrange插值的基本步骤如下:

  • 给定一组已知的数据点,包括横坐标和纵坐标的值。
  • 根据数据点的数量,构造相应次数的拉格朗日插值多项式。
  • 将每个数据点的函数值乘以对应的拉格朗日插值多项式,并将它们相加,得到最终的插值函数。

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

Lagrange插值公式

数值计算 曲线拟合,# 计算方法与科学建模,python,c语言,开发语言,插值,算法

线性插值(n=1)

数值计算 曲线拟合,# 计算方法与科学建模,python,c语言,开发语言,插值,算法

抛物插值(n=2)

数值计算 曲线拟合,# 计算方法与科学建模,python,c语言,开发语言,插值,算法

范德蒙行列式 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/161300510

python实现

数值计算 曲线拟合,# 计算方法与科学建模,python,c语言,开发语言,插值,算法

import numpy as np


# 定义Lagrange插值函数
def lagrange_interpolation(x, y, xi):
    n = len(x)
    yi = 0.0

    for i in range(n):
        # 计算拉格朗日插值多项式的每一项
        term = y[i]
        for j in range(n):
            if j != i:
                term *= (xi - x[j]) / (x[i] - x[j])
        yi += term

    return yi


# 示例数据点
x = np.array([0.32, 0.34, 0.36])
y = np.array([0.314567, 0.333487, 0.352274])

# 要进行插值的点
xi = 0.3367

# 进行插值
yi = lagrange_interpolation(x, y, xi)

print("插值结果:", yi)
print("真实结果:", np.sin(xi))

输出:

插值结果: 0.3303743620374999
真实结果: 0.330374191555628

C语言实现

#include <stdio.h>

// 计算Lagrange插值多项式的值
double lagrange_interpolation(double x[], double y[], int n, double xi) {
    double yi = 0.0;

    for (int i = 0; i < n; i++) {
        double term = y[i];
        for (int j = 0; j < n; j++) {
            if (j != i) {
                term *= (xi - x[j]) / (x[i] - x[j]);
            }
        }
        yi += term;
    }

    return yi;
}

int main() {
    // 示例数据点

    double x[] = {0.32, 0.34, 0.36};
    double y[] = {0.314567, 0.333487, 0.352274};

    // 要进行插值的点
    double xi = 0.3367;

    // 数据点的个数
    int n = sizeof(x) / sizeof(x[0]);

    // 进行插值
    double yi = lagrange_interpolation(x, y, n, xi);

    printf("插值结果:%f\n", yi);

    return 0;
}

输出:

插值结果:0.330374

2. Newton插值

        Newton插值基于差商的概念。通过给定的一组数据点,Newton插值可以生成一个通过这些点的多项式,从而在给定的数据范围内进行插值和外推。

        Newton插值的基本思想是使用差商来递归地构建一个多项式。差商是通过递归地计算数据点之间的差分来定义的。具体而言,对于给定的数据点 (x0, y0), (x1, y1), ..., (xn, yn),差商可以表示为:


…………
f[xn, xn-1, ..., x0] = (f[xn, xn-1, ..., x1] - f[xn-1, ..., x0]) / (xn - x0)

        然后,通过将这些差分商逐步添加到多项式中,可以得到一个多项式,表示为:

数值计算 曲线拟合,# 计算方法与科学建模,python,c语言,开发语言,插值,算法

        这个多项式可以用于在给定的数据范围内进行插值,即通过已知的数据点来估计其他点的函数值。Newton插值的优点之一是它可以通过添加更多的数据点来逐步改进插值结果。然而,它也存在一些问题,比如所得到的多项式可能会出现龙格现象(Runge's phenomenon),导致在边界处产生振荡。

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 += term

    return 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

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;
}

输出:文章来源地址https://www.toymoban.com/news/detail-786926.html

插值结果: 0.330374

到了这里,关于【数值计算方法】曲线拟合与插值:Lagrange插值、Newton插值及其python/C实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Matlab的插值问题(Lagrange插值法、三次插值多项式)

    要求 1、 利用Lagrange插值公式 L n ( x ) = ∑ k = 0 n ( ∏ i = 0 , i ≠ k n x − x i x k − x i ) y k {L_n}(x) = sumlimits_{k = 0}^n {left( {prodlimits_{i = 0,i ne k}^n {frac{{x - {x_i}}}{{{x_k} - {x_i}}}} } right)} {y_k} L n ​ ( x ) = k = 0 ∑ n ​ ( i = 0 , i  = k ∏ n ​ x k ​ − x i ​ x − x i ​ ​ ) y k ​ 编写出

    2024年02月07日
    浏览(49)
  • 计算机图形学中的曲线问题——拉格朗日插值曲线绘制实践

    限于篇幅,我们将在这篇文章中介绍拉格朗日插值曲线绘制实践,主文章链接: GGN_2015 计算机图形学中的曲线问题 在主文章中我们已经介绍了拉格朗日插值函数的绘制方法。给定一个函数必须通过的点的集合,保证任意两点 x x x 指不同,我们就能构造出一条拉格朗日插值函

    2024年02月14日
    浏览(46)
  • matlab 矩阵处理方法:缩放、插值、拟合、分块...

    目录 1. 缩放矩阵尺寸 2. 对矩阵进行反距离权重插值填补nan值 3. 数据拟合 4. 数组大小超过限制(分块处理) 在MATLAB中,可以使用 imresize 函数对矩阵进行缩放尺寸操作。 imresize 函数用于调整图像或矩阵的尺寸,可以按比例缩小或放大矩阵。 其中: A 是原始矩阵或图像。 sca

    2024年02月11日
    浏览(33)
  • 【MATLAB 数学建模】 插值方法 数据拟合

    一维插值是一种在给定有限数据点集合的情况下,通过构建一个函数来近似估计这些数据点之间的值。它基于假设,在相邻数据点之间存在某种连续性或平滑性。 一维插值常用于曲线拟合、曲线重建和数据补全等应用中。其中最简单的一种插值方法是线性插值,即通过连接相

    2024年02月08日
    浏览(55)
  • 数值计算大作业:最小二乘法拟合(Matlab实现)

        作为研究生的入门课,数值计算的大作业算是所有研究生开学的重要编程作业。      我把最小二乘算法在MATLAB中整合成了一个M函数文件least square fitting.m,直线拟合函数lsf_linear.m,以及抛物线拟合函数lsf_parabolic.m。程序放在文章最后了,需要的同学自取。下文为作业详

    2024年02月07日
    浏览(41)
  • 【MATLAB】matlab曲线拟合与矩阵计算技巧

    目录 1.曲线拟合定义 2.数据预处理 3.数据拟合 4.数据拟合matlab编程例子 5.数据拟合函数表 6.matlab中常用插值方法 7.矩阵的特征值分解         在实际工程应用和科学实践中,经常需要寻求两个(或多个)变量间的关系,而实际去只能 通过观测得到一些离散的数据点。针对这

    2024年02月02日
    浏览(45)
  • Matlab 拉格朗日(lagrange)插值 以及 poly、conv函数理解

    https://songshanhu.csdn.net/643f5384986c660f3cf93c13.html?spm=1001.2101.3001.6661.1utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Eactivity-1-36407923-blog-83212763.235%5Ev32%5Epc_relevant_increate_t0_download_v2depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Eactivity-1

    2024年02月07日
    浏览(43)
  • Lagrange插值法实验:求拉格朗日插值多项式和对应x的近似值matlab实现(内附代码)

    已知函数表: 求出Lagrange 插值多项式,并计算x=1.2处的y的近似值。 求解多项式: 求解近似值: 请输入横坐标向量X: X=[1, 2, 4, 5] 请输入纵坐标向量Y: Y=[16,12,8,9] 基函数为: q1(x)=(11 x^2)/12 - (19 x)/6 - x^3/12 + 10/3 q2(x)=(29 x)/6 - (5 x^2)/3 + x^3/6 - 10/3 q3(x)=(4 x^2)/3 - (17 x)/6 - x^3/6 + 5/3 q4(x)=

    2024年02月08日
    浏览(52)
  • Opencv(C++)学习之 一种用opencv实现高斯曲线拟合的方法

    项目中需要实现数据的高斯拟合,进而提取数据中标准差,手头只有opencv库,经过资料查找验证,总结该方法。 1、opencv中solve可以实现对矩阵参数的求解; 2、线的拟合就是对多项式参数求解的过程,多项式可表示为矩阵形式; 3、高斯公式中的指数幂,可以通过取对数的方

    2024年02月21日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包