für eine Experiment muss ich eine Funktion fitten, die sich aus der Multiplikation mehrere Matrizen ergibt. (Hintergrund: Ich berechne den Brechungsindex einer Probe). Um das fitten einer solchen Funktion besser zu verstehen habe ich erstmal eine einfacheres Code-Beispiel geschrieben, dass Messdaten aus einen ähnlichen Zusammenhang generiert, wo die zu fittenden Parameter bekannt sind (Matrize A). Ziel ist es jetzt die Fit Funktion so anzuwenden, das ich auf die Parameter in etwa komme die ich als Beispiel selbst gewählt habe. Dann kann ich das Prinzip auf mein eigentliches Problem übertragen.
Hier der Code:
Code: Alles auswählen
import numpy as np
import math
import matplotlib.pyplot as plt
import cmath
from scipy.optimize import curve_fit
#Eingangsintensität in Watt
I0=1
#Erstelle Jonesvektor, linear 45°: ξ = −45°, χ = 180° Gemäß Seite 3
Jin = np.array([[1],
[1]])*(1/np.sqrt(2))
#Winkel des rotierenden Bauteils Alpha
Alpha_deg = 10*np.arange((360/10)+1) #[0,45,90] #np.arange(3)
#Analysatormatrize A
A = np.array([[1.8, 2.2],
[3.7, 4.5]])
#Intensitätsverlauf Array erstellt
Iv = np.array([])
for Alpha in Alpha_deg:
#Drehmatrize erstellen für Transformation in den Analysator hinein
D = np.array([[ np.cos(np.radians(Alpha)), np.sin(np.radians(Alpha))],
[-np.sin(np.radians(Alpha)), np.cos(np.radians(Alpha))]])
#Drehmatrize erstellen für Transformation aus den Analysator heraus
D2 = np.array([[ np.cos(np.radians(-Alpha)), np.sin(np.radians(-Alpha))],
[-np.sin(np.radians(-Alpha)), np.cos(np.radians(-Alpha))]])
#Reslutierender Jonesvektor
Jout=D2@A@D@Jin
#Resultierende Intensität = Betragsquadrat von Jout * Eingangsintensität I0
I = (np.sum(np.abs(Jout)**2))*I0
#Intensitätsverlaufs Array ein Element hinzufügen
Iv = np.append(Iv, I)
# Plot des Intensitätsverlaufs
#plt.plot(Alpha_deg, Iv)
#plt.title('Intensitätsverlauf in Abhängigkeit von Alpha')
#plt.xlabel('Alpha (Grad)')
#plt.ylabel('Intensität')
#plt.grid(True)
#plt.show()
Messdaten=np.array([[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0],
[0,0]])
for i in range(0,37,1):
Messdaten[i][0]=Alpha_deg[i]*1000
Messdaten[i][1]=Iv[i]*1000
Messdaten=Messdaten*0.001
#Ab hierbeginnt mein Versuch dieParameter a, b, c, d "her zu fitten" die in der oberen Matrize A enthalten sind
def Funktion(Alpha, a, b, c, d):
#Eingangsintensität in Watt
I0=1
#Erstelle Jonesvektor, linear 45°: ξ = −45°, χ = 180° Gemäß Seite 3
Jin = np.array([[1],
[1]])*(1/np.sqrt(2))
#Analysatormatrize A
A = np.array([[a, b],
[c, d]])
#Drehmatrize erstellen für Transformation in den Analysator hinein
D = np.array([[ np.cos(np.radians(Alpha)), np.sin(np.radians(Alpha))],
[-np.sin(np.radians(Alpha)), np.cos(np.radians(Alpha))]])
#Drehmatrize erstellen für Transformation aus den Analysator heraus
D2 = np.array([[ np.cos(np.radians(-Alpha)), np.sin(np.radians(-Alpha))],
[-np.sin(np.radians(-Alpha)), np.cos(np.radians(-Alpha))]])
#Reslutierender Jonesvektor
Jout=D2@A@D@Jin
#Resultierende Intensität = Betragsquadrat von Jout * Eingangsintensität I0
I = (np.sum(np.abs(Jout)**2))*I0
return I
#Dieser Fit funktioniert noch nicht...
Fit=curve_fit(Funktion, Messdaten[:,0], Messdaten[:,1], [1.8,2.2,3.7,4.5])
...
File c:\...\untitled10.py:117 in Funktion
Jout=D2@A@D@Jin
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 37)
Was muss ich am Code anpassen?
Danke !