Кажется, что функция Python odeint не работает
Я хочу изучить движение заряженной частицы во время путешествия через магнитное поле, моделируя его с помощью Python. Я попытался использовать функцию odeint из scipy.integrate, и она не работает так, как я ожидал. Вот что я ожидал, учитывая начальное условие:
Но вот что я получил с помощью симуляции:
Проблема заключается в моей реализации функции odeint. Любая помощь приветствуется.
Вот мой код:
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
from mpl_toolkits.mplot3d import Axes3D
def vect_prod(u, v):
return np.array([u[1] * v[2] - u[2] * v[1], u[2] * v[0] - u[0] * v[2], u[0] * v[1] - u[1] * v[0]])
def dy(y, t):
x1, Vx, y1, Vy, z1, Vz = y
F = q * (E + vect_prod(np.array([Vx, Vy, Vz]), B))
dy = [Vx, Vx - F[0] / m, Vy, Vy - F[1] / m, Vz, Vz - F[2] / m]
return dy
E = np.array([0, 0, 0])
B = np.array([0, 0, 1])
q = 1
m = 1
a = 0.04
cond = [0, 1, 0, 1, 0, 1]
t = np.arange(0, 100, 0.1)
sol = odeint(dy, cond, t)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
plt.plot(sol[:, 0], sol[:, 2], sol[:, 4])
plt.show()
Любая помощь будет оценена!
1 ответ
Хорошо, я думаю, что твоя проблема в том, что ты вкладываешь в функцию "dy". Производная Vx-композитанта не Vx - F[0] / м, а просто F [0] / м, потому что F [0] / м - это ваше ускорение по оси x. Вы сделали ту же ошибку на Y и Z. Я думаю, что вы сделали путаницу с движением с воздушным трением, где ускорение имеет такую форму. Вот как должна выглядеть ваша функция dy:
def dy(y, t):
x1, Vx, y1, Vy, z1, Vz = y
F = q * (E + vect_prod(np.array([Vx, Vy, Vz]), B))
dy = [Vx, F[0] / m, Vy, F[1] / m, Vz, F[2] / m]
return dy
Я думаю, что масса слишком велика
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
from mpl_toolkits.mplot3d import Axes3D
def vect_prod(u, v):
return np.array([u[1] * v[2] - u[2] * v[1], u[2] * v[0] - u[0] * v[2], u[0] * v[1] - u[1] * v[0]])
def dy(y, t):
x1, Vx, y1, Vy, z1, Vz = y
F = q * (E + vect_prod(np.array([Vx, Vy, Vz]), B))
dy = [Vx, Vx - F[0] / m, Vy, Vy - F[1] / m, Vz, Vz - F[2] / m]
return dy
E = np.array([0, 0, 0])
B = np.array([0, 0, 1])
q = 1
m = 0.001
a = 0.04
cond = [0, 1, 0, 1, 0, 1]
t = np.arange(0, 0.05, 0.0001)
sol = odeint(dy, cond, t)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
plt.plot(sol[:, 0], sol[:, 2], sol[:, 4])
plt.show()
выход: