2017-12-27 166 views
2

假設有耦合PDE的一個系統,諸如在Python中使用sympy可以解決一個PDE系統嗎?

第一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)) 

是否有可能解決PDEs系統?語法可能類似於sp.pprint(sp.pdsolve([eq1, eq2]))。我試過[eq1, eq2]{eq1, eq2},np.array([eq1, eq2])等我看看help(sp.pdsolve)help(sp.pde),但還沒有找到解決辦法。

回答

2

不,不執行偏微分方程組的解。究竟是執行:

  1. 解決常係數一階線性PDE:溶液的一般形式是已知的並且在解算器是硬編碼;解算器返回給定係數。

  2. 通過將變換系數轉換爲ODE(稱爲特徵方法)來求解一階線性PDE。只有一個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應該能夠自動完成的事情,但是目前還沒有實現。

相關問題