使用constrOptim最大化生产函数的两类问题求解
问题解答
问题1:解决"argument 'K' is missing"报错
constrOptim要求目标函数的输入是单个向量参数,但你定义的production_function用了两个独立参数L和K,导致函数无法正确接收theta向量。修改生产函数,让它接收向量参数并拆分出L和K即可:
production_function <- function(theta) { L <- theta[1] K <- theta[2] K*L + L }
问题2:将不等式约束改为等式约束
constrOptim仅支持线性不等式约束,要实现2*L +1.4*K =100的等式约束,有两种可行方案:
方案1:把等式拆成对偶不等式约束
等式A = B等价于A ≥ B且A ≤ B,对应到constrOptim的参数中就是添加反向约束:
# 构造约束矩阵:包含2L+1.4K≥100、2L+1.4K≤100、L>0、K>0 ui <- rbind(c(2, 1.4), c(-2, -1.4), c(1, 0), c(0, 1)) ci <- c(100, -100, 0, 0) # 调用优化函数 result <- constrOptim(theta = c(30,30), ui = ui, ci = ci, f = production_function, grad = NULL)
这种方法通过两个不等式约束逼近等式,数值优化中可达到近似等式的效果。
方案2:拉格朗日乘数法转化为无约束优化
利用等式约束消去一个变量,比如从2L +1.4K =100解出K = (100 - 2L)/1.4,代入生产函数转化为单变量优化问题:
# 代入约束后的单变量生产函数 prod_single_var <- function(L) { K <- (100 - 2*L)/1.4 K*L + L } # 求解最大值(L的取值范围:0 < L < 50,保证K>0) result <- optimize(f = prod_single_var, interval = c(0, 50), maximum = TRUE)
这种方法更直接,将二维优化简化为一维,计算效率更高。
内容的提问来源于stack exchange,提问作者Tunay Sabri Yüksel
相关产品推荐
相关产品推荐

