试图最大化函数时,索引1超出大小为1的轴0的界限

2024-04-25 23:27:09 发布

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

我试图设置一个动态规划问题:

import numpy as np
from scipy.optimize import minimize
from scipy.interpolate import interp1d


alpha = 1
beta = 0.5
nabla = 0.5
A = 1
delta = 1
rho = 1

grid_max=10
grid_size=250
grid = np.linspace(1e-5, grid_max, grid_size)

def u(x):
    return np.log((x[0]**alpha)*x[0]**(beta+nabla))

def f(x):
    return A*x

def k_plus(k,x):
    return f(k)+(1-delta)-x[0]-x[1]

def obj_fun(x,k,v_array):
    """note v_array is our guess of v evaluated at the grid points. 
    we then interpolate in between"""
    v = interp1d(grid, v_array)

    return u(x) + rho*v(k_plus(k,x))

x_prueba = [2,2]
k=10
objetivo = lambda x: (-1)*obj_fun(x,k,np.log(grid))
minimize(objetivo, x0=[0,0], bounds=[(0, None), (0,None)], 
         constraints={"type": "ineq", "fun": lambda x: -x[0] -  x[1] + 10})

为了便于计算,这些参数的值是这样的,但它们当然是不同的。 我得到的最新错误是: 超出迭代限制

我很感激你的帮助,如果这个问题不合适,请告诉我,以便解决它


Tags: fromimportalphareturndefnpscipyarray
1条回答
网友
1楼 · 发布于 2024-04-25 23:27:09

我使用的是python3.6.9和scipy1.3.3。您的代码运行良好,只是最小化操作没有收敛。这是因为您从x0 = [0, 0]开始,它在u(x)中使用,然后计算log(0)。如果您提供一个不同的x0(直到[5,4],然后它停止收敛),它就可以工作了。稍微重写一下(例如,您不需要interp1d,因为您要插值的只是一个自然对数),这看起来像:

import numpy as np
from scipy.optimize import minimize


def u(x):
    return np.log(x[0] ** alpha * x[0] ** (beta + nabla))


def k_plus(k, x):
    return A * k + 1 - delta - x[0] - x[1]


def obj_fun(x, k, v_array):
    return -u(x) - rho * np.log(k_plus(k, x))


alpha = 1
beta = 0.5
nabla = 0.5
A = 1
delta = 1
rho = 1

grid_max = 10
grid_size = 250
grid = np.linspace(1e-5, grid_max, grid_size)

x_prueba = [2, 2]
k = 10

res = minimize(obj_fun, x0=[5, 4], args=(k, np.log(grid)),
               bounds=((0, np.inf), (0, np.inf)),
               constraints={"type": "ineq",
                            "fun": lambda x: -x[0] - x[1] + 10})
print(res.success)
print(res.x)

这个指纹

True
[6.66662927 0.        ]

相关问题 更多 >