gpt4 book ai didi

python - 向量化微分方程组的正向欧拉法

转载 作者:太空狗 更新时间:2023-10-29 21:46:24 25 4
gpt4 key购买 nike

我正在对一阶微分方程组的 x(t) 进行数值求解。该系统是:

dx/dt = y
dy/dt = -x - a*y(x^2 + y^2 -1)

我已经实现了正向欧拉方法来解决这个问题,如下所示:

def forward_euler():
h = 0.01
num_steps = 10000

x = np.zeros([num_steps + 1, 2]) # steps, number of solutions
y = np.zeros([num_steps + 1, 2])
a = 1.

x[0, 0] = 10. # initial condition 1st solution
y[0, 0] = 5.

x[0, 1] = 0. # initial condition 2nd solution
y[0, 1] = 0.0000000001

for step in xrange(num_steps):
x[step + 1] = x[step] + h * y[step]
y[step + 1] = y[step] + h * (-x[step] - a * y[step] * (x[step] ** 2 + y[step] ** 2 - 1))

return x, y

现在我想进一步向量化代码并将 x 和 y 保存在同一个数组中,我想出了以下解决方案:

def forward_euler_vector():
num_steps = 10000
h = 0.01

x = np.zeros([num_steps + 1, 2, 2]) # steps, variables, number of solutions
a = 1.

x[0, 0, 0] = 10. # initial conditions 1st solution
x[0, 1, 0] = 5.

x[0, 0, 1] = 0. # initial conditions 2nd solution
x[0, 1, 1] = 0.0000000001

def f(x):
return np.array([x[1],
-x[0] - a * x[1] * (x[0] ** 2 + x[1] ** 2 - 1)])

for step in xrange(num_steps):
x[step + 1] = x[step] + h * f(x[step])

return x

问题:forward_euler_vector() 有效,但这是向量化它的最佳方式吗?我问是因为矢量化版本在我的笔记本电脑上运行速度慢了大约 20 毫秒:

In [27]: %timeit forward_euler()
1 loops, best of 3: 301 ms per loop

In [65]: %timeit forward_euler_vector()
1 loops, best of 3: 320 ms per loop

最佳答案

总是有简单的 autojit 解决方案:

def forward_euler(initial_x, initial_y, num_steps, h):

x = np.zeros([num_steps + 1, 2]) # steps, number of solutions
y = np.zeros([num_steps + 1, 2])
a = 1.

x[0, 0] = initial_x[0] # initial condition 1st solution
y[0, 0] = initial_y[0]

x[0, 1] = initial_x[1] # initial condition 2nd solution
y[0, 1] = initial_y[1]

for step in xrange(int(num_steps)):
x[step + 1] = x[step] + h * y[step]
y[step + 1] = y[step] + h * (-x[step] - a * y[step] * (x[step] ** 2 + y[step] ** 2 - 1))

return x, y

时间:

from numba import autojit
jit_forward_euler = autojit(forward_euler)

%timeit forward_euler([10,0], [5,0.0000000001], 1E4, 0.01)
1 loops, best of 3: 385 ms per loop

%timeit jit_forward_euler([10,0], [5,0.0000000001], 1E4, 0.01)
100 loops, best of 3: 3.51 ms per loop

关于python - 向量化微分方程组的正向欧拉法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23679373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com