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.
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. –
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
Werden die Probleme immer so aussehen: 'löse y = mx + c für x'? –