【问题标题】:Is it possible to solve a system of PDEs using sympy in Python?是否可以在 Python 中使用 sympy 解决 PDE 系统?
【发布时间】:2017-12-27 16:04:36
【问题描述】:

假设您有一个耦合 PDE 系统,例如

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

F(a,b) 中的第二个 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))

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

【问题讨论】:

    标签: python sympy equation pde


    【解决方案1】:

    不,未实现偏微分方程组的解。实际实现了什么:

    1. 求解具有常数系数的一阶线性 PDE:解的一般形式是已知的并且在求解器中被硬编码;求解器返回它,并插入给定的系数。

    2. 求解具有可变系数的一阶线性 PDE,方法是将其转换为 ODE(称为特征法)。仅单个 PDE。

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

    【讨论】:

      【解决方案2】:

      由于您的系统是可分离的,因此可以使用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 应该能够自动完成的事情,但还没有实现太多。

      【讨论】:

        猜你喜欢
        • 2016-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 2012-06-09
        • 2016-11-06
        • 1970-01-01
        • 2020-04-22
        相关资源
        最近更新 更多