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

如何在MOSEK C++中表达分式形式的目标函数?

在MOSEK C++中实现分式目标函数$\frac{a}{b+ac}$的方法

MOSEK是凸优化求解器,仅支持凸/凹形式的目标与约束,无法直接处理除法。针对你的分式$\frac{a}{b+ac}$($a$为变量,$b,c$为参数),需先通过代数变形和凸性分析,转化为MOSEK可支持的形式,以下分场景说明:

前提条件

首先需明确变量与参数的符号约束(保证分式有意义且满足凸性要求):假设$b>0$、$c>0$、$a>0$,此时分母$b+ac>0$,且原函数$f(a)=\frac{a}{b+ac}$为凹函数。


场景1:最大化原函数

最大化凹函数属于凸优化问题(等价于最小化其相反数),可通过以下步骤实现:

  1. 先对原函数做代数变形:
    $$f(a)=\frac{a}{b+ac}=\frac{1}{c}-\frac{b}{c}\cdot\frac{1}{b+ac}$$
    最大化$f(a)$等价于最小化$\frac{1}{b+ac}$(常数项不影响优化方向)。
  2. 利用MOSEK支持的Expr::inv()函数(仅对正数表达式有效)构建目标,同时添加分母为正的约束。

修正后的代码示例

// 定义变量与参数
Variable::t a_numerator = M->variable();
Parameter::t b_denominator_1 = M->parameter();
Parameter::t c_denominator_2 = M->parameter();

// 修正原代码的括号错误,构建分母表达式
Expression::t b_add_ac = Expr::add(b_denominator_1, Expr::mul(a_numerator, c_denominator_2));

// 添加约束:保证分母为正(可替换为极小正数避免数值问题)
M->constraint(b_add_ac, Domain::greaterThan(1e-8));

// 设定目标:最小化1/(b+ac),等价于最大化原分式函数
M->objective(ObjectiveSense::Minimize, Expr::inv(b_add_ac));

结果转换

求解完成后,可通过最优变量值计算原分式的结果:
假设$a$的最优值为a_opt,参数$b$、$c$的取值为b_val、c_val,则原函数的最优值为:
$$f_{opt} = \frac{a_{opt}}{b_{val} + a_{opt} \cdot c_{val}}$$


场景2:最小化原函数

当$b>0$、$c>0$、$a>0$时,原函数$f(a)$是凹函数,最小化凹函数不属于凸优化问题,MOSEK无法直接处理。若必须做最小化,需调整问题约束、变量范围,或更换非凸优化求解器。


关键注意事项

  • 必须保证分母$b+ac>0$,否则分式无意义,且MOSEK的inv()函数仅支持正数输入。
  • MOSEK仅能处理凸优化问题,所有目标与约束需满足凸性要求,否则无法得到有效解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:40:28