Polynomaddition

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
StareDog
User
Beiträge: 16
Registriert: Donnerstag 19. April 2018, 09:59

Dienstag 15. Mai 2018, 08:47

Hallo zusammen,

und zwar soll ich ein Programm basteln, welches Polynome addiert

Code: Alles auswählen

# lies die Koeffizienten fuer Polynom 1 ein
a = [float(i) for i in (input().split())]
# lies die Koeffizienten fuer Polynom 2 ein
b = [float(i) for i in (input().split())]
# Initialisiere die Liste, die die Summe der Polynome beinhaltet
c = list()

if len(a) < len(b):
    while len(a) < len(b):
        a.append (0)
elif len(a)>len(b):
    while len(a)>len(b):
        b.append (0)
else:
    for i in range (0,len(a)):
        s=a[i]+b[i]
        c.append(s)
print (c)
und zwar versuche ich hier für den Fall, dass die Länge der Polynome angepasst wird, wenn die Anzahl der Koeffizienten unterschiedlich ist, indem mit Nullen aufgefüllt wird bis die Länge gleich ist und dann sollen einfach die passenden Koeffizienten miteinander addiert werden und in einer gemeinsamen Liste c ausgegeben werden.

Leider krieg ich als Ergebnis nur [ ].

Außerdem meinte unser Dozent diese Aufgabe wäre einfach und eigentlich ein Zweiteiler was ich jetzt allerdings nicht hinbekommen habe. Könnt ihr euch vorstellen was er meinte wie das geht mit den vorgaben a, b und c?

Vielen Dank!
narpfel
User
Beiträge: 183
Registriert: Freitag 20. Oktober 2017, 16:10

Dienstag 15. Mai 2018, 09:02

Moin,

in welchem Fall wird denn die `for`-Schleife ausgeführt? In welchen Fällen wird sie vielleicht nicht ausgeführt (was dann zu einem leeren `c` führen würde)?

Für die Zweizeilerlösung könntest du mal ins `itertools`-Modul gucken. Eine spezielle Funktion daraus löst quasi dein Problem.

Zu deinem Code bis jetzt:
  • Eine Schleife nach dem Muster `for i in range(len(sequence))` ist in Python ein Anti-Pattern, weil man direkt über die Sequenz iterieren kann. Wenn man (wie in deinem Beispiel) über mehrere Sequenzen gleichzeitig iterieren möchte, dann gibt es `zip`.
  • Das Auffüllen mit Nullen kann man mit `list.extend` ohne explizite Schleife einfacher schreiben.
  • Die Erstellung von `c` kann genau wie die Erstellung von `a` und `b` als List Comprehension geschrieben werden.
StareDog
User
Beiträge: 16
Registriert: Donnerstag 19. April 2018, 09:59

Dienstag 15. Mai 2018, 09:05

danke für die schnelle antwort, mal sehen ob ichs damit hinkrieg!
Sirius3
User
Beiträge: 7586
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 15. Mai 2018, 10:57

@narpfel: ich frage mich gerade, wofür Du die zweite Zeile bei der Zweizeilenlösung brauchst?

@StareDog: eine gute Lösung ändert die Eingabedaten nicht. Du könntest Dir mal überlegen, wie das Problem zu lösen wäre, wenn man a und b nicht ändert? Im ersten Schritt mit Fallunterscheidungen, später kann man die ja dann noch auflösen.
narpfel
User
Beiträge: 183
Registriert: Freitag 20. Oktober 2017, 16:10

Dienstag 15. Mai 2018, 11:24

@Sirius3: Ich wollte eigentlich „Einzeilenlösung“ schreiben... Aber weil der Dozent von zwei Zeilen gesprochen hat, hab’ ich den Import einfach mitgezählt. :wink:
StareDog
User
Beiträge: 16
Registriert: Donnerstag 19. April 2018, 09:59

Donnerstag 17. Mai 2018, 09:10

Code: Alles auswählen

# lies die Koeffizienten fuer Polynom 1 ein
a = [float(i) for i in (input().split())]
# lies die Koeffizienten fuer Polynom 2 ein
b = [float(i) for i in (input().split())]
# Initialisiere die Liste, die die Summe der Polynome beinhaltet
c = list()

#Listenlänge ver- und angleichen
while (len(a)<len(b)):
    a.append(0)
while(len(b)<len(a)):
    b.append(0)
#Polynomaddition
for i in range(0,len(a)):
        s=a[i]+b[i]
        c.append(s)
 print(c)

Das hab ich abgegeben
Sirius3
User
Beiträge: 7586
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 17. Mai 2018, 09:21

Und das ist die Einzeilenlösung:

Code: Alles auswählen

from itertools import zip_longest

a = [float(x) for x in input().split()]
b = [float(x) for x in input().split()]
c = [sum(xy) for xy in zip_longest(a, b, fillvalue=0)]
oder wer zip_longest nicht mag:

Code: Alles auswählen

c = []
for x, y in zip(a, b):
    c.append(x + y)
c.extend(a[len(c):])
c.extend(b[len(c):])
StareDog
User
Beiträge: 16
Registriert: Donnerstag 19. April 2018, 09:59

Donnerstag 17. Mai 2018, 10:00

Danke für die Lösung. zip hatten wir noch nicht, aber werd ich mir anschauen
Benutzeravatar
DeaD_EyE
User
Beiträge: 150
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Donnerstag 17. Mai 2018, 10:22

Kleiner Hinweis: Falls du mal irgendwann nicht für deinen Lehrer programmieren sollst, kannst du numpy nutzen. Da sind Polynome auch mit drin. Trotzdem ist es gut zu wissen, wie man so etwas auch selbst macht.
sourceserver.info - sourceserver.info/wiki/ - Support für HL2-Server
Antworten