@MyAnno2070: vergiss gleich wieder, dass es eval gibt. Warum willst Du ein Programm schreiben, das ein Programm schreibt, das etwas ausrechnet anstatt gleich ein Programm zu schreiben, das etwas ausrechnet? Die Summe kannst Du doch mit einer for-Schleife direkt berechnen. Wenn Du das in eine Funktion auslagerst, dann bleibt der Code auch an dieser Stelle übersichtlich. eval dagegen ist überhaupt nicht übersichtlich. An der Stelle wo eval steht muß man nämlich zuerst suchen, wie denn dieser String zustande kommt, was nicht möglich ist, ohne dass man den ganzen Programmabschnitt im Kopf durchgehen muß.
Das mit dem schneller kapiere ich nicht. "list2" zu schreiben ist schneller als ein sinnvoller Name der auch aus 5 Buchstaben besteht? Ich hatte jedenfalls große Probleme zu verstehen, was der Code eigentlich macht, daher keine Garantie, dass ich alle Formeln identisch umgesetzt habe, aber so könnte das Programm aussehen:
Code: Alles auswählen
import math
def calculate_interference(phases, delta):
return sum(math.sin(2*math.pi*(delta - p)) / p for p in phases)
def find_max(phases):
# Bestimmung des Maximums der Funktion über das Maximum von Schritten
return max(abs(calculate_interference(phases, f / 50)) for f in range(25))
def main():
#Settings/Input
wavelength = float(input('Wellenlänge in m='))
distance = float(input('Schirmabstand in m='))
slit_positions = input('Alle Blendenöffnungen bitte in der Form a,...,f in Meter von 0 angeben: ')
slit_positions = [float(p) for p in slit_positions.split(',')]
print('Render Settings')
lower_bound = float(input('Untere Grenze in m='))
upper_bound = float(input('Obere Grenze in m='))
step_size = float(input('Schrittweite in m='))
#Berechnung
points = []
x = lower_bound
while x <= upper_bound:
#Phasendifferenz von Quelle k zum Punkte x nach Pythagoras
phases = [math.sqrt(distance**2 + (p - x)**2) / wavelength for p in slit_positions]
points.append((x, find_max(phases)))
x += step_size
print(points)
if __name__ == '__main__':
main()