SymPy, Summe und IndexedBased

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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

Code: Alles auswählen

x_1, x_2, ..., x_n
und möchte davon die Summe

Code: Alles auswählen

sum_{i=1}^n x_i
bilden.

Symbolisch 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))
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?

Code: Alles auswählen

sum.subs({n:4})
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):

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))
Soll das ganze wirklich eine Exception werfen?

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),)  
Und wenn ja: wie sollte die Schreibweise dann aussehen?

Code: Alles auswählen

sympy.Sum(x[i], i)
würde hier ja prinzipiell schon genügen; rein semantisch.

Vielen Dank schon mal für das Lesen des ganzen Beitrags.
Das Leben ist wie ein Tennisball.
Antworten