我正在解决一些消费者的问题,优化一些选择。我正在尝试使用scipy中的optimize.minimize_scalar()函数,但出现错误:
Traceback (most recent call last):
File "/Users/User/Documents/GitHub/dynamic_programming/model_our_paper.py", line 238, in <module>
sol_C, sol_V = model.solve()
File "/Users/User/Documents/GitHub/dynamic_programming/model_our_paper.py", line 69, in solve
obj_func, bounds=[0, k], method='bounded'
File "/Users/User/opt/anaconda3/lib/python3.7/site-packages/scipy/optimize/_minimize.py", line 790, in minimize_scalar
return _minimize_scalar_bounded(fun, bounds, args, **options)
File "/Users/User/opt/anaconda3/lib/python3.7/site-packages/scipy/optimize/optimize.py", line 1880, in _minimize_scalar_bounded
if np.isnan(xf) or np.isnan(fx) or np.isnan(fu):
UnboundLocalError: local variable 'fu' referenced before assignment
我不确定您需要多少代码,因为我想不出一种方法来为我的代码提供一个示例,以便您可以复制。如果您有任何建议,请评论。但引起错误的代码部分如下:
def solve(self):
shape = (self.T, 2, 50)
sol_C = np.nan * np.zeros(shape)
sol_V = np.nan * np.zeros(shape)
# Last period, consume all.
for L in (0, 1):
sol_C[self.T-1, L, :] = self.grid_K.copy()
sol_V[self.T-1, L, :] = self.utility_f(sol_C[self.T-1, L, :], L)
# Loop over all other periods.
for t in range(self.T-2, -1, -1):
for L in (0, 1):
for k_i, k in enumerate(self.grid_K):
obj_func = lambda x: -self.value_of_choice(
x, L, k, self.grid_K, sol_V[t+1, :, :]
)
result = optimize.minimize_scalar(
obj_func, bounds=[0, k], method='bounded'
)
sol_C[t, L, k_i] = result.x
sol_V[t, L, k_i] = result.fun
return sol_C, sol_V
def value_of_choice(self, x, L, k, K_next, V_next):
K_plus = k*(1 - self.delta) + L
EV_next = self.interp_linear_1d_scalar(
K_next, V_next[L, :], K_plus
)
V_guess = self.utility_f(x, L) + self.beta*EV_next
return V_guess
我尝试了以下方法,效果很好:
from scipy import optimize
f = lambda x: (x - 2)*x*(x - 1)**2
k = 10
res = optimize.minimize_scalar(f, bounds=[0, k], method='bounded')
print(res.x)
我使用的是更新版MacOS的Macbook。尝试更新Scipy,并重新安装了我的python版本,这是我从Anaconda获得的
感谢@rpoleski和@WarrenWeckesser帮助我解决了这个问题。这似乎是边界相等时发生的错误,事实就是如此。这个bug似乎有更新,但它似乎仍在开发中
所以我的工作就是在上限上加一点。有趣的是,这不起作用:
但是这个起作用了:
相关问题 更多 >
编程相关推荐