Seite 1 von 1
Listen, falsche Rechnung?
Verfasst: Montag 26. Dezember 2022, 15:03
von hubertgrassmann
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]]
"""
Re: Listen, falsche Rechnung?
Verfasst: Montag 26. Dezember 2022, 15:11
von __deets__
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.
Re: Listen, falsche Rechnung?
Verfasst: Montag 26. Dezember 2022, 16:44
von hubertgrassmann
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] ?
Re: Listen, falsche Rechnung?
Verfasst: Montag 26. Dezember 2022, 17:03
von __deets__
Keine Ahnung. Es eignet sich zur Vektor und Matrizenrechnung, wie du die hier gezeigt hast.
Re: Listen, falsche Rechnung?
Verfasst: Dienstag 27. Dezember 2022, 01:48
von __blackjack__
@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.