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
相关产品推荐
相关产品推荐

