2012-05-08 26 views
16

Lassen Sie uns sagen, ich habe eine Gleichung:Wie kann ich Gleichungen in Python lösen?

2x + 6 = 12

Mit Algebra wir, dass x = 3 sehen können. Wie kann ich ein Programm in Python erstellen, das für x lösen kann? Ich bin neu in der Programmierung, und ich schaute auf eval() und exec(), aber ich kann nicht herausfinden, wie man sie macht, was ich will. Ich möchte keine externen Bibliotheken (z. B. SAGE) verwenden, ich möchte dies einfach in Python machen.

+7

Ich möchte ein Auto, das 0 bis 60 in 4,5 Sekunden und bekommt 45 MPG. Vielleicht könnten Sie in Betracht ziehen, die Anforderung für normales Python zu entfernen und externe Bibliotheken zu verwenden. –

+1

Wenn Sie irgendeine Gleichung lösen wollen, müssen Sie Ihre eigene Bibliothek erstellen. Auch 4.5 Sekunden sind für dieses Beispiel nicht schnell genug: D – jamylak

+0

Werden die Probleme immer so aussehen: 'löse y = mx + c für x'? –

Antwort

26

Wie wäre es mit SymPy? Ihre solver sieht aus, als was Sie brauchen. Werfen Sie einen Blick auf ihren Quellcode, wenn Sie die Bibliothek selbst erstellen möchten ...

+2

Amüsant zu sehen, eine Antwort wie folgt innerhalb von Minuten alle abfälligen Kommentare zu der Frage: D – naught101

6

Verwenden Sie ein anderes Tool. Etwas wie Wolfram Alpha, Maple, R, Octave, Matlab oder irgendein anderes Algebra-Software-Paket.

Als Anfänger sollten Sie wahrscheinlich nicht versuchen, ein solches nicht-triviales Problem zu lösen.

+0

Wolfram Alpha ist erstaunlich. Ich benutzte es, um '3 ** x = 4 'zu lösen und bekam eine befriedigende Antwort. – Zen

+0

... eigentlich ist das ziemlich einfach; log (3 ** x) == x * log (3) == log (4) also x = log (4)/log (3) = 1.261859 ... –

7

Python kann gut sein, aber es ist nicht Gott ...

Es gibt ein paar verschiedene Möglichkeiten, um Gleichungen zu lösen. SymPy wurde bereits erwähnt, wenn Sie nach analytischen Lösungen suchen.

Wenn Sie glücklich sind, nur eine numerische Lösung zu haben, hat Numpy ein paar Routinen, die helfen können. Wenn Sie nur an Lösungen für Polynome interessiert sind, funktioniert numpy.roots. Speziell für den Fall, dass Sie erwähnt:

>>> import numpy 
>>> numpy.roots([2,-6]) 
array([3.0]) 

Für kompliziertere Ausdrücke, haben einen Blick auf scipy.fsolve.

In beiden Fällen können Sie nicht mithilfe einer Bibliothek entkommen.

6

Wenn Sie nur die äußerst begrenzt Satz von Gleichungen mx + c = y für positive ganze Zahl m, c, y lösen wollen, dann wird dies tun:

import re 
def solve_linear_equation (equ): 
    """ 
    Given an input string of the format "3x+2=6", solves for x. 
    The format must be as shown - no whitespace, no decimal numbers, 
    no negative numbers. 
    """ 
    match = re.match(r"(\d+)x\+(\d+)=(\d+)", equ) 
    m, c, y = match.groups() 
    m, c, y = float(m), float(c), float(y) # Convert from strings to numbers 
    x = (y-c)/m 
    print ("x = %f" % x) 

Einige Tests:

>>> solve_linear_equation("2x+4=12") 
x = 4.000000 
>>> solve_linear_equation("123x+456=789") 
x = 2.707317 
>>> 

Wenn Sie möchten, zu erkennen und zu lösen arbitrary Gleichungen, wie sin(x) + e^(i*pi*x) = 1, dann müssen Sie eine Art von symbolischen Mathematik engi implementieren ne, ähnlich wie maxima, Mathematica, MATLABs solve() oder Symbolic Toolbox, usw. Als Neuling, das ist jenseits Ihres Wissens.

11

Es gibt zwei Möglichkeiten, dieses Problem zu lösen: numerisch und symbolisch.

Um es numerisch zu lösen, müssen Sie es zuerst als eine "runnable" -Funktion kodieren - einen Wert einstecken, einen Wert rausholen. Zum Beispiel:

Es ist durchaus möglich, eine Zeichenfolge zu analysieren, um eine solche Funktion automatisch zu erstellen; sagen Sie, dass Sie 2x + 6 in eine Liste, [6, 2] analysieren (wobei der Listenindex der Potenz von x entspricht - also 6 * x^0 + 2 * x^1).Dann:

def makePoly(arr): 
    def fn(x): 
     return sum(c*x**p for p,c in enumerate(arr)) 
    return fn 

my_func = makePoly([6, 2]) 
my_func(3) # returns 12 

Sie müssen dann eine andere Funktion, die wiederholt einen x-Wert in Ihrer Funktion Stecker, schaut auf die Differenz zwischen dem Ergebnis und dem, was sie finden will, und zwickt seine x-Wert (hoffentlich) minimieren der Unterschied.

def dx(fn, x, delta=0.001): 
    return (fn(x+delta) - fn(x))/delta 

def solve(fn, value, x=0.5, maxtries=1000, maxerr=0.00001): 
    for tries in xrange(maxtries): 
     err = fn(x) - value 
     if abs(err) < maxerr: 
      return x 
     slope = dx(fn, x) 
     x -= err/slope 
    raise ValueError('no solution found') 

Es gibt viele möglichen Probleme hier - einen guten Ausgang x-Wert zu finden, unter der Annahme, dass die Funktion tatsächlich eine Lösung (dh es gibt keine reellwertigen Antworten auf x^2 + 2 = 0), die Grenzen der Rechengenauigkeit schlagen, etc. Aber in diesem Fall ist die Fehlerminimierungsfunktion ist geeignet, und wir bekommen ein gutes Ergebnis:

solve(my_func, 16) # returns (x =) 5.000000000000496 

Beachten Sie, dass diese Lösung nicht absolut, genau richtig. Wenn Sie es brauchen, um perfekt zu sein, oder wenn Sie versuchen wollen, Gleichungen Gleichungen analytisch zu lösen, müssen Sie sich einem komplizierteren Biest zuwenden: einem symbolischen Löser.

Ein symbolischer Löser, wie Mathematica oder Maple, ist ein Expertensystem mit vielen eingebauten Regeln ("Wissen") über Algebra, Infinitesimalrechnung usw .; es "weiß", dass die Ableitung von sin cos ist, dass die Ableitung von kx^p kpx^(p-1) ist, und so weiter. Wenn Sie ihm eine Gleichung geben, versucht er, einen Pfad zu finden, einen Satz von Regelanwendungen, von wo es ist (die Gleichung) bis zu dem, wo Sie sein möchten (die einfachste mögliche Form der Gleichung, die hoffentlich die Lösung ist) .

Ihre Beispielgleichung ist ziemlich einfach; eine symbolische Lösung könnte so aussehen:

=> LHS([6, 2]) RHS([16]) 

# rule: pull all coefficients into LHS 
LHS, RHS = [lh-rh for lh,rh in izip_longest(LHS, RHS, 0)], [0] 

=> LHS([-10,2]) RHS([0]) 

# rule: solve first-degree poly 
if RHS==[0] and len(LHS)==2: 
    LHS, RHS = [0,1], [-LHS[0]/LHS[1]] 

=> LHS([0,1]) RHS([5]) 

und es ist Ihre Lösung: x = 5.

Ich hoffe, das den Geschmack der Idee gibt; Die Details der Implementierung (ein gutes, vollständiges Regelwerk zu finden und zu entscheiden, wann jede Regel angewendet werden sollte) können leicht viele Mannjahre Aufwand kosten.

Verwandte Themen