Matlab und Komplexe Zahlen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Cotylaeus
User
Beiträge: 8
Registriert: Montag 27. Januar 2020, 17:59

Hallo Zusammen

Ich bin zur Zeit dabei, die Fakultät an der ich studiere dabei zu unterstützen von MatLab auf Python umzusteigen. Ich selber bin kein riesen Python kenner möchte es aber unbedingt werden, weshalb ich auch die Arbeit erhalten habe. Ich habe mittlerweile zirka 10 Skripte übersetzt aber nun bin ich auf ein Problem gestossen bei folgendem Code:

nu = np.linspace(1, 10000, 1000) * 1e12
w = 2 * np.pi * nu
c = 3e8
l = c / nu

wp = 2 * np.pi * 3e8 / 0.01 * 1.19e5
gamma = 2 * np.pi * 3e8 / 0.01 * 6.45e2
eps = 1 - wp^2 / np.complex(w**2, gamma * w)
n = np.sqrt(eps)
R = (abs((1 - n) / (1 + n)))**2


Der Fehler befindet sich in der Zeile die mit eps = ... beginnt. und die korrespondierende MatLab zeile ist: eps=1-wp^2 ./(w.^2+i*gamma.*w);

Ich hoffe jemand kann mir helfen kann sonst, falls es bringt den Matlab Code auch noch implementieren. In Matlab ist die variable eps als 1x1000 complex double aufgelistet.

PyCharm gibt mir folgendes aus:
TypeError: only length-1 arrays can be converted to Python scalars

und bei näherem untersuchen meint es, es wäre ein 'int' gefragt es käme jedoch eine complexe Zahl.

freundliche Grüsse aus der Schweiz

Retus
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

np.complex ist nur für Skalare. Du kannst den Matlab-Code fast wörtlich übersetzen:

Code: Alles auswählen

nu = np.linspace(1, 10000, 1000) * 1e12
w = 2 * np.pi * nu
c = 3e8
l = c / nu

wp = 2 * np.pi * 3e8 / 0.01 * 1.19e5
gamma = 2 * np.pi * 3e8 / 0.01 * 6.45e2
eps = 1 - wp**2 / (w**2 + 1j * gamma * w) 
n = eps ** 0.5
R = abs((1 - n) / (1 + n)) ** 2
Die Variablennamen und die magischen Zahlenwerte sind noch stark verbesserungswürdig. Vor allem `l` sollte man unter allen umständen vermeiden. Ansonsten kann man ohne Probleme sowohl in Matlab als auch in Python mehr als 2 Zeichen verwenden. Magische Werte sollten als gut verständliche Konstanten definiert werden.
Cotylaeus
User
Beiträge: 8
Registriert: Montag 27. Januar 2020, 17:59

Sehr komisch, ich habe es eigentlich versucht, aber da habe ich wohl sonst einen Fehler gemacht. Ich danke dir herzlich. Die Variablennamen sind nicht von mir vorgegeben, ich finde sie selber nicht ideal, aber das ist eine andere Geschichte. Was meinst du mit magischen Zahlenwerte?

Danke dir auf jeden Fall schon einmal, werde es nochmals versuchen.

Edit: hat geklappt :D
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Naja, 3e8 oder 1.19e5 oder 6.45e2 kommen ja irgendwoher, haben Bedeutung. c könnte Lichtgeschwindigkeit sein, wird aber bei wp und gamma nicht benutzt. Die anderen Zahlenwerte werden wohl auch irgendwelche Physikalischen Größen beschreiben.
Formelzeichen sind bei Formeln ganz praktisch, bei Programmen erschweren sie aber das Lesen.
Cotylaeus
User
Beiträge: 8
Registriert: Montag 27. Januar 2020, 17:59

ach soo... das sind plasmafrequenzen und Dämpfungskonstanten usw. und wie du richtig gedeutet hast, ist c die Lichtgeschwindigkeit. Ist alles fein säuberlich auskommentiert.
Antworten