2017-09-22 1 views
0

Ich habe eine Funktion von zwei Variablen k und T. Wenn der Wert der Funktion für eine Anzahl von (k, T) koppeln. Allerdings habe ich nicht die gleiche Menge für jeden. Zum Beispiel weiß, dass ich die Werte f der Funktion bei 2 T und 3 k:Nichtlineare Least Square Minimierung von 2 Variablen (unterschiedliche Dimension) in Python

F(k1,T1) = f1 
F(k1,T2) = f2 
F(k2,T1) = f3 
F(k2,T2) = f4 
F(k3,T1) = f5 
F(k3,T2) = f6 

Ich weiß, auch die Form der Funktion F:

def func(X, a, b, c, omega): 
    T,k = X # The two variables 
    n = 1.0/(np.exp(omega/T) - 1.0) 
    return a * k * n + b * k**2 * (n + 1.0) 

Ich mag den Wert von a finden , b, c und omega, die den Fehler minimieren. Ich habe versucht, mit curve_fit:

k = [k1,k2,k3] 
T = [T1,T2] 
F[k1,T1] = f1 
F[k1,T2] = f2 
F[k2,T1] = f3 
F[k2,T2] = f4 
F[k3,T1] = f5 
F[k3,T2] = f6 
popt, pcov = curve_fit(func, (T,k), F) 

Jedoch habe ich die folgende Fehlermeldung (in meinem praktischen Fall ich habe 19 k-Werte und 4 T-Werte):

return a * k * n + b * k**2 * (n + 1.0) 
ValueError: operands could not be broadcast together with shapes (19,) (4,) 

Wenn ich nun eine Reihe von höheren erstellen Dimension:

X = np.zeros((4,19,2)) 
for ii in np.arange(19): 
    X[0,ii,:] = np.array([T[0],k[ii]]) 
    X[1,ii,:] = np.array([T[1],k[ii]]) 
    X[2,ii,:] = np.array([T[2],k[ii]]) 
    X[3,ii,:] = np.array([T[3],k[ii]]) 

und passieren, dass:

def func(X, a, b, c, omega): 
    T = X[:,:,0] 
    k = X[:,:,1] 
    n = 1.0/(np.exp(omega/T) - 1.0) 
    return a * k * n + b * k**2 * (n + 1.0) 

popt, pcov = curve_fit(func, X, F) 

dann bekomme ich folgende Ausgabe:

minpack.error: Result from function call is not a proper array of floats. 

Vielen Dank im Voraus.

Antwort

1

Sie müssen eine Reihe von Paaren von Daten mit dem Eingang X (wahrscheinlich die ursprünglichen Daten-Set sieht schon ähnlich) und die entsprechende Ausgabe-Array F:

X = np.array([k1,T1],[k1,T2],[k2,T1],[k2,T2],[k3,T1],[k3,T2]) 
F = [f1,f2,f3,f4,f5,f6] 

dann die curve_fit Funktion aufrufen direkt:

popt, pcov = curve_fit(func, (X[:,0],X[:,1]),F) 

Alternativ können Sie einzelne Arrays für die k und T und verwenden sie anstelle von X[:,0] und X[:,1] verwenden, aber beachten Sie, dass sie die gleiche d haben sollte Dimensionen, da jedes Element dem individuellen Wert von k und T jeder Beobachtung/Experiment entspricht. Mit anderen Worten, der Index in dem k oder T Array teilt Ihnen die Bezeichnung der entsprechenden Beobachtung mit.