SymPy, Summe und IndexedBased
Verfasst: Freitag 10. Januar 2014, 10:35
Hallo.
Seit gestern abend bringt mich SymPy ein wenig zur Verzweifelung und auch heute morgen komme ich nicht auf die Lösung. Das Problem ist eigentlich ganz einfach: ich möchte Werte mittels Summenoperator aufadieren. Bei den Werten handelt es sich um eine Liste an Gewichten "x", auf welche mit dem Indexoperator zugegriffen werden kann.
Oder um es kurz in LaTeX auszudürkcken: ich habe die Gewichte
und möchte davon die Summe
bilden.
Symbolisch ist das mittels SymPy auch kein Problem:
Nun möchte ich den symbolischen Ausdruck "sum" noch gerne mit konkreten Werte auswerten. Aber wie bekomme ich nun die Werte für meine Gewichte in den letzten Ausdruck?
für die obere Grenze ist klar, bei den "x" scheitere ich allerdings. Oder ganz konkret: wie schaffe ich es, dass ``x = (23, 42, 7, 29)`` gestzt wird.
Und dann noch Level zwei: Meiner Meinung nach sollte das hier die bessere Lösung sein (der Index i ist nun kein Symbol mehr sondern vom Typ Idx):
Soll das ganze wirklich eine Exception werfen?
Und wenn ja: wie sollte die Schreibweise dann aussehen?
würde hier ja prinzipiell schon genügen; rein semantisch.
Vielen Dank schon mal für das Lesen des ganzen Beitrags.
Seit gestern abend bringt mich SymPy ein wenig zur Verzweifelung und auch heute morgen komme ich nicht auf die Lösung. Das Problem ist eigentlich ganz einfach: ich möchte Werte mittels Summenoperator aufadieren. Bei den Werten handelt es sich um eine Liste an Gewichten "x", auf welche mit dem Indexoperator zugegriffen werden kann.
Oder um es kurz in LaTeX auszudürkcken: ich habe die Gewichte
Code: Alles auswählen
x_1, x_2, ..., x_nCode: Alles auswählen
sum_{i=1}^n x_iSymbolisch ist das mittels SymPy auch kein Problem:
Code: Alles auswählen
import sympy
n = sympy.symbols("n", integer=True)
x = sympy.tensor.IndexedBase("x", shape=(n,))
i = sympy.symbols("i", integer=True)
sum = sympy.Sum(x[i], (i, 1, n))Code: Alles auswählen
sum.subs({n:4})Und dann noch Level zwei: Meiner Meinung nach sollte das hier die bessere Lösung sein (der Index i ist nun kein Symbol mehr sondern vom Typ Idx):
Code: Alles auswählen
import sympy
n = sympy.symbols("n", integer=True)
x = sympy.tensor.IndexedBase("x", shape=(n,))
i = sympy.tensor.Idx("i", (1, n)) #Hier Idx statt Symbol
sum = sympy.Sum(x[i], (i, 1, n))Code: Alles auswählen
Traceback (most recent call last):
File "example.py", line 7, in <module>
print sympy.Sum(x[i], (i, 1, n))
File "/usr/lib/python2.7/dist-packages/sympy/concrete/summations.py", line 24, in __new__
limits, sign = _process_limits(*symbols)
File "/usr/lib/python2.7/dist-packages/sympy/integrals/integrals.py", line 84, in _process_limits
raise ValueError('Invalid limits given: %s' % str(symbols))
ValueError: Invalid limits given: ((i, 1, n),) Code: Alles auswählen
sympy.Sum(x[i], i)Vielen Dank schon mal für das Lesen des ganzen Beitrags.