簡體   English   中英

python (SymPy) 給 Maple 不同的結果

[英]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

現在我們需要在這里以不同的方式使用xixi_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM