2016-03-29 2 views
1

Ich möchte eine numerische Lösung für eine Gleichung finden, die in Python als unendliche Summe ausgedrückt wird. Ein vereinfachtes Beispiel fsolve() und sympy Verwendung wäre:Eine numerische Lösung für eine Gleichung finden, ausgedrückt als Summe in Python

from scipy.optimize import fsolve 
import math 
from sympy import * 

i = symbols('i', integer=True) 

def f(x): 
     return Sum(x**i, (i,0, oo)).evalf(10)-1 

print fsolve(f, 0.5) 

ich eine Störung erhalte:

AttributeError: 'list' object has no attribute 'is_commutative' 

Ich versuchte, die unendliche Summe mit einer Summe mit nur einer endlichen Anzahl von Begriffen ersetzt, und auch Gießen die Funktion f() -Ausgabetyp zu float, aber ich habe den gleichen Fehler. Obwohl dies eine einfache Aufgabe zu sein scheint, konnte ich in StackOverflow oder in der Dokumentation keine Lösung für dieses Problem finden.

Meine Frage ist: Wie berechne ich Gleichungen numerisch, die mit einer Summe in Python ausgedrückt werden.

Antwort

2

Diese bestimmte Summe ist nichts als eine Summe einer geometrischen Reihe. sympy concurs:

In [23]: x = symbols('x') 

In [24]: i = symbols('i', integer=True) 

In [25]: Sum(x**i, (i, 0, oo)).doit() 
Out[25]: Piecewise((1/(-x + 1), Abs(x) < 1), (Sum(x**i, (i, 0, oo)), True)) 

Beachten Sie, dass es für x >=1 abweicht. Sympy löst einen Fehler aus (try f(1.1)), die die Eingeweide von fsolve nicht bereit sind, zu behandeln, und das führt irgendwie zu dem Fehler, den Sie sehen.

Im Allgemeinen glaube ich nicht, dass es etwas Besonderes ist, Gleichungen mit l.h.s zu lösen. als Summe bewertet werden. Sie müssen auf diese oder jene Weise sicherstellen, dass die Funktion, die Sie an fsolve oder seine Verwandten präsentieren, tatsächlich eine numerische Ausgabe zurückgibt.

Darüber hinaus fsolve (i) erwartet, dass Ihre Funktion relativ glatt ist und (ii) es nicht Grenzen behandelt. Wenn Sie den Bereich für die Root-Suche einschränken möchten, ist es besser, beispielsweise brentq zu verwenden. (in höheren Dimensionen, suchen Sie nach least_squares.)

Im Prinzip könnten Sie versuchen-außer in Ihrer Funktion und zurück nan bei Nichtkonvergenz. Dies wird den Löser wahrscheinlich nur verwirren, und der Rückgabewert kann sehr gut Müll sein.

+0

Interessant, Brentq erhöht den Fehler nicht, jedoch bleibt der Fehler für fsolve im Falle von Summen bestehen, die für alle reellen Zahlen konvergent sind. Das hat mein Problem gelöst. –

Verwandte Themen