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

CPLEX建模中cos/sin函数调用报错问题求助

OPL模型中cos函数报错的解决方案

问题根源

你遇到的报错主要来自两个点:

  • forall语句语法错误:原代码中forall(i in 0..3)仅约束了第一行等式,后续的p[i]-pg[i]+pd[i]==0不在循环范围内,破坏了语法结构
  • 三角函数用法错误:OPL中直接使用cos()即可,不需要Math.或Opl.前缀,同时要确保传入的是弧度值(若你的del是角度,需乘以PI/180转换)

修正后的完整代码

float c1[0..3]=[50,0,0,50];
float c2[0..3]=[351,0,0,389];
float c3[0..3]=[44.6,0,0,40.6];
float pd[0..3]=[50,170,200,80];
float qd[0..3]=[10,20,30,40];
float V[0..3]=[1.0,1.0,1.0,1.0];
float del[0..3]=[0,0,0,0]; // 若为角度,需改为del[i]*PI/180
float p[0..3];
float q[0..3];
float G[0..3][0..3]=[ [5.724138, -1.724138,0,-4],
                      [-1.724138,4.224138,-2.5,0],
                      [0,-2.5,4.386792,-1.886792],
                      [-4,0,-1.886792,5.886792]];
float B[0..3][0..3]=[ [-12.31034,4.310345,0,8],
                      [4.310345,-11.810340,7.5,0],
                      [0,7.5,-14.10377,6.603774],
                      [8,0,6.603774,-14.603770]];
dvar float+ pg[0..3];
dvar float+ Qg[0..3];

minimize sum(i in 0..3)(c1[i]*pg[i]^2 + c2[i]*pg[i] + c3[i]);

subject to
{
  forall(i in 0..3) { // 用大括号包裹循环内所有约束
    p[i]==V[i]*(sum(j in 0..3)(V[j]*(G[i][j]*cos(del[i]-del[j]))));
    p[i]-pg[i]+pd[i]==0;
  }
  
  forall(i in 0..3) {
    // 补充:原无功功率公式通常包含B矩阵项,这里按正确公式修正(可选)
    q[i]==V[i]*(sum(j in 0..3)(V[j]*(G[i][j]*sin(del[i]-del[j]) + B[i][j]*cos(del[i]-del[j]))));
    q[i]-Qg[i]+qd[i]==0;  
  }
  
  // forall(i in 0..3) pg[i]<=30; // 若需要可取消注释
}

关键修正说明

  1. 修复forall结构:给每个forall循环添加大括号,确保循环内的所有约束都属于该循环块,这是语法报错的核心原因
  2. 正确使用cos函数:直接调用cos(弧度值),OPL内置支持该函数,无需额外前缀
  3. 可选:完善无功约束:原代码中q的约束缺少B矩阵和sin项,这不符合电力系统无功功率的经典公式,若你的模型需要准确计算无功,建议按代码中补充的内容修正

内容的提问来源于stack exchange,提问作者Haripriya M R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:11:30