Python报错:'numpy.ndarray'对象不可调用的解决方法咨询
解决TypeError: 'numpy.ndarray' object is not callable错误
错误根源
问题出在find_k函数的一阶条件(FOC)计算中。调用V_function_prime(production(k) - R*phi*k)后得到的是numpy标量或数组,后续直接用括号(production_prime(k)-R*phi)会被Python解析为“调用这个数组对象”,而numpy数组本身不支持函数调用,因此触发TypeError。
修正方案
将find_k函数中FOC的乘法部分从括号改为*运算符,其他函数的V_function_prime调用逻辑无需修改:
修正后的find_k函数
def find_k(k, w, v_function_prime): # 把原代码中的括号改为*,表示乘法运算 foc = (1-phi)*u_prime(w - (1-phi)*k) - beta*v_function_prime(production(k) - R*phi*k) * (production_prime(k)-R*phi) return foc
完整修正代码
import numpy as np import copy as cp import scipy as sp from scipy import optimize as optimize from scipy.interpolate import PchipInterpolator as pchip # primatives beta = .8 R = 1.02 phi = .8 # define a grid size = 100 w_grid = np.linspace(0.001,5,num = size) # set up functions def utility(c): return np.log(c) def u_prime(c): return 1/c def production(k): return k**(1/3) def production_prime(k): return 1/3*k**(-2/3) def production_2prime(k): return (-2/9)*k**(-5/3) def inv_prod_prime(x): return (3*x)**(-2/3) # define functions to get threshold value wbar and optimal policy b, k def find_w(V_function_prime, k_star, capital_evolution): w_bar = (1-phi)*k_star + 1/(beta*R*V_function_prime(capital_evolution)) return w_bar # takes in value w and current guess of v_prime and returns optimal bond choice (b) def find_b(b, w, v_function_prime, k_star): foc = u_prime(w - b - k_star) - beta*R*v_function_prime(production(k_star) + R*b) return foc # takes in value w and current guess of v_prime and returns optimal capital choice (k) def find_k(k, w, v_function_prime): # 修正:将括号改为乘法运算符* foc = (1-phi)*u_prime(w - (1-phi)*k) - beta*v_function_prime(production(k) - R*phi*k) * (production_prime(k)-R*phi) return foc # value function iteration function def vfi(R, phi, beta, size, tol): k_star = inv_prod_prime(R) capital_evolution = production(k_star)-R*phi*k_star # inital guess of value function is utility VV = utility(w_grid) # params of loop err = tol + 1 epsilon = 1e-5 while err > tol: V_previous = cp.copy(VV) V_function = pchip(w_grid, VV) V_w = V_function(w_grid) V_function_prime = V_function.derivative(1) V_prime_w = V_function_prime(w_grid) w_bar = find_w(V_function_prime, k_star, capital_evolution) k_prime = np.zeros(size) b_prime = np.zeros(size) for i in range(size): # solve unconstrained region of state-space if w_grid[i] >= w_bar: k_choice = k_star # limits set based on natural bounds for borrowing given in the SP b_choice = optimize.brentq(find_b, (-phi*k_star), (w_grid[i] - k_star - epsilon), args = (w_grid[i], V_function_prime, k_star)) # solve constrained region of state-space else: bound = w_grid[i]/(1-phi) - epsilon k_choice = optimize.brentq(find_k, (epsilon), (bound), args = (w_grid[i], V_function_prime)) b_choice = -phi*k_choice # add in new guesses for optimal b, k, and update value function vector k_prime[i] = k_choice b_prime[i] = b_choice VV[i] = utility(w_grid[i] - b_prime[i] - k_prime[i]) + beta*V_function(production(k_prime[i]) + R*b_prime[i]) V_function_update = pchip(w_grid, VV) err = np.max(np.abs(V_function_update(w_grid) - V_w)) print(err) V_function = V_function_update return V_function, b_prime, k_prime vfi(R, phi, beta, size = 100, tol = 1e-3)
补充说明
V_function.derivative(1)返回的是PCHIP插值函数,调用该函数会得到输入点对应的导数值(标量或numpy数组)。在Python中不能像数学公式那样用括号省略乘号,必须显式使用*运算符表示乘法,否则会被误判为函数调用。
内容的提问来源于stack exchange,提问作者user12459040
相关产品推荐
相关产品推荐

