有没有办法区分功能?
Is there a way to differentiate a function?
假设我定义了一个函数
def func(x):
return x**2;
有没有方法 XXX 以 "func" 作为参数,returns 另一个函数是导数?例如,
dfunc = XXX(func);
print(dfunc(3))
给我 6 个。
我的作业需要一个函数returns第一类贝塞尔函数的导数>
有两种方法可以做到这一点:
使用符号数学,基本上就像对代数表达式进行编码,然后让计算机计算出导数的解析表达式;这些可能非常强大,但仅限于某些类型的问题:
https://www.sympy.org/en/index.html
使用有限差分。这是一个非常普遍和强大的概念,它建立在使用 delta_x 小且有限而不是趋于零的导数定义的想法之上:
https://en.wikipedia.org/wiki/Finite_difference
对于您的特定问题,可以这样做,例如:
import numpy as np
import matplotlib.pyplot as plt
def func(x):
return x**2
def finiteDifference(f, limits, deltaX):
# create values of the function at specific locations
x = np.arange(limits[0], limits[1]+deltaX, deltaX)
y = np.zeros(len(x))
for i in range(len(x)):
y[i] = f(x[i])
# construct the derivative
dydx = np.zeros(len(x))
# first order at the ends
dydx[0] = (y[1]-y[0]) / deltaX
dydx[-1] = (y[-1]-y[-2]) / deltaX
# central 2nd order elsewhere
for i in range(1, len(x)-1):
dydx[i] = (y[i+1] - y[i-1]) / (2.*deltaX)
return x, y, dydx
x, y, dydx = finiteDifference(func, (-2, 2), 0.1)
plt.plot(x, y, "r-", x, dydx, "b-", lw=2)
# compare with analytical f'=2x
plt.plot(x, 2.*x, "gx", ms=5, mew=2)
plt.show()
假设我定义了一个函数
def func(x):
return x**2;
有没有方法 XXX 以 "func" 作为参数,returns 另一个函数是导数?例如,
dfunc = XXX(func);
print(dfunc(3))
给我 6 个。
我的作业需要一个函数returns第一类贝塞尔函数的导数>
有两种方法可以做到这一点:
使用符号数学,基本上就像对代数表达式进行编码,然后让计算机计算出导数的解析表达式;这些可能非常强大,但仅限于某些类型的问题: https://www.sympy.org/en/index.html
使用有限差分。这是一个非常普遍和强大的概念,它建立在使用 delta_x 小且有限而不是趋于零的导数定义的想法之上: https://en.wikipedia.org/wiki/Finite_difference
对于您的特定问题,可以这样做,例如:
import numpy as np
import matplotlib.pyplot as plt
def func(x):
return x**2
def finiteDifference(f, limits, deltaX):
# create values of the function at specific locations
x = np.arange(limits[0], limits[1]+deltaX, deltaX)
y = np.zeros(len(x))
for i in range(len(x)):
y[i] = f(x[i])
# construct the derivative
dydx = np.zeros(len(x))
# first order at the ends
dydx[0] = (y[1]-y[0]) / deltaX
dydx[-1] = (y[-1]-y[-2]) / deltaX
# central 2nd order elsewhere
for i in range(1, len(x)-1):
dydx[i] = (y[i+1] - y[i-1]) / (2.*deltaX)
return x, y, dydx
x, y, dydx = finiteDifference(func, (-2, 2), 0.1)
plt.plot(x, y, "r-", x, dydx, "b-", lw=2)
# compare with analytical f'=2x
plt.plot(x, 2.*x, "gx", ms=5, mew=2)
plt.show()