2014-01-08 4 views
5

Ich habe einen Ausdruck von einer sympy Berechnung:Wie ersetze ich Schwimmer mit rationals in einem sympy Ausdruck?

sqrt(pi)*(0.333333333333333*a + 0.333333333333333*b - 2.66666666666667*c**2) 

wobei a, b, c-Symbole sind, und möchte es analysieren, so dass der Schwimmer mit rationals wie in

sqrt(pi)*(1/3*a + 1/3*b - 8/3*c**2) 

ersetzt ist, ich weiß, wie man mit der Hand zu tun,

In[24] Rational(str(0.333333333333333)).limit_denominator(1000) 

Out[24]: 1/3 

aber nicht recht, wie etwa Parsen der Atome zu gehen und Kommissionierung nur diejenigen, die Schwimmer sind, und ERSETZUNG zurück die rationale Zahl Approximation.

Was ist der klügste Weg, um diese Ersetzungen im Ausdruck zu tun?

Antwort

6

Verwendung nsimplify:

>>> print(nsimplify(sqrt(pi)*(0.333333333333333*a + 0.333333333333333*b - 2.66666666666667*c**2))) 
sqrt(pi)*(a/3 + b/3 - 8*c**2/3) 
+0

Danke asmeurer, so viel einfacher. Ich habe deine Antwort akzeptiert. – acortis

1

Nach einem bisschen Fummelei, ich glaube, ich einen Weg, es zu tun gefunden zu haben, aber ich bin mir nicht sicher, dass sie alle Eckfällen zu decken. Jedenfalls ist es hier. Irgendwelche Verbesserungsvorschläge?

import sympy 
def rationalize_coeffs(expr): 
    for i in expr.atoms(sympy.Float): 
     r = sympy.Rational(str(i)).limit_denominator(1000) 
     expr = expr.subs(i, str(r.p)+'/'+str(r.q)) 
    return expr  

if __name__=='__main__': 
    # given a sympy expression expr 
    x,y,z = sympy.symbols('x y z') 
    # expr_orig = 2/57.*x + 3./4.*y + 3./4.*z 
    expr = 0.0350877192982456*x + 0.75*y + 0.75*z 

    print rationalize_coeffs(expr) 
+0

keine Strings anwenden. Und trotzdem 'r' ist bereits eine rationale Zahl, so' expr.subs (i, r) 'sollte das tun, was Sie wollen. – asmeurer

Verwandte Themen