我试图解决以下问题。我首先尝试使用设置为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
答案 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
。这意味着对于任何x
,cos(x)
都会为您提供sin
上x
的确切派生词。
因此,您需要将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)