2016-06-16 7 views
3

Ich versuche sympy für einige einfache Algebra und Physik zu verwenden. Wenn eine Gleichung definiert, wieGrund Algebra mit sympy: halten Koeffizienten und Variablen zusammen

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

die Gleichung V bis

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

es eine Möglichkeit, um anzugeben, dass der Koeffizient „2“ sollte nicht von unter der Wurzel herausgerechnet werden, und die Begriff unter der Quadratwurzel wird beibehalten als "2 * g * h"? Der Grund dafür ist, dass die zugrundeliegende Physik und die Ableitung einer resultierenden Gleichung manchmal viel deutlicher zu sehen sind, wenn die relevanten Koeffizienten nicht ausgeklammert werden.

wäre Ein anderes Beispiel so etwas wie die Bogenlänge in einer Gleichung der Berechnung wie

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

für die Doppel eines Winkels

phi = sy.pi/4 

wie in

a = r * (2 * phi) 

die gesammelt wird zu

wenn

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

könnte klarer zu zeigen, wie das Ergebnis erhalten wurde.

+0

Haben Sie versucht, powsimp()? http://docs.sympy.org/latest/tutorial/simplification.html – gariepy

+0

Ich glaube nicht, powsimp() ist, was ich suche. Es scheint das Gegenteil von dem zu sein, was ich erreichen möchte. – grma0025

Antwort

2

gibt es eine Möglichkeit zu geben, dass der Koeffizient „2“ sollte nicht unter der Quadratwurzel und der Term unter der Wurzel sqare herausgerechnet werden, wird als „2 * g * h“ gehalten?

Ja, erstellen Sie einfach eine Pow Objekt (Leistungserhöhung) mit dem optionalen Parameter evaluate=False:

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

Das heißt, wird 2*g*h von S(1)/2 (eine Hälfte) angehoben. Die automatische Auswertung während der Objektkonstruktion ist durch evaluate=False deaktiviert.

+0

Das ist im Grunde, was ich will, aber wenn das resultierende Objekt für weitere Berechnungen verwendet wird (zB a = Symbol ("a"); b = a * Pow (2 * g * h, S (1)/2, bewerten = false), b "a * sqrt (2) * sqrt (g * h)" sein wird. gibt es eine Möglichkeit automatische Auswertung (semi-) permanent zu unterdrücken? – grma0025

+0

Ja, können Sie vollständig zu deaktivieren Auswertung . von global_evaluate von sympy.core.evaluate importieren, dann global_evaluate Einstellung [0] = false –

+0

Dank glaube ich entweder global_evaluate mit einem Kontext-Manager verwenden werde oder etwas entlang der Linien von „two_gh = Symbol (‚2gh‘); foo = sqrt (two_gh)“und schließlich tun‚foo.subs ({two_gh: 2 * g * h})‘-, die ein bisschen wie ein Hack ist, scheint aber zumindest ein paar anständige Ausgang für die Zwischenschritte zu erhalten. – grma0025