使用python近似导数

时间:2018-09-29 18:17:55

标签: python graph numerical-methods derivative

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

enter image description here

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

1 个答案:

答案 0 :(得分:1)

本练习要求您使用变化的精度(使用变量h表示)来计算导数,并将其与函数的精确/实数导数进行比较。

h = 10 ^ -j,其中j的范围从0到20。这意味着h将(离散地)从10 go变为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)