我正在尝试在普通 Python 中实现 chain rule。这是我的 colab 中的代码:
def calc_derivative(func, x, dx):
return (func(x + dx) - func(x)) / dx
def chain_diff(func1, func2, x, dx):
return calc_derivative(func1(func2), x, dx) * calc_derivative(func2, x, dx)
def func1(f):
g = np.log
def apply(x):
return g(f(x))
return apply
def func2(x):
return x ** 4
span = 100
y, dy = [], []
tst = []
for x in range(1, span):
x *= .1
dx = np.sqrt(2e-15) * x
dy.append(chain_diff(func1, func2, x, dx))
y.append(func1(func2)(x))
tst.append(4 / x)
plt.plot(dy)
plt.plot(tst)
plt.plot(y)
plt.ylim((-10, 10))
plt.legend(("$dy$", "tst plot","y"))
plt.show()
tst - 基线导数
dy - 计算导数
对于此设置,我获得以下图:
我做错了什么?
感谢@teapot418,我发现了一个问题。我应该将 dx 添加到外部函数 (func1) 的参数中,而不是将其添加到内部函数 (func2) 中。这就是为什么我的代码变成如下:
def chain_diff(func1, func2, x, dx):
return calc_derivative(func1(func2), x, dx) * calc_derivative(func2, x, dx)
def func1(f):
g = np.log
def apply(x, dx):
return g(f(x, 0) + dx)
return apply
def func2(x, dx):
return (x + dx) ** 4
def calc_derivative(func, x, dx):
return (func(x, dx) - func(x, 0)) / dx
span = 100
y, dy = [], []
tst = []
for x in range(1, span):
x *= .1
dx = np.sqrt(2e-15) * x
dy.append(chain_diff(func1, func2, x, dx))
y.append(func1(func2)(x, 0))
tst.append(4 / x)
plt.plot(dy)
plt.plot(tst)
plt.plot(y)
plt.ylim((-10, 10))
plt.legend(("$dy$", "tst plot","y"))
plt.show()
现在我对微积分的理解稍微好一点。谢谢!