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

R语言solnp函数求解消费者选择模型最优化问题异常排查

问题原因
  • 初始值设置错误:当前使用(0,0)作为初始迭代点,既不满足等式约束M[1]*x[1]+M[2]*x[2] = M[3](代入后左边为0,测试用例中右边为15),导致solnp第一步线性化时直接判定无可行解;同时初始点刚好在定义域边界,算法陷入局部点无法迭代。
  • 边界数值不稳定:变量下界LB设为0,而柯布-道格拉斯效用函数在x=0处的偏导趋近于无穷大,会导致黑塞矩阵数值奇异,出现求逆失败的报错。
  • 目标函数和约束的取负逻辑本身是正确的,不需要修改这部分逻辑。
修复方案

步骤1:替换为满足约束的正初始值

选择符合等式约束的正数值作为初始点,可写通用逻辑生成初始值,比如c(M[3]/(2*M[1]), M[3]/(2*M[2]))保证初始点天然符合约束要求。

步骤2:调整下界为极小正数

将LB从c(0,0)改为c(1e-6, 1e-6),避免边界数值不稳定问题。

修复后完整代码

library(Rsolnp)
U = function(x){ 
  -P[1]*(x[1]^P[2])*(x[2]^P[3])
}
B = function(x){ 
  -M[1]*x[1]-M[2]*x[2]
}
CCM = function(P,M){
  # 生成符合约束的初始值
  init_x1 = M[3]/(2*M[1])
  init_x2 = M[3]/(2*M[2])
  solnp(c(init_x1, init_x2),
        U,
        eqfun=B,
        eqB=-M[3],
        LB=c(1e-6,1e-6),
        UB=c(10000,10000),
        control = list(trace = 0) # 可选,关闭迭代日志输出
  )
}

测试结果验证

P <- c(2,0.1,0.9)
M <- c(1,2,15)
res <- CCM(P, M)
res$pars
# 输出应为 [1] 1.5000 6.7500,符合柯布-道格拉斯需求函数的理论解
res$convergence
# 输出应为 [1] 0,代表求解成功、结果可靠

内容的提问来源于stack exchange,提问作者DPedro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:24:04