Реализация метода Эйлера
Пытался реализовать метод Эйлера для своей системы оду, но график получается возрастающим, вместо затухающего.Пытался найти ошибки самостоятельно, но безрезультатно.
Код прилагается.
import numpy as np
import matplotlib.pyplot as plt
w = 1.0 #frequency of oscillation
x_0 = 1.0 #initial position
h = 0.6 #step size
t_0 = 0 #starting time
n = 20
t = np.arange(t_0, n, h) #t = t_0 + nh (h has units of seconds)
y = np.array([[0.0, 0.0]]*len(t))
y_0 = 1
g = 0
w = 1
def x(y_0):
return y_0
def x_prime(t, x_0, w):
return -2*y_0*g-w*w*x_0
def f(t,y):
x, dotx = y
return np.array([ dotx, -w**2*x])
y[0] = [x_0, 0.0]
for i in range(1, len(t)):
y[i] = y[i-1] + f(t[i-1],y[i-1]) * h
xlist = [item[0] for item in y] #list of x values at each t value
vlist = [item[1] for item in y] #list of velocity values at each t value
plt.plot(t, xlist, label='Euler approximation')
plt.xlabel('t')
plt.ylabel('x(t)')
plt.legend(loc='upper right')
plt.show()