用Runge-Kutta方法解决库仑定律问题

时间:2019-05-21 23:35:33

标签: python physics runge-kutta

我正在尝试使用Euler方法和Runge-Kutta四阶方法模拟二维两次充电的情况。使用这两种方法,我都得到了相对预期的答案。但是我从未尝试过在不同的初始条件下使用RK4方法。

从正的初始速度vx0和负的初始x位置x0开始,该代码似乎正常工作。但是当我翻转它们使vx0为负且x0为正时,当它们应该对称时,我会得到不同的答案。

我确保我的Euler方法适用于两种初始条件变化,以确认问题出在我的RK4函数上。最初,我很难为二维运动应用RK4方法,因此出现此错误也不足为奇。下面的图像可能使问题更清晰。

enter image description here

这里是我计算常数的地方:

# Initial conditions
time[0] = t = t0
vx1[0] = vx = vx0
vy1[0] = vy = vy0
x1[0] = x = x0
y1[0] = y = y0

for i in range(1, n + 1):
    # Calculate our constants
    k1vx = step * ax(x, y, q1, q2, m)
    k1vy = step * ay(x, y, q1, q2, m)
    k1x = step * vx
    k1y = step * vy
    k2vx = step * ax(x + 0.5 * k1x, y + 0.5 * k1y, q1, q2, m)
    k2vy = step * ay(x + 0.5 * k1x, y + 0.5 * k1y, q1, q2, m)
    k2x = step * (vx + (k1vx / 2))
    k2y = step * (vy + (k1vy / 2))
    k3vx = step * ax(x + 0.5 * k2x, y + 0.5 * k2y, q1, q2, m)
    k3vy = step * ay(x + 0.5 * k2x, y + 0.5 * k2y, q1, q2, m)
    k3x = step * (vx + (k2vx / 2))
    k3y = step * (vy + (k2vy / 2))
    k4vx = step * ax(x + k3x, y + k3y, q1, q2, m)
    k4vy = step * ay(x + k3x, y + k3y, q1, q2, m)
    k4x = step * (vx + k3vx)
    k4y = step * (vy + k3vy)

    # Update the values based on our calculated constants
    vx1[i] = vx = vx + (k1vx + k2vx + k2vx + k3vx + k3vx + k4vx) / 6
    vy1[i] = vy = vy + (k1vx + k2vy + k2vy + k3vy + k3vy + k4vy) / 6
    x1[i] = x = x + ((k1x + 2 * k2x + 2 * k3x + k4x) / 6)
    y1[i] = y = y + ((k1y + 2 * k2y + 2 * k3y + k4y) / 6)

    # Update the time
    time[i] = t = t0 + i * step

这是我在前面的代码中用于ax和ay的功能

def accel_rk4_x(x, y, q1, q2, m):
    const = (q1 * q2) / (4 * math.pi * 8.854e-12 * m)
    return const * (x / ((x ** 2 + y ** 2) ** 1.5))


def accel_rk4_y(x, y, q1, q2, m):
    const = (q1 * q2) / (4 * math.pi * 8.854e-12 * m)
    return const * (y / ((x ** 2 + y ** 2) ** 1.5))

感谢您对这个问题的任何帮助!我可能只需要再看一眼。

0 个答案:

没有答案