带约束的对数效用最大化Python优化代码无输出问题排查
问题原因分析
- 未执行main函数:你仅完成了main函数的定义,没有在代码末尾添加触发执行的语句,这是代码无任何输出的直接原因。
- 效用函数定义错误:
np.dot()方法要求传入两个数组计算内积,你只传入了np.log(cons)一个参数,运行会直接抛出参数数量不匹配的报错。你需要计算两个对数的和,应该改为np.sum(np.log(cons))。
- 效用函数定义错误:
- 初始值不符合约束要求:SLSQP算法要求初始值满足所有约束条件,你设置的初始值为
[40,40],代入预算约束计算总支出为4*40 + 6*40 = 400 > 40,不满足预算约束,会导致算法迭代失败。
- 初始值不符合约束要求:SLSQP算法要求初始值满足所有约束条件,你设置的初始值为
- 缺少变量非负约束:对数函数要求自变量必须大于0,你没有添加
c1>0、c2>0的边界约束,迭代过程中如果出现负值会直接返回nan导致求解失败。
- 缺少变量非负约束:对数函数要求自变量必须大于0,你没有添加
修正后可运行代码
import numpy as np from scipy import optimize def main(): """ solving a regular constrained optimization problem max ln(cons[0]) + ln(cons[1]) st. prices[0]*cons[0] + prices[1]*cons[1] <= I """ prices = np.array([4.0, 6.0]) I = 40.0 # 修正效用函数:计算两个对数的和 util = lambda cons: np.sum(np.log(cons)) budget = lambda cons: I - np.dot(prices, cons) # 修正初始值:选择满足约束的初始点 initval = np.array([1.0, 1.0]) res = optimize.minimize(lambda x: -util(x), initval, method='slsqp', # 添加变量非负边界约束 bounds=((1e-9, None), (1e-9, None)), constraints={'type':'ineq', 'fun':budget}, tol=1e-9) assert res['success'] == True print("最优消费组合:", res.x) print("最大化效用值:", util(res.x)) print("总支出:", np.dot(prices, res.x)) # 触发函数执行 if __name__ == "__main__": main()
输出结果说明
运行代码后会得到和解析解一致的结果:c1=5,c2≈3.333,最大效用值≈2.813,总支出刚好等于40,完全满足预算约束。
内容的提问来源于stack exchange,提问作者pao
相关产品推荐
相关产品推荐

