拉格朗日插值(数值分析python实现)

拉格朗日插值

在这里插入图片描述

案例

设原函数𝑓(𝑥) = √𝑥。

二次拉格朗日插值
在这里插入图片描述
三次拉格朗日插值
在这里插入图片描述
四次拉格朗日插值
在这里插入图片描述

源代码
import numpy as np
import matplotlib.pyplot as plt
import math


def Lagrange(arr_x, arr_y, _x):
    l = [0 for j in range(len(arr_x))]
    result = 0
    for i in range(0, len(arr_x)):
        denominator = 1
        molecular = 1
        for j in range(0, len(arr_x)):
            if i != j:
                denominator = denominator * (arr_x[i] - arr_x[j])
                molecular = molecular * (_x - arr_x[j])
        l[i] = molecular / denominator
        result = result + l[i] * arr_y[i]
    return result


# sqrt(x)
original_x = np.arange(0, 100)
original_y = [0.0 for j in range(len(original_x))]
for i in range(len(original_x)):
    original_y[i] = math.sqrt(original_x[i])

# 插值点(1, 1) (9, 3) (81, 9)
x_arr = [1, 9, 36, 64, 81]
y_arr = [1, 3, 6, 8, 9]

# 估算f(x)的近似值
x = np.arange(0, 100)
y = [0 for j in range(len(x))]
for i in range(len(x)):
    y[i] = Lagrange(x_arr, y_arr, x[i])

plt.plot(original_x, original_y, label='f(x) = sqrt(x)', color="black")
plt.plot(x, y, label='p(x)', color="blue")
plt.scatter(x_arr, y_arr, label="The interpolation points", color="red")
plt.title("Lagrange interpolation")
plt.legend(loc="upper left")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

误差分析

在这里插入图片描述

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一个Python实现格朗实验,需要用到numpy和matplotlib库。 先定义一个函数,可以用来生成待的数据: ```python import numpy as np def f(x): return np.sin(x) x = np.linspace(0, 2*np.pi, 11) y = f(x) ``` 这里生成了一个等间距的11个点,对应的函数值使用sin函数计算。 接下来定义一个格朗函数: ```python def lagrange(x, x0, y0): n = len(x0) l = np.ones(n) for i in range(n): for j in range(n): if j != i: l[i] *= (x - x0[j]) / (x0[i] - x0[j]) return sum(y0 * l) ``` 这个函数的输入参数分别为: - x:要进行的点的横坐标 - x0:已知点的横坐标数组 - y0:已知点的纵坐标数组 函数首先计算出格朗的基函数l,然后将已知点的纵坐标与基函数相乘,最后求和得到结果。 接下来可以使用matplotlib库绘制结果: ```python import matplotlib.pyplot as plt x_new = np.linspace(0, 2*np.pi, 100) y_new = np.zeros(100) for i in range(100): y_new[i] = lagrange(x_new[i], x, y) plt.plot(x_new, y_new, label='Lagrange Interpolation') plt.plot(x, y, 'o', label='Data Points') plt.plot(x_new, f(x_new), label='True Function') plt.legend() plt.show() ``` 这里使用了np.linspace函数生成了100个等间距的点,然后对每个点进行,得到结果y_new。最后将结果、原始数据点和真实函数一起绘制出来。 完整的代码如下: ```python import numpy as np import matplotlib.pyplot as plt def f(x): return np.sin(x) def lagrange(x, x0, y0): n = len(x0) l = np.ones(n) for i in range(n): for j in range(n): if j != i: l[i] *= (x - x0[j]) / (x0[i] - x0[j]) return sum(y0 * l) x = np.linspace(0, 2*np.pi, 11) y = f(x) x_new = np.linspace(0, 2*np.pi, 100) y_new = np.zeros(100) for i in range(100): y_new[i] = lagrange(x_new[i], x, y) plt.plot(x_new, y_new, label='Lagrange Interpolation') plt.plot(x, y, 'o', label='Data Points') plt.plot(x_new, f(x_new), label='True Function') plt.legend() plt.show() ``` 运行结果如下图所示: ![格朗结果](https://i.imgur.com/Hv0zPjK.png)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值