2017-02-06 3 views
0

Ich möchte some_arg Wert finden, die die Funktion minimieren würde.Python scipy Brute-Optimierung

1) importiert

from scipy import optimize 
import math as m 

2) original 2 * sin (t) -Daten

time_steps = list(range(0,20)) 

def my_sin(time_steps): 
    sin_data = list() 
    for time_step in time_steps: 
     sin_data.append(2*m.sin(time_step)) 
    return sin_data 

my_sin_data = my_sin(time_steps) 

3) Einstellungsfehler-Berechnungs wollen i

def fun_to_brute(z, *params): 
    some_argument = z 
    sum_of_errors = 0 
    for time_step in params[0]: 
     sum_of_errors = sum_of_errors + some_argument*m.sin(time_step) - params[1][time_step] 
    return sum_of_errors 

4) schließlich minimieren Start Brute

rranges = [slice(-4, 4, 0.25)] 
params = (time_steps, my_sin_data) 
resbrute = optimize.brute(fun_to_brute, rranges, args = params, full_output=True) 

Aber die Ergebnisse, die ich bekomme, sind falsch. Ich möchte Brute Force some_arg Wert 2, in diesem Fall sum_of_errors _Must gleich Null sein.

Aber resbrute [0] gibt einigen seltsamen Wert

+0

Warum Ist Pandas da? Es schleicht sich einfach überall hin ... – Benjamin

+0

vergessen zu löschen – Demaunt

+0

Versuchen Sie, 'finish = None' zu ​​otpimize.brute hinzuzufügen – Xevaquor

Antwort

1

Wenn ich dieses Recht habe zu lesen, sind Sie nur den Skalierungsfaktor von 2 zu erholen versuchen, die Sie in Ihren ursprünglichen Daten angewandt.

Sie können die Dinge ein wenig vereinfachen. Beachten Sie, dass die Parameter für Bereich und Argumente nach Tupeln fragen. Beachten Sie auch, dass das, was Sie suchen, der Hauptparameter der Funktion ist, die Sie aufrufen.

Normalerweise würden Sie die Summe der quadrierten Residuen minimieren oder einem anderen Fehler Maßnahme durch die Differenz zwischen dem Modell zu vergleichen, wie es Ihre parameter_of_interest berechnet wird, und wie es in der experimentellen Daten ist:

import numpy 
import scipy 
from scipy import optimize 

def f(param_of_interest, *args): 

    sin_data = args[0] 
    time_steps = args[1] 

    model = param_of_interest * numpy.sin(time_steps) 
    ssq_residuals = numpy.sum((model - sin_data) ** 2) 
    return ssq_residuals 

# Your input data 
time_steps = numpy.arange(20) 
factor = 2 
sin_data = factor * numpy.sin(time_steps) 

result= scipy.optimize.brute(f, 
          (slice(-4, 4, 0.25),), 
          args=(sin_data, time_steps), 
          full_output=True) 
print(result) # Gives expected answer of 2.