【发布时间】:2018-09-20 18:06:35
【问题描述】:
我正在尝试学习如何将 python SymPy 与 SciPy 集成以数值求解常微分方程。但是,对于如何将一阶 ODE 系统的 SymPy 形式实际转换为我可以使用 scipy.integrate.odeint() 处理的格式,我有点迷茫。
注意,有些人认为这与另一篇文章类似,但事实并非如此。另一个帖子在这里。
Convert sympy expressions to function of numpy arrays
所以这篇文章是一个更复杂的案例,用户希望使用 Theano 或其他一些库来加速 ODE 的计算。我只是想了解 SymPy 和 SciPy 之间的基本接口,所以这篇其他帖子根本没有帮助。
作为一个玩具示例,我使用 Lotka-Volterra 方程来测试 SymPy 的使用。方程式是:
我可以用 Scipy 以传统的方式解决这个问题,它可以工作。这是工作代码。
import numpy as np
import scipy
from scipy.integrate import odeint, ode, solve_ivp
import sympy
import matplotlib.pyplot as plt
sympy.init_printing()
def F_direct(X, t, args):
F = np.zeros(2)
a, b, c, d = args
x,y = X
F[0] = a*x - b*x*y
F[1] = c*x*y- d*y
return F
argst = [0.4,0.002,0.001,0.7]
xy0 = [600, 400]
t = np.linspace(0, 50, 250)
xy_t, infodict = odeint(F_direct, xy0, t, args=(argst,), full_output=True)
plt.plot(t, xy_t[:,1], 'o', t, xy_t[:,0])
plt.grid(True)
plt.xlabel('x'); plt.ylabel('y')
plt.legend(('Numerical', 'Exact'), loc=0)
plt.show()
现在我对如何使用 SymPy 做到这一点有点迷茫。我知道需要做什么,但不知道如何进行。我发现的唯一例子太复杂了,无法学习。这是我所拥有的。
x, y, a, b, c, d = sympy.symbols('x y a b c d')
t = np.linspace(0, 50, 250)
ode1 = sympy.Eq(a*x - b*x*y)
ode2 = sympy.Eq(c*x*y - d*y)
我应该将这些方程放入某种系统形式,然后使用sympy.lambdify 函数返回一个我可以传递给odeint 的新函数
那么任何人都可以在这里填写有关我如何设置此ode1,ode2 系统以使用 SymPy 进行处理的空白。
【问题讨论】:
-
this question 是您的副本吗?
-
@Warren 感谢您找到这个额外的问题。我认为您发布的问题比我正在做的要高级一些。我试图解决一个相对简单的 ODE 来学习 API。在您发布的问题中,用户正在尝试使用 GPU 等来加速数值解的计算。所以我可以使用那个更复杂的答案中的东西,直到我明白如何先做这个更简单的答案。