2016-04-05 13 views
0

Analiz için laboratuvarımızdan bazı verilerim var. Şimdiye kadar bir değişkene bağlı olan bir problemdi.2D interpolasyon ve maksimum interp2d ve fmin/minimuma göre en az

# 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) 

[...] 

Bu benim sorunum en az iki parametre dependend olduğunu anladım: Bu yüzden bir çözüm (http://kitchingroup.cheme.cmu.edu/blog/category/interpolation/) bulundu. Bu yüzden çok boyutlu bir problem için "interp2d" yi uygulamaya çalıştım. Ama aslında nasıl olduğunu tam olarak anlamadım.

 | 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 
... 

benim için oldukça ilginçti bu yayını "Scipy interpolation on a numpy array" okuyun:

Ben gibidir test için bir veri matrisi var. Şimdi örnekte olduğu gibi verileri karıştırmam mümkün. Ama scipy'den "küçült" gibi bir işlevi nasıl uygulayacağımı bilmiyorum. Bir örnek (http://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.optimize.minimize.html#scipy.optimize.minimize) vardır, ancak yukarıdaki 1D örneğinde olduğu gibi enterpolasyonlu veri kümesi yerine bir analitik işlev kullanın.

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

ben o ben çünkü dizinin şeklinin derde girdi aynı şekilde yapmaya interp2d kullanmaya çalıştım. Belki sorunu kullanmak için sorunu çözmek için anahtardır?

Belki birisi böyle bir 2D enterpolasyonu nasıl kullanacağımı ve maksimum değeri nasıl bulacağımı açıklayabilir. 1D sorunla tecrübeme dayanarak

Selamlar, Alex

cevap

0

Aşağıdaki kod değiştirildi:

[...] 

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) 

Bu çalışır ve ben interpole matrisinden datapoints alabilirsiniz. Ama sonraki adımda işlevini en aza başvuruda bulunamazlar:

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' 

Yani eksik pozisyonel argüman şudur:

# 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) 

Bu şu istisna atar? Bu, belirli bir x tanımlamaksızın en az iki parametreyi alamam anlamına mı geliyor?

İlgili konular