是否有可能在Python中使用sympy来解决PDE系统?

问题描述 投票:2回答:2

假设您有一个耦合偏微分方程系统,例如

F(a,b)中的第一个PDE

F(a,b)中的第二个PDE

以下代码能够分别解决每个PDE:

import numpy as np
import sympy as sp

# definition of variables
a, b = sp.symbols('a b')
f = sp.Function('f')
F = f(a, b)
Fda = F.diff(a)
Fdb = F.diff(b)

# definition of PDEs
eq1 = Fda - 2
eq2 = Fda + Fdb + 2

# solution of separated PDEs
sp.pprint(sp.pdsolve(eq1))
sp.pprint(sp.pdsolve(eq2))

是否有可能解决偏微分方程系统?语法类似于sp.pprint(sp.pdsolve([eq1, eq2]))。我试过[eq1, eq2]{eq1, eq2}np.array([eq1, eq2])等。我看了help(sp.pdsolve)help(sp.pde),但还没有找到解决方案。

python sympy equation pde
2个回答
3
投票

不,没有实现偏微分方程系统的解。实际实施的内容:

  1. 求解具有常系数的一阶线性PDE:解的一般形式是已知的并且在求解器中是硬编码的;解算器返回它,插入给定的系数。
  2. 通过将具有可变系数的一阶线性PDE转换为ODE(称为特征方法)来求解。仅限单个PDE。

旁白:我对PDE的符号解决方案持怀疑态度,尤其是系统。这不仅仅是在精心编写的教科书示例之外发生的事情。教科书配方适用(教科书问题),或者隐藏的结构可以用人类的聪明才智(罕见)发现,或者没有找到符号解决方案。


1
投票

由于您的系统是可分离的,因此可以使用dsolve解决。但是,dsolve目前不喜欢像f(a, b)这样的东西,所以你需要手动解决切片。您还需要使用函数手动替换常量:

>>> fa, fb = symbols('fa fb', cls=Function)
>>> eq1 = fb(a).diff(a) - 2
>>> eq2 = fb(a).diff(a) - fa(b).diff(b) + 2
>>> dsolve(eq1, fb(a))
Eq(fb(a), C1 + 2*a)
>>> fbsol = dsolve(eq1, fb(a)).subs(Symbol("C1"), Function("Ca")(b))
>>> fbsol
Eq(fb(a), 2*a + Ca(b))
>>> eq2.subs(*fbsol.args).doit()
Derivative(fa(b), b) + 4
>>> fasol = dsolve(eq2.subs(*fbsol.args).doit(), fa(b)).subs(Symbol("C1"), Function("Cb")(a))
>>> fasol
Eq(fa(b), -4*b + Cb(a))
>>> fbsol
Eq(fb(a), 2*a + Ca(b))

从这里应该很清楚,Cb(a) = 2*a + CCa(b) = -4*b + C,给你解决方案f(a, b) = 2*a - 4*b + C,你可以检查满足原始。

这绝对是pdsolve能够自动完成的事情,但目前还没有实现。

© www.soinside.com 2019 - 2024. All rights reserved.