[英]python (SymPy) giving different result to Maple
我正在嘗試使用 SymPy 將一些 Maple 代碼轉換為 python。 以下是我要轉換的 Maple 代碼:
以下是我在 python 代碼中嘗試做同樣的事情,但這是我所得到的。
from sympy import *
c, k, x, t, tau, Y, xi = symbols('c k x t tau Y xi')
u = Function('u')
F = Function('F')
xi = k*(x-c*t)
U = Function('U')
pde = diff(u(x,t), t) + 6*u(x,t)*diff(u(x,t), x)
ode = simplify(pde.xreplace({t:tau,u(x,t):U(xi)}))
ode1 = simplify(ode.xreplace({xi:atanh(Y), U(xi):F(Y)}))
display('pde = ', pde)
display('ode = ', ode)
display('ode1 = ', ode1)
python生成的output為:
python 中的 ode1 output 應該與 Maple output“F1”相同(或相似)。
任何幫助表示贊賞。
首先請注意,您的 Python 代碼以兩種不同的方式定義了 Python 變量xi
。 您需要區分符號xi
和表達式k*(x - c*t)
所以讓我們改為調用表達式xi_e
:
In [30]: from sympy import *
...: c, k, x, t, tau, Y, xi = symbols('c k x t tau Y xi')
...:
...: u = Function('u')
...: F = Function('F')
...: xi_e = k*(x-c*t)
...:
...: U = Function('U')
...: pde = diff(u(x,t), t) + 6*u(x,t)*diff(u(x,t), x)
In [31]: pde
Out[31]:
∂ ∂
6⋅u(x, t)⋅──(u(x, t)) + ──(u(x, t))
∂x ∂t
現在我們需要在這里以不同的方式使用xi
和xi_e
並且我們必須注意替換的順序。 我將展示每個步驟,以便您了解發生了什么:
In [35]: pde.xreplace({u(x,t):U(xi_e)})
Out[35]:
∂ ∂
6⋅U(k⋅(-c⋅t + x))⋅──(U(k⋅(-c⋅t + x))) + ──(U(k⋅(-c⋅t + x)))
∂x ∂t
In [36]: pde.xreplace({u(x,t):U(xi_e)}).xreplace({t: tau})
Out[36]:
∂ ∂
6⋅U(k⋅(-c⋅τ + x))⋅──(U(k⋅(-c⋅τ + x))) + ──(U(k⋅(-c⋅τ + x)))
∂x ∂τ
In [37]: pde.xreplace({u(x,t):U(xi_e)}).xreplace({t: tau}).doit()
Out[37]:
⎛ d ⎞│ ⎛ d ⎞│
- c⋅k⋅⎜───(U(ξ₁))⎟│ + 6⋅k⋅U(k⋅(-c⋅τ + x))⋅⎜───(U(ξ₁))⎟│
⎝dξ₁ ⎠│ξ₁=k⋅(-c⋅τ + x) ⎝dξ₁ ⎠│ξ₁=k⋅(-c⋅τ + x)
In [40]: pde.xreplace({u(x,t):U(xi_e)}).xreplace({t: tau}).doit().xreplace({x: xi/k + c*tau})
Out[40]:
⎛ d ⎞│ ⎛ d ⎞│
- c⋅k⋅⎜───(U(ξ₁))⎟│ + 6⋅k⋅U(ξ)⋅⎜───(U(ξ₁))⎟│
⎝dξ₁ ⎠│ξ₁=ξ ⎝dξ₁ ⎠│ξ₁=ξ
In [41]: pde.xreplace({u(x,t):U(xi_e)}).xreplace({t: tau}).doit().xreplace({x: xi/k + c*tau}).doit()
Out[41]:
d d
- c⋅k⋅──(U(ξ)) + 6⋅k⋅U(ξ)⋅──(U(ξ))
dξ dξ
這是 Maple 代碼中顯示的 ode1(或 Python 代碼中的 ode1):
In [42]: ode = pde.xreplace({u(x,t):U(xi_e)}).xreplace({t: tau}).doit().xreplace({x: xi/k + c*tau}).doit()
In [43]: ode
Out[43]:
d d
- c⋅k⋅──(U(ξ)) + 6⋅k⋅U(ξ)⋅──(U(ξ))
dξ dξ
接下來,您想將xi
替換為atanh(Y)
並將U(xi)
替換為F(Y)
。 在 Maple 中,您為此使用dchange
,但 SymPy 沒有等效的dchange
來更改被區分的變量。 有一個未解決的問題要添加類似dchange
的內容: https://github.com/sympy/sympy/issues/17590
在那個問題中,您可以看到一些可以執行此操作的示例代碼。 它只是涉及一些中間變量的擺弄。 我將展示所有步驟,以便您了解發生了什么:
In [44]: xi_f = Function('xi')
In [45]: xi_s = atanh(Y)
In [46]: diff_xi = lambda e, n: Derivative(e, Y) / Derivative(xi_f(Y), Y)
In [47]: changex = lambda e: e.replace(Derivative, lambda e, vs: diff_xi(e, vs[1]))
In [50]: eqf = ode.subs(xi, xi_f(Y))
In [51]: eqf
Out[51]:
d d
- c⋅k⋅─────(U(ξ(Y))) + 6⋅k⋅U(ξ(Y))⋅─────(U(ξ(Y)))
dξ(Y) dξ(Y)
In [61]: changex(eqf)
Out[61]:
d d
c⋅k⋅──(U(ξ(Y))) 6⋅k⋅U(ξ(Y))⋅──(U(ξ(Y)))
dY dY
- ─────────────── + ───────────────────────
d d
──(ξ(Y)) ──(ξ(Y))
dY dY
In [62]: changex(eqf).xreplace({U(xi_f(Y)): F(Y)})
Out[62]:
d d
c⋅k⋅──(F(Y)) 6⋅k⋅F(Y)⋅──(F(Y))
dY dY
- ──────────── + ─────────────────
d d
──(ξ(Y)) ──(ξ(Y))
dY dY
In [63]: changex(eqf).xreplace({U(xi_f(Y)): F(Y)}).xreplace({xi_f(Y): xi_s})
Out[63]:
d d
c⋅k⋅──(F(Y)) 6⋅k⋅F(Y)⋅──(F(Y))
dY dY
- ──────────── + ─────────────────
d d
──(atanh(Y)) ──(atanh(Y))
dY dY
In [64]: changex(eqf).xreplace({U(xi_f(Y)): F(Y)}).xreplace({xi_f(Y): xi_s}).doit()
Out[64]:
⎛ 2⎞ d ⎛ 2⎞ d
- c⋅k⋅⎝1 - Y ⎠⋅──(F(Y)) + 6⋅k⋅⎝1 - Y ⎠⋅F(Y)⋅──(F(Y))
dY dY
這與您的最終ode1
相匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.