scipy.optimize_scalar()给出“UnboundLocalError:赋值前引用的局部变量'fu”

2024-05-14 13:46:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在解决一些消费者的问题,优化一些选择。我正在尝试使用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获得的


Tags: inpyselfnplinescipyusersfile
1条回答
网友
1楼 · 发布于 2024-05-14 13:46:46

感谢@rpoleski和@WarrenWeckesser帮助我解决了这个问题。这似乎是边界相等时发生的错误,事实就是如此。这个bug似乎有更新,但它似乎仍在开发中

所以我的工作就是在上限上加一点。有趣的是,这不起作用:

result = optimize.minimize_scalar(
                        obj_func, bounds=[0, k+1.0e-5], method='bounded'
                    )

但是这个起作用了

result = optimize.minimize_scalar(
                        obj_func, bounds=[0, k+1.0e-4], method='bounded'
                    )

相关问题 更多 >

    热门问题