使用 python 逼近导数

Approximating derivatives using python

我试图解决以下问题。我尝试首先使用 0.1 设置步长 h 来解决它。但是我需要在我的代码中更改它并使用 for 循环遍历值 0,1,..,20。我有点困惑如何解决这个问题,但我希望能得到一些帮助来修复我到目前为止生成的代码。谢谢!

import numpy as np
from math import sin

def derivative(func , x, h ):
    for h in range(20):
    return (func(x+h)-func(x))/h

def f(x):
    return sin(x)

print(derivative(f, pi/4))

给出输出

0.6706029729039897

我的编辑:

def derivative(func , x, h ):
    for h in range(20):
    return (func(x+h)-func(x))/h

该练习要求您使用不同的精度(使用变量 h 表示)计算导数,并将其与函数的 exact/real 导数进行比较。

h = 10 ^ -j,其中 j 从 0 到 20 不等。这意味着 h 将(离散地)从 10⁻⁰ 到 10⁻²⁰。您可以为此使用 for 循环和 range(...) 函数。然后将其传递给 derivative 函数(您可以将第三个参数传递给 h 的值)

def derivative(func, x, h):
    return (func(x + h) - func(x)) / h

接下来,您需要将其与 exact 导数进行比较。函数 f(x) = sin(x) 有一个已知的(精确的)导数,即 cos(x)。在数学符号中,d(sin x)/dx = cos x。这意味着对于任何 xcos(x) 都会为您提供 sinx 处的精确导数。

所以你需要比较derivative(...)函数的结果和cos(x)的值。这会给你带来不同。然后,您可以使用基本的 Python 函数 abs(x) 来获取该差值的绝对值,这将为您提供绝对差值,这就是您想要的结果。对从 0 到 20 的每个 j 执行此操作,并将结果存储在某个地方,数组或字典中。

from math import sin, cos, pi

x = pi / 4
diffs = {}

for j in range(21): # range is exclusive so range(21) will stop at 20
    h = 10 ** -j
    deriv = derivative(sin, x, h)
    exact = cos(x)
    diff = abs(deriv - exact)
    diffs[h] = diff

然后,您可以使用 pyplot 的 loglog 函数在图表上绘制这些结果,将 range(...) 结果作为 X 传递,将包含结果的数组作为 Y 传递。

import matplotlib.pyplot as plt

ordered = sorted(diffs.items())
x, y = zip(*ordered)
plt.loglog(x, y)