如何用sympy解泊松2D方程?

时间:2018-10-31 15:20:36

标签: python sympy

我在2D空间中有一个泊松方程,像这样:

formula

这是我尝试解决的问题:

import sympy as sp

x, y = sp.symbols('x, y')
f = sp.Function('f')
u = f(x, y)
eq = sp.Eq(u.diff(x, 2) + u.diff(y, 2), u)
print(sp.pdsolve(eq))

出现错误:

psolve: Cannot solve -f(x, y) + Derivative(f(x, y), x, x) + Derivative(f(x, y), y, y)

是否可以将sympy用于此类方程式?如有可能,请帮我举个例子。

2 个答案:

答案 0 :(得分:1)

PDE solver page的底部,您会找到

  

当前实施的求解器方法

     
      
  • 具有常数系数的一阶线性齐次偏微分方程。
  •   
  • 具有常数系数的一阶线性一般偏微分方程。
  •   
  • 一阶变系数线性偏微分方程。
  •   

没有二阶。这并不奇怪,因为这样的PDE不允许使用显式的符号解决方案,只有少数(大多数是无趣的)例外。 (如果方程式实际上是具有零Neumann条件的Eq(u.diff(x, 2) + u.diff(y, 2), u),则解也等于零。)不仅SymPy不知道如何找到符号解,还没有找到这样的解。

答案 1 :(得分:0)

我认为您可以使用这个想法,其中 nt 是泊松求解器的迭代次数,而 b 是源项。 dx 和 dy 是 x 和 y 的步长,最终得到边界条件。

for it in range(nt):
    pd = pDF.copy()
    pDF[1:-1,1:-1] = (((pd[1:-1, 2:] + pd[1:-1, :-2]) * dy**2 +
                    (pd[2:, 1:-1] + pd[:-2, 1:-1]) * dx**2 -
                    b[1:-1, 1:-1] * dx**2 * dy**2) / 
                    (2 * (dx**2 + dy**2)))

    pDF[0, :] = 0
    pDF[nx-1, :] = 0
    pDF[:, 0] = 0
    pDF[:, ny-1] = 0
相关问题