solve_ivp - 在 double_scalars 中遇到溢出

计算科学 Python scipy
2021-12-06 15:12:19

我正在模拟一个围绕原子核运行的电子。当然,带电粒子会向外辐射能量,因此它会撞击原子核。我的方法是评估库仑力并添加反作用力(由亚伯拉罕-洛伦兹公式给出)。运动方程为

F=ma=1r2βa˙

在哪里β=23c3在我的单位中,m = 1。重新排列这个def eq来解决是

F=a˙=(1r2a)1β

我乘以xr要么yr分别获得 x 或 y 方向。实现如下

import numpy as np
from scipy.integrate import odeint, solve_ivp
import matplotlib.pyplot as plt

c = 137.0
B = ((3.0*c**3)/2.0)

def func(t, o):  # [0x, 1y, 2vx, 3vy, 4ax, 5ay]
    r = np.hypot(o[0], o[1])
    dodt = [o[2], o[3], o[4], o[5], B*o[0]*(-(1/r**3.0) - o[4]/r), B*o[1]*(-(1/r**3.0) - o[5]/r)]
    return dodt


initial = [br, 0.0, 0.0, 1.0, -1.0, 0.0]  # [x, y, vx, vy, ax, ay]
span = [0.0, 10.0]
time = np.linspace(span[0], span[1], 10000)

# %% Solve differential equation
sol = solve_ivp(fun=func, t_span=span, t_eval=time, y0=initial, dense_output=True, max_step=0.05).sol
xe, ye, xve, yve, axe, aye = sol(time)

print(xe[-1], ye[-1])
# %% Plot states
plt.plot(xe, ye)
plt.plot(xe[-1], ye[-1], 'ro')
plt.plot(xe[0], ye[0], 'yo')
axx = plt.gca()
axx.set_aspect('equal')
plt.show()

我之前使用 odeint 并收到了错误消息Excess work done on this call我知道可以使用可以处理事件的求解器来解决该错误消息,但是这些事件似乎只会在求解器中断之前终止它,但我希望它继续正常运行如果这有任何意义,就不要中断。使用 odeint 我得到以下情节

在此处输入图像描述

至少它在它应该做的原点完成,但它应该先绕过它几次。我想我的问题很明显,我怎样才能在不破坏的情况下解决颂歌?提前致谢。

编辑:我发现了问题(我认为)。当我们靠近中心时,1/r^3 变得太大并破坏了一切。但是我希望这一路走下去,我该如何解决这个问题?

1个回答

你确定这个表达式:

B*o[0]*(-(1/r**3.0) - o[4]/r), B*o[1]*(-(1/r**3.0) - o[5]/r)

作用在电子上的辐射力不相等吗

Frad=βdadt

运动方程,假设它们是二维的,这意味着我们使用两个分量向量r,v,aR2, 是

drdt=vdvdt=adadt=(Br3)r+Ba
在哪里B=1β=3c32.

你的解释是

drdt=vdvdt=adadt=B(rr3arr)