Listen, falsche Rechnung?

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
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

Ich will mit Polynomen in x,y,z rechnen und will mit den Exponentenvektoren operieren. Unten ist das verkürzt mit 1-dimensionalen Vektoren: Woher kommt die 7? Die Ursache liegt wohl darin, dass der Term h2 zweimal vorkommt.

def ma(m,a): # addiert m zu a
for p in a:
p[0] = p[0] + m[0]
return a

h1 = [1]
h2 = [2]
h3 = [3]
b = [h1,h2,h3]

print(h2)
print(b)
c = ma(h2,b)
print(c)

""" Ausgabe
[2]
[[1], [2], [3]]
[[3], [4], [7]]
"""
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Ursache liegt darin, dass Listen veränderlich sind, und du eine Liste in eine andere Liste gesteckt hast, und dann die erste Liste modifizierst. Damit ist scheint der Inhalt der äußeren auch verändert, weil die nicht die Daten selbst, sondern nur Verweise auf eben andere Listen enthält.

Man kann das alles selbst bauen, aber ich würde stark den Umstieg auf das numpy Paket empfehlen.
hubertgrassmann
User
Beiträge: 61
Registriert: Montag 26. Dezember 2022, 14:53

Vielen Dank,
ich habe die Veränderung des Operanden bemerkt, duch Ersetzung
von [2] durch [2].copy() kann ich das umgehen. Aber das ist natürlich kein vernünftiger Weg.
Gibt es denn ein numpy-Paket fürs formale Rechnen mit multivariablen Polynomen, also dem formalen Rchnen im Ring R[x,y,z] ?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Keine Ahnung. Es eignet sich zur Vektor und Matrizenrechnung, wie du die hier gezeigt hast.
Benutzeravatar
__blackjack__
User
Beiträge: 14067
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@hubertgrassmann: Du solltest am besten die Liste(n) gar nicht verändern sondern neue erstellen. Es macht auch keinen Sinn `a` als Argument zu nehmen und dann auch wieder als Rückgabewert zu liefern. Der Aufrufer hat das Objekt ja bereits, sonst hätte er es ja nicht übergeben können. Oder anders `c` ist überflüssig, denn das ist identisch mit `b`.

``[2].copy()`` ist auch extrem unsinnig, aber das hast Du sicher nicht gemacht/gemeint.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten