用python逼近导数

2024-03-28 13:13:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图解决以下问题。我试图先用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))

给出输出

^{pr2}$

我的编辑:

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

Tags: 代码infromimportnumpyforreturndef
1条回答
网友
1楼 · 发布于 2024-03-28 13:13:36

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

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

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

所以您需要将derivative(...)函数的结果与cos(x)的值进行比较。这会让你与众不同。然后,可以使用基本的Python函数abs(x)来获得差值的绝对值,这将得到绝对差值,这是所需的结果。对从0到20的每个j执行此操作,并将结果存储在某个位置,即数组或dict中

^{pr2}$

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

import matplotlib.pyplot as plt

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

相关问题 更多 >