2016-04-05 8 views
0

Ich habe einige Daten aus dem Labor zu analysieren. Bisher war es ein Problem, das von einer Variablen abhängig war. Deshalb fand ich eine Lösung (http://kitchingroup.cheme.cmu.edu/blog/category/interpolation/):2D-Interpolation und maximal mit interp2d und fmin/minimieren von scipy

# use splines to fit and interpolate data 
from scipy.interpolate import interp1d 
from scipy.optimize import fmin 
import numpy as np 

x = np.array([ 0,  1,  2,  3,  4 ]) 
y = np.array([ 0.,  0.308, 0.55, 0.546, 0.44 ]) 

# create the interpolating function 
f = interp1d(x, y, kind='cubic', bounds_error=False) 

# to find the maximum, we minimize the negative of the function. We 
# cannot just multiply f by -1, so we create a new function here. 
f2 = interp1d(x, -y, kind='cubic') 
xmax = fmin(f2, 2.5) 

[...] 

es herausgefunden, dass mein Problem auf mindestens zwei Parameter abhängig ist. Also habe ich versucht, "interp2d" für ein multidimensionales Problem anzuwenden. Aber ich habe nicht verstanden, wie genau das geht.

Ich habe eine Matrix von Daten für die Prüfung, die wie ist:

 | 2.00 | 2.50 | 3.00 | 3.50 | ... 
-------------------------------------- 
5.00 | 0.0 | 60.0 | 10.0 | 0.00 
10.0 | 0.0 | 100.0| 70.0 | 30.0 
25.0 | 10.0 | 40.0 | 50.0 | 10.0 
50.0 | 15.0 | 30.0 | 10.0 | 0.0 
... 

Ich las diesen Beitrag „Scipy interpolation on a numpy array“, die für mich sehr interessant war. Es ist jetzt möglich, Daten wie im Beispiel zu interpolieren. Aber ich weiß nicht, wie man eine Funktion wie "minimieren" von scipy anwendet. Es gibt ein Beispiel (http://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.optimize.minimize.html#scipy.optimize.minimize), aber die Verwendung einer analytischen Funktion anstelle eines interpolierten Datasets wie im obigen 1D-Beispiel.

res = minimize(func, x0, method='Nelder-Mead') 

Als ich versuchte es die gleiche Weise, die ich wegen der Form des Arrays in Schwierigkeiten geraten zu verwenden interp2d zu tun. Vielleicht ist es der Schlüssel, um das Problem zu lösen, es zu benutzen?

Vielleicht kann mir jemand erklären, wie man eine solche 2D-Interpolation benutzt und wie man das Maximum findet.

Grüße, Alex

Antwort

0

Aufgrund meiner Erfahrung mit dem 1D-Problem änderte es Code wie folgt:

[...] 

import scipy as sp 
import numpy as np 

[...] 

x, y, z = self.Data 

# make matrix for both parameters 
xx, yy = np.meshgrid(x, y)   

# change shape of values in z 
s = xx.shape  
z = z.reshape(s) 

# create the interpolating function and inverse function   
kind = 'cubic'   
self.F2 = interp2d(xx, -yy, z, kind, bounds_error=False) 

Dies funktioniert und ich kann Datenpunkte aus der interpolierten Matrix erhalten. Aber ich kann nicht für die Funktion im nächsten Schritt minimieren:

# i used ranges for the x value from 2000 to 3500 and for y from 10 to 50. Maybe this is wrong? 
rranges = (slice(2000, 3500, 1), slice(10, 50, 1)) 

resbrute = sp.optimize.brute(self.F2, rranges, finish=sp.optimize.fmin) 

Die folgende Ausnahme ausgelöst:

File "optimizer.py", line 199, in getIntpMax 
resbrute = sp.optimize.brute(self.F2, rranges, finish=sp.optimize.fmin) 

File "c:\program files\Anaconda3\lib\site-packages\scipy\optimize\optimize.py", line 2551, in brute 
Jout = vecfunc(*grid) 
File "c:\program files\Anaconda3\lib\site-packages\numpy\lib\function_base.py", line 1700, in __call__ 
return self._vectorize_call(func=func, args=vargs) 
File "c:\program files\Anaconda3\lib\site-packages\numpy\lib\function_base.py", line 1763, in _vectorize_call 
ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args) 
File "c:\program files\Anaconda3\lib\site-packages\numpy\lib\function_base.py", line 1725, in _get_ufunc_and_otypes 
outputs = func(*inputs) 
File "c:\program files\Anaconda3\lib\site-packages\scipy\optimize\optimize.py", line 2545, in _scalarfunc 
return func(params, *args) 

TypeError: __call__() missing 1 required positional argument: 'y' 

Also, was ist das fehlende Positions Argument? Bedeutet das, dass ich nicht mindestens zwei Parameter erhalten kann, ohne ein bestimmtes x zu definieren?

Verwandte Themen