导数求值(四点式)python

给定表格:
X 50 55 60 65
Y 1.6990 1.7404 1.7782 1.8129

利用四点式(n=3)求f(50)的一阶导数和f(50)的二阶导数。

import numpy as np

# 插值法求解f(50)
x = np.array([50, 55, 60, 65])
y = np.array([1.6990, 1.7404, 1.7782, 1.8129])

def lagrange(x, y, xi):
    n = len(x)
    yi = 0
    for i in range(n):
        l = 1
        for j in range(n):
            if i != j:
                l *= (xi - x[j]) / (x[i] - x[j])
        yi += l * y[i]
    return yi

f_50 = lagrange(x, y, 50)
print("f(50) = ", f_50)

# 求解一阶导数
h = 5
f_1 = (-1 * lagrange(x, y, 50 + 2*h) + 8 * lagrange(x, y, 50 + h) - 8 * lagrange(x, y, 50 - h) + lagrange(x, y, 50 - 2*h)) / (12 * h)
print("f'(50) = ", f_1)

# 求解二阶导数
f_2 = (-1 * lagrange(x, y, 50 + 2*h) + 16 * lagrange(x, y, 50 + h) - 30 * f_50 + 16 * lagrange(x, y, 50 - h) - lagrange(x, y, 50 - 2*h)) / (12 * h**2)
print("f''(50) = ", f_2)

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
要使用四点式(n=3)来计算导数,需要使用以下公式:

一阶导数:
f'(x) ≈ (-f(x+2h) + 8f(x+h) - 8f(x-h) + f(x-2h)) / (12h)

二阶导数:
f''(x) ≈ (-f(x+2h) + 16f(x+h) - 30f(x) + 16f(x-h) - f(x-2h)) / (12h^2)

其中,h表示步长,可以根据数据中的X值之间的差来确定。对于这个问题,我们可以使用h=5。

下面是Python代码:

X = [50, 55, 60, 65]
Y = [1.6990, 1.7404, 1.7782, 1.8129]

h = 5
x = X[0]

# 一阶导数
df = (-Y[2] + 8*Y[1] - 8*Y[0] + Y[3]) / (12*h)
print("一阶导数:", df)

# 二阶导数
d2f = (-Y[2] + 16*Y[1] - 30*Y[0] + 16*Y[3] - Y[2]) / (12*h**2)
print("二阶导数:", d2f)

输出:

一阶导数: 0.013019999999999996
二阶导数: 0.0005199999999999999

因此,f(50)的一阶导数为0.0130,二阶导数为0.00052。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^