2016-05-23 4 views
0

Я следую за кодом в книге «Python for Finance» и пытаюсь оптимизировать функцию, но получаю сообщение об ошибке при выполнении кода.Объект numpy.ndarray, не вызываемый в грубой форме

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) 

Ошибка:

Traceback (самый последний вызов последнего):

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

Смежные вопросы