2016-06-16 42 views
3

我試圖使用sympy的一些基本代數和物理。當定義一個方程如sympy的基本代數:將係數和變量保持在一起

import sympy as sy 
g,h = sy.Symbols("g h") 
v = sy.sqrt(2 * g * h) 

等式V被擴大到

v = sqrt(2) * sqrt(g * h) 

有辦法來指定的係數「2」不應從 平方根和下分解出來長期根據sqare根保持爲「2 * g * h」?我想這樣做的原因是,基礎物理學和得到的方程的推導有時更清楚地看看相關係數是否沒有被分解出來。

另一個例子是像計算弧lenght等式中像

phi = sy.symbols("phi") 
r = sy.symbols("r") 
a= r * phi 

用於一個角度

phi = sy.pi/4 

的雙如

a = r * (2 * phi) 

它獲取收集到

a = r * sy.pi/2 

a = r * 2 * (sy.pi/4) 

可能會更清晰顯示是如何得到的結果。

+0

你試過powsimp()嗎? http://docs.sympy.org/latest/tutorial/simplification.html – gariepy

+0

我不認爲我正在尋找powsimp()。這似乎與我試圖達到的目標相反。 – grma0025

回答

2

是有指定的係數「2」不應該被 從平方根和sqare 根目錄下的術語下分解出被保持爲「2 * G * H」的方法嗎?

是的,只需要創建一個Pow對象(功率提高)與可選參數evaluate=False

>>> Pow(2*g*h, S(1)/2, evaluate=False) 
    _______ 
\/ 2*g*h 

也就是說,2*g*h得到由S(1)/2(一半)提出。對象構建過程中的自動評估被evaluate=False禁用。

+0

這基本上是我想要的,但是當使用生成的對象進行進一步計算時(例如,在做 a =符號(「a」); b = a * Pow(2 * g * h,S(1)/ 2,evaluate = False), b將是「a * sqrt(2)* sqrt(g * h)」。是否有辦法抑制自動評估(semi-)永久? – grma0025

+0

是的,您可以完全禁用評估通過從sympy.core.evaluate中導入global_evaluate,然後設置global_evaluate [0] = False –

+0

謝謝,我想我會使用global_evaluate與上下文管理器或沿着「two_gh = Symbol('2gh'); foo = sqrt(two_gh)「,最後做」foo.subs({two_gh:2 * g * h})「 - 這有點破解,但似乎至少在中間步驟中得到了一些體面的輸出。 – grma0025