2016-11-08 7 views
0

i-Modul nutzen kann, um unter Verwendung zu tun (scipy.optimize.least_squares) 1-D-Kurvenanpassung zu tun (natürlich kann auch i curve_fit Modul direkt verwenden), wie diesePython 3-D-Oberflächenanpassung

def f(par,data,obs): 
    return par[0]*data+par[1]-obs 
def get_f(x,a,b): 
    return x*a+b 
data = np.linspace(0, 50, 100) 
obs = get_f(data,3.2,2.3) 
par = np.array([1.0, 1.0]) 
res_lsq = least_squares(f, par, args=(data, obs)) 
print res_lsq.x 

ich kann rechts Anpassungsparameter (3.2,2.3), aber wenn ich diese Methode verallgemeinere, Multi-Dimension wie diese

def f(par,data,obs): 
return par[0]*data[0,:]+par[1]*data[1,:]-obs 
def get_f(x,a,b): 
    return x[0]*a+b*x[1] 

data = np.asarray((np.linspace(0, 50, 100),(np.linspace(0, 50, 100)))) 
obs = get_f(data,1.,1.) 

par = np.array([3.0, 5.0]) 
res_lsq = least_squares(f, par, args=(data, obs)) 
print res_lsq.x 

finde ich mich nicht richtige Antwort bekommen, dh (1, 1.) Ich habe keine Ahnung, ob ich einen Fehler gemacht habe.

Antwort

0

Die Art und Weise Daten und Beobachtungen in dem „mehrdimensionale“ Fall erzeugen führt effektiv in get_f Rückkehr (a+b)*x[0] (Eingangswert x[0], x[1] immer gleich sind) und in ähnlicher Weise f(par[0]+par[1])*data[0]-obs zurück. Natürlich würde mit a=1 und b=1 die exakt gleiche obs durch andere Werte a, b erzeugt werden, so dass a+b=1. Scipy gibt in Abhängigkeit von der anfänglichen Schätzung einen der (unendlichen) möglichen Werte zurück, die diese Bedingung erfüllen.