Я пытаюсь реализовать числовую производную более высокого порядка, используя рекурсию. Я не вижу, что не так с моим кодом.
Чтобы уточнить, я хочу вычислить dy^n/dx^n
.
import numpy as np
import matplotlib.pyplot as plt
def derivative(x,y,n):
if(n==1):
return np.gradient(y,x)
else:
return derivative(x,y,n-1)
a=0
b=10
N_points=10000
x=np.linspace(a,b,N_points)
y=np.cos(x)
plt.figure()
plt.plot(x,y,label="f(x)")
for n in range(1,8):
plt.plot(x,derivative(x,y,n),label="fprime(x)")
plt.legend()
plt.title("function and derivative")
Я улучшил свой код до
import numpy as np
import matplotlib.pyplot as plt
def derivative(x,y,n):
if(n==1):
return np.gradient(y,x)
else:
return np.gradient(derivative(x,y,n-1),x)
a=0
b=10
N_points=10000
x=np.linspace(a,b,N_points, dtype=float)
y=np.cos(x, dtype=float)
plt.figure()
plt.plot(x,y,label="f(x)")
n_max=7
for n in range(1,n_max):
yprime=derivative(x,y,n)
yprime[0:n]=yprime[n]
yprime[-n:]=yprime[-n-1]
plt.plot(x,yprime,label=f"fprime{n}(x)")
plt.legend()
plt.title("function and derivative")
Теперь, для n_max<=5
все выглядит так, как должно. Но для n_max
больше, чем это, производные начинают выглядеть очень шумно. Что происходит? И может ли это быть проблемой с типами данных?