2016-05-23 29 views
0

我按照「Python for Finance」一書中的代碼嘗試優化函數,但在執行代碼時出現錯誤。numpy.ndarray對象不能在brute中調用

TypeError: 'numpy.ndarray' object is not callable

此錯誤的其他論壇似乎並不適用。

請讓我知道我要去哪裏錯了。

代碼:

# import libraries 
import matplotlib.pyplot as plt 
import matplotlib as mpl 
import numpy as np 
import scipy.optimize as spo 
from mpl_toolkits.mplot3d import Axes3D 

# define function 
def fm(x, y): 
    return (np.sin(x) + 0.05*x**2 + np.sin(y) + 0.05*y**2) 

# construct range vectors  
x = np.linspace(-10, 10, 50) 
y = np.linspace(-10, 10, 50) 
X, Y = np.meshgrid(x, y) 
Z = fm(X, Y) 

# plot surface 
fig = plt.figure(figsize=(9, 6)) 
ax = fig.gca(projection='3d') 
surf = ax.plot_surface(X, Y, Z, rstride=2, cstride=2,cmap=mpl.cm.coolwarm,linewidth=0.5, antialiased=True) 
ax.set_xlabel('x') 
ax.set_ylabel('y') 
ax.set_zlabel('f(x, y)') 
fig.colorbar(surf, shrink=0.5, aspect=5) 

# define function for optimisation 
def fo(x, y): 
    z = np.sin(x) + 0.05*x**2 + np.sin(y) + 0.05*y**2 
    if output == True: 
     print(x, y, z) 
    return z 

# print each iteration? 
output = True 
rranges = (slice(-10, 10.1, 5), slice(-10, 10.1, 5)) 
params = (x,y) 
# optimise 
spo.brute(fo(x,y), ((-10, 10.1, 5),(-10, 10.1, 5)), finish=None) 

錯誤:

回溯(最近通話最後一個):

File "<ipython-input-1-76b5e42b4ae6>", line 1, in <module> 
    runfile('C:/Users/Chris/Dropbox/Chris Personal/Learning Python Resources/Python for Finance/Chapter 9/trial_convex_optimisation.py', wdir='C:/Users/Chris/Dropbox/Chris Personal/Learning Python Resources/Python for Finance/Chapter 9') 

    File "C:\Users\Chris\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 699, in runfile 
    execfile(filename, namespace) 

    File "C:\Users\Chris\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 88, in execfile 
    exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace) 

    File "C:/Users/Chris/Dropbox/Chris Personal/Learning Python Resources/Python for Finance/Chapter 9/trial_convex_optimisation.py", line 46, in <module> 
    spo.brute(fo(x,y), [(-10, 10.1, 5),(-10, 10.1, 5)], finish=None) 

    File "C:\Users\Chris\Anaconda3\lib\site-packages\scipy\optimize\optimize.py", line 2604, in brute 
    Jout = vecfunc(*grid) 

    File "C:\Users\Chris\Anaconda3\lib\site-packages\numpy\lib\function_base.py", line 1811, in __call__ 
    return self._vectorize_call(func=func, args=vargs) 

    File "C:\Users\Chris\Anaconda3\lib\site-packages\numpy\lib\function_base.py", line 1874, in _vectorize_call 
    ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args) 

    File "C:\Users\Chris\Anaconda3\lib\site-packages\numpy\lib\function_base.py", line 1836, in _get_ufunc_and_otypes 
    outputs = func(*inputs) 

    File "C:\Users\Chris\Anaconda3\lib\site-packages\scipy\optimize\optimize.py", line 2598, in _scalarfunc 
    return func(params, *args) 

TypeError: 'numpy.ndarray' object is not callable 
+2

提供一個MWE(最小工作示例)。 –

+2

您應該將代碼添加到代碼塊中,而不是添加到附加圖像中。您還應該發佈實際的錯誤,因爲它包含堆棧跟蹤中的行號。 – renemilk

回答

-1

您能打電話scipy.optimize.brute功能是錯誤的。您有定義如下fo功能和rranges來電:

def fo(xy): 
    x, y = xy 
    z = np.sin(x) + 0.05*x**2 + np.sin(y) + 0.05*y**2 
    if output == True: 
     print(x, y, z) 
    return z 

rranges = (slice(-10, 10.1, 5), slice(-10, 10.1, 5)) 

spo.brute(fo, rranges, finish=None) 
+0

謝謝,這個工程。 – Chris

相關問題