You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带约束的对数效用最大化Python优化代码无输出问题排查

问题原因分析

    1. 未执行main函数:你仅完成了main函数的定义,没有在代码末尾添加触发执行的语句,这是代码无任何输出的直接原因。
    1. 效用函数定义错误:np.dot()方法要求传入两个数组计算内积,你只传入了np.log(cons)一个参数,运行会直接抛出参数数量不匹配的报错。你需要计算两个对数的和,应该改为np.sum(np.log(cons))。
    1. 初始值不符合约束要求:SLSQP算法要求初始值满足所有约束条件,你设置的初始值为[40,40],代入预算约束计算总支出为4*40 + 6*40 = 400 > 40,不满足预算约束,会导致算法迭代失败。
    1. 缺少变量非负约束:对数函数要求自变量必须大于0,你没有添加c1>0、c2>0的边界约束,迭代过程中如果出现负值会直接返回nan导致求解失败。

修正后可运行代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:06:04