在Python中对数组中的点x进行Hermite_e系列的评估

  • Post category:Python

在Python中对数组中的点x进行Hermite_e系列的评估,可以按照以下步骤进行:

  1. 导入必要的库

要进行Hermite_e系列的评估,需要使用到numpy库中的polynomial模块。因此需要使用以下代码导入numpy库与polynomial模块。

import numpy as np
from numpy.polynomial import polynomial as P
  1. 定义输入的数组和个数

需要定义输入的数组x和个数n。假设输入的数组为x,其长度为n。

x = np.array([0.2, 0.5, 0.8, 1.0])
n = len(x)
  1. 声明需要计算的值

需要声明需要计算的值xp。xp可以是一个数字或一个数组,表示需要在x上进行插值的位置,如果xp是一个数组,则需要对每一个位置进行插值。

xp = 0.6
  1. 计算差商并传入多项式求解函数中

Hermite_e系列的评估需要先计算差商,其中一种方式是使用numpy库的polyfit函数。首先,使用以下代码计算二阶差商:

f1 = np.array([(P.polyval(xp, P.polyder(P.polyfit(x, [1, 0]))), P.polyfit(x, [1, 0], w=np.ones(n)))], float)
f2 = np.array([(P.polyval(xp, P.polyder(P.polyfit(x, [0, 1, 0]))), P.polyfit(x, [0, 1, 0], w=np.ones(n)))], float)
fd1 = np.array([(P.polyval(xp, P.polyder(P.polyfit(x, [0, 0, 2, 0]))), P.polyfit(x, [0, 0, 2, 0], w=np.ones(n)))], float)
fd2 = np.array([(P.polyval(xp, P.polyder(P.polyfit(x, [0, 0, 0, 6, 0]))), P.polyfit(x, [0, 0, 0, 6, 0], w=np.ones(n)))], float)

d = np.concatenate((f1, f2, fd1, fd2), axis=0)

以上代码计算了四个一维数组,并将其组合成一个二维数组d。其中,f1和f2分别表示f的一阶和二阶导数的取值和系数,fd1和fd2分别表示f的一阶和二阶导数的导数的取值和系数。

  1. 使用Poly类进行多项式求解

使用d中的系数和值构建一个多项式,并用该多项式进行求解。其中,需要使用numpy库中的poly1d类来表示多项式,使用其coeffs属性设置多项式的系数。

poly = P.poly1d(d[:,1])
poly.coeffs = d[:,0]

result = P.polyval(xp, poly)

该代码将多项式的系数设置为d中的系数,然后使用polyval函数针对xp进行多项式求解得到result。

示例1:计算单个点的Hermite_e系列插值值

import numpy as np
from numpy.polynomial import polynomial as P

# 定义输入的数组和个数
x = np.array([0.2, 0.5, 0.8, 1.0])
n = len(x)

# 声明需要计算的值
xp = 0.6

# 计算差商并传入多项式求解函数中
f1 = np.array([(P.polyval(xp, P.polyder(P.polyfit(x, [1, 0]))), P.polyfit(x, [1, 0], w=np.ones(n)))], float)
f2 = np.array([(P.polyval(xp, P.polyder(P.polyfit(x, [0, 1, 0]))), P.polyfit(x, [0, 1, 0], w=np.ones(n)))], float)
fd1 = np.array([(P.polyval(xp, P.polyder(P.polyfit(x, [0, 0, 2, 0]))), P.polyfit(x, [0, 0, 2, 0], w=np.ones(n)))], float)
fd2 = np.array([(P.polyval(xp, P.polyder(P.polyfit(x, [0, 0, 0, 6, 0]))), P.polyfit(x, [0, 0, 0, 6, 0], w=np.ones(n)))], float)

d = np.concatenate((f1, f2, fd1, fd2), axis=0)

# 使用Poly类进行多项式求解
poly = P.poly1d(d[:,1])
poly.coeffs = d[:,0]

result = P.polyval(xp, poly)
print("result: ", result)

示例2:计算多个点的Hermite_e系列插值值

import numpy as np
from numpy.polynomial import polynomial as P

# 定义输入的数组和个数
x = np.array([0.2, 0.5, 0.8, 1.0])
n = len(x)

# 声明需要计算的值
xp = np.array([0.6, 0.3, 0.9])

# 计算差商并传入多项式求解函数中
f1 = np.array([(P.polyval(xp, P.polyder(P.polyfit(x, [1, 0]))), P.polyfit(x, [1, 0], w=np.ones(n)))], float)
f2 = np.array([(P.polyval(xp, P.polyder(P.polyfit(x, [0, 1, 0]))), P.polyfit(x, [0, 1, 0], w=np.ones(n)))], float)
fd1 = np.array([(P.polyval(xp, P.polyder(P.polyfit(x, [0, 0, 2, 0]))), P.polyfit(x, [0, 0, 2, 0], w=np.ones(n)))], float)
fd2 = np.array([(P.polyval(xp, P.polyder(P.polyfit(x, [0, 0, 0, 6, 0]))), P.polyfit(x, [0, 0, 0, 6, 0], w=np.ones(n)))], float)

d = np.concatenate((f1, f2, fd1, fd2), axis=0)

# 使用Poly类进行多项式求解
poly = P.poly1d(d[:,1])
poly.coeffs = d[:,0]

result = P.polyval(xp, poly)
print("result: ", result)