使用Python SciPy来解决ODE

时间:2014-06-02 20:55:53

标签: python numpy scipy ode

现在,当我使用scipy.integrate.ode时,我遇到了一些问题。

我想用频谱法(傅立叶变换)求解PDE,包括色散和对流项,如 du/dt = A * d^3 u / dx^3 + C * du/dx

然后从傅里叶变换,这个PDE将转换为复杂空间中的一组ODE(英国是复杂的向量)

duk/dt = (A * coeff^3  + C * coeff) * uk 
coeff = (2 * pi * i * k) / L 

k是波数,(例如,k = 0,1,2,3,-4,-3,-2,-1) i ^ 2 = -1, L是域的长度。

当我使用r = ode(uODE).set_integrator('zvode', method='adams')时,python会发出警告:

  

c ZVODE--在当前T(= R1)处,MXSTEP(= I1)步骤
         在到达TOUT之前接到这个电话         在上面的消息中,I1 = 500         在上面的消息中,R1 = 0.2191432098050D + 00

我觉得这是因为我选择的时间步长太大,但我不能减少时间步,因为每一步都是耗费我真正的问题。我还有其他方法可以解决此问题吗?

1 个答案:

答案 0 :(得分:0)

您是否考虑过象征性地解决ODE?使用Sympy,您可以输入

import sympy as sy
sy.init_printing()  # use IPython for better results

from sympy.abc import A, C, c, x, t  # variables

u = sy.Function(b'u')(x,t)
eq = sy.Eq(u.diff(t), c*u)
sl1 = sy.pde.pdsolve(eq, u)
print("The solution of:")
sy.pprint(eq)
print("was determined to be:")
sy.pprint(sl1)

print("")
print("Substituting the coefficient:")
k,L = sy.symbols("k L", real=True)
coeff = (2 * sy.pi * sy.I * k) / L
cc = (A * coeff**3  + C * coeff)
sl2 = sy.simplify(sl1.replace(c, cc))
sy.pprint(sl2)

给出以下输出:

The solution of:
∂                      
──(u(x, t)) = c⋅u(x, t)
∂t                     
was determined to be:
                c⋅t
u(x, t) = F(x)⋅ℯ   

Substituting the coefficient:
                           ⎛   2    2      2⎞ 
                -2⋅ⅈ⋅π⋅k⋅t⋅⎝4⋅π ⋅A⋅k  - C⋅L ⎠ 
                ──────────────────────────────
                               3              
                              L               
u(x, t) = F(x)⋅ℯ      

请注意,F(x)取决于您需要提供的u(x,t=0)的初始值。 使用sl2.rhs.evalf()代替数字。