现在,当我使用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
我觉得这是因为我选择的时间步长太大,但我不能减少时间步,因为每一步都是耗费我真正的问题。我还有其他方法可以解决此问题吗?
答案 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()
代替数字。