Fehler im code

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
Superpuff
User
Beiträge: 1
Registriert: Mittwoch 17. August 2022, 14:07

import matplotlib.pyplot as plt
from numpy import arange, sin, pi

#data

Alpha = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
Beta = [295, 321, 341, 0.5, 21, 37.5, 53.5, 68.5, 80, 90]

Phi = list();

for i in range(0, len(Alpha)):
phi = Alpha - Beta
Phi.append(phi)

print(Phi)

plt.plot(sin(pi*Alpha/180), Phi)
plt.xlabel('sin(α) - Winkel α in °')
plt.ylabel('Torsionswinkel φ in °')
plt.title('Teilversuch 2: Drehmoment eines Feldes auf eine stromdurchflossene Spule')
plt.grid(True)
plt.savefig('Plot_TV2.png')
plt.show()




in der Zeile mit: plt.plot(sin(pi*Alpha/180), Phi) ist ein Fehler den ich bei gott nicht Finde. Bitte HIlfe
August1328
User
Beiträge: 65
Registriert: Samstag 27. Februar 2021, 12:18

Guten Abend,

schon beim Lesen kann Dein Code nicht funktionieren, in der for-Schleife subtrahierst Du 2 Listen voneinander, das wird nicht gehen.

Und hier taucht auch die erste Fehlermeldung auf, wenn ich die Zeilen in VS Code kopiere und laufen lassen will.

Durch die einzelnen Elemente der beiden Listen per "i" iterieren geht z.B. so:

Code: Alles auswählen

for i in range(0, len(Alpha)):
    phi = Alpha[i] - Beta[i]
    Phi.append(phi)
Danach ergibt sich der nächste logische Fehler in der von Dir beanstandeten ersten plot-Zeile:

Code: Alles auswählen

Traceback (most recent call last):
  File "c:/Users/ah/python/test_matplotlib.py", line 17, in <module>
    plt.plot(sin(pi*Alpha/180), Phi)
TypeError: can't multiply sequence by non-int of type 'float'
Es sollte klar sein, was wieder das Problem ist.

Gruß
Andy
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Superpuff: wenn Du einen Fehler bekommst, dann sagt Dir Python genau, wie der heißt und wo der sich befindet. Den solltest Du hier auch posten. Das Finden ist also kein Problem, nur das Beheben könnte ein Problem sein.
; benutzt man nicht und Variablennamen schreibt man generell klein.
Über Indizes iteriert man nicht. Wenn man im mathematischen Kontext mit Listen von Zahlen arbeitet, benutzt man keine Python-Listen, sondern numpy-Arrays.

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

alpha = np.array([0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
beta = np.array([295, 321, 341, 0.5, 21, 37.5, 53.5, 68.5, 80, 90])

phi = alpha - beta
print(phi)

plt.plot(np.sin(np.deg2rad(alpha)), phi)
plt.xlabel('sin(α) - Winkel α in °')
plt.ylabel('Torsionswinkel φ in °')
plt.title('Teilversuch 2: Drehmoment eines Feldes auf eine stromdurchflossene Spule')
plt.grid(True)
plt.savefig('Plot_TV2.png')
plt.show()
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@August1328: Da werden keine zwei Listen subtrahiert; da steht eigentlich schon das was Du vorschlägst, nur ist [ i ] (ohne die Leerzeichen) in normalem Beitragstext die Auszeichnung für kursive Schrift („italics“).

@Superpuff: Wenn Du Code in einem Beitrag zeigen willst, dann muss man den in Code-Tags setzten, so wie August1328 das gemacht hat. Sonst werden bestimmte Sachen als Textauszeichnung interpretiert und die Einrückung geht in der Anzeige verloren.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Sequenzen werden üblicherweise in der Mehrzahl von dem benannt, was für ein einzelnes Element ein passender Name wäre. Und man verwendet ”sprechende” Bezeichner, also nicht irgendwelche generischen griechischen Buchstaben als Namen, sondern Namen die dem Leser verraten, was die Werte im Kontext des Programms bedeuten.

Da ist ein Semikolon an einem Zeilenende das dort nicht hingehört und darauf hinweist, dass Du vielleicht von einer anderen Programmiersprache kommst, man das braucht um Anweisungen abzuschliessen. Da gibt es dann vielleicht auch andere Dinge die man *dort* macht, aber in Python *nicht*. Beispielsweise ist es in normalem Python schon ungewöhnlich einen Laufindex zu haben und damit dann auf Sequenzen wie Listen zuzugreifen. Man kann in Python direkt über die Elemente von Sequenzen iterieren, ohne den Umweg über einen Laufindex. Wenn man über zwei (oder mehr) iterierbare Objekte ”parallel” iterieren möchte, gibt es die `zip()`-Funktion:

Man muss nicht jedes kleine zwischenergebnis an einen Namen binden. Damit wird die Schleife, die `Phi` berechnet zu dem hier:

Code: Alles auswählen

    torsion_angles = []
    for angle, value in zip(angles, values_in_need_of_a_good_name):
        torsion_angles.append(angle - value)
Wobei sich hier eine „list comprehension“ anbietet:

Code: Alles auswählen

    torsion_angles = [
        angle - value
        for angle, value in zip(angles, values_in_need_of_a_good_name)
    ]
Allerdings gilt das nur für reines Python. Wenn man `numpy` verwendet, dann sollte man auch wirklich `numpy` verwenden. Also keine Schleifen in Python, sondern die vektorisierten Operationen die Numpy-Arrays bieten. Also tatsächlich das was August1328 vermutete, aber eben nicht mit Listen, wo das nicht geht, sondern mit Arrays, die man voneinander abziehen kann.

Dazu müssen die beiden Sequenzen als Arrays definiert werden und für die Winkel bietet es sich dann auch an tatsächlich das vorher importierte, aber unbenutzte `arange()` zu verwenden:

Code: Alles auswählen

    angles = arange(0, 100, 10)
    values_in_need_of_a_good_name = array(
        [295, 321, 341, 0.5, 21, 37.5, 53.5, 68.5, 80, 90]
    )

    torsion_angles = angles - values_in_need_of_a_good_name
    print(torsion_angles)
Du rechnest selbst aus, was es schon als `numpy.radians()`-Funktion gibt.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
from matplotlib import pyplot as plt
from numpy import arange, array, sin, radians


def main():
    angles = arange(0, 100, 10)
    values_in_need_of_a_good_name = array(
        [295, 321, 341, 0.5, 21, 37.5, 53.5, 68.5, 80, 90]
    )

    torsion_angles = angles - values_in_need_of_a_good_name
    print(torsion_angles)

    plt.plot(sin(radians(angles)), torsion_angles)
    plt.xlabel("sin(α) - Winkel α in °")
    plt.ylabel("Torsionswinkel φ in °")
    plt.title(
        "Teilversuch 2:"
        " Drehmoment eines Feldes auf eine stromdurchflossene Spule"
    )
    plt.grid(True)
    plt.savefig("Plot_TV2.png")
    plt.show()


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
August1328
User
Beiträge: 65
Registriert: Samstag 27. Februar 2021, 12:18

ha ha, da habe ich mich wieder als unterdurchschnittlicher Programmierer geoutet...

Naja, was gelernt und noch in meine 2 aktuellen Skripte geschaut und siehe da, neben 3 "pythonisch" richtigen for-Schleifen steckt da ein

Code: Alles auswählen

for i in range()
drin :shock: Habs gleich korrigiert und werde ich mir wohl länger merken.
Antworten