从头开始实施链式规则我做错了什么?

问题描述 投票:0回答:1

我正在尝试在普通 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 - 计算导数

对于此设置,我获得以下图:

我做错了什么?

python math derivative
1个回答
0
投票

感谢@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()

现在我对微积分的理解稍微好一点。谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.