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

在JuMP中使用导数输入约束的正确方法与最佳实践

JuMP中导数约束与近连续时间建模的最佳实践

针对你基于生产函数推导的导数约束建模需求,以下是JuMP中更简洁优雅的实现方案,无需手动管理滞后项或额外的微分变量:

1. 用对数变量直接建模,简化约束逻辑

你的生产函数和导数约束已采用对数形式,可直接定义对数变量避免重复计算,同时贴合约束形式:

using JuMP, Ipopt

model = Model(Ipopt.Optimizer)
T = 10  # 时间步数
n = 3   # 投入品数量

# 直接定义对数形式的变量,替代原变量的对数计算
@variable(model, ln_X[1:n, 1:T])
@variable(model, ln_Q[1:T])

# 生产函数约束:直接对应ln Q = sum(phi_i ln X_i)
phi = [0.3, 0.4, 0.3]  # 示例参数
@constraint(model, [t in 1:T], ln_Q[t] == sum(phi[i] * ln_X[i,t] for i in 1:n))

2. 用有限差分替代导数,无需手动定义微分变量

对于近连续时间建模,直接用相邻时间步的变量差近似微分,完美匹配你推导的导数约束,无需额外定义d(Q)或d(X_i):

eta = 0.5  # 示例参数
P = [2.0, 3.0, 2.5]  # 投入品价格

# 导数约束离散化:d(ln X_i) ≈ ln_X[i,t] - ln_X[i,t-1],d(ln Q)同理
@constraint(model, [i in 1:n, t in 2:T], 
    ln_X[i,t] - ln_X[i,t-1] == (ln_Q[t] - ln_Q[t-1]) - sum(eta * phi[j] * (P[i] - P[j]) for j in 1:n if j != i)
)

3. 初始条件与预算约束的整合

  • 初始值直接转化为对数形式赋值:
X_initial = [10.0, 15.0, 12.0]
@constraint(model, [i in 1:n], ln_X[i,1] == log(X_initial[i]))
  • 预算约束通过指数还原原变量实现:
B = [100.0, 105.0, 110.0, 115.0, 120.0, 125.0, 130.0, 135.0, 140.0, 145.0]  # 各期预算
@constraint(model, [t in 1:T], sum(P[i] * exp(ln_X[i,t]) for i in 1:n) <= B[t])

4. 目标函数设置

以最大化总产出现值为例,直接用对数变量还原后计算:

discount_rate = 0.05
@objective(model, Max, sum(exp(ln_Q[t]) / (1 + discount_rate)^(t-1) for t in 1:T))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:42:35