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

Julia线性优化模型MethodError求助:无匹配乘法方法

问题描述

在Julia中构建线性优化模型时,添加标量Sb=250到约束中出现错误,原始约束代码如下:

@constraint(planing, cons_freq[i=1:nGen, j=1:nBloques],
pg[i,j] <=  Delta_f*(sum(H[k]*pCap[k])/Sb  for k in 1:nGen if k != i))

相关变量说明:

  • pCap是JuMP的@variable定义变量
  • H为3x1矩阵,值为[2,3,4]
  • Delta_f=0.0008714285714285706
  • pg[i,j]表示机组i在时段j的发电量

得到的错误信息:

ERROR: MethodError: no method matching *(::Float64, ::Base.Generator{Base.Iterators.Filter{var"#559#562"{Int64}, UnitRange{Int64}}, var"#558#561"})

Closest candidates are:
  *(::Any, ::Any, ::Any, ::Any...)
   @ Base operators.jl:578
  *(::T, ::T) where T<:Union{Float16, Float32, Float64}
   @ Base float.jl:410
  *(::Union{Float16, Float32, Float64}, ::BigFloat)
   @ Base mpfr.jl:423
  ...

Stacktrace:
  [1] operate(::typeof(*), ::Float64, ::Base.Generator{Base.Iterators.Filter{var"#559#562"{Int64}, UnitRange{Int64}}, var"#558#561"})
    @ MutableArithmetics C:\Users\Gosha\.julia\packages\MutableArithmetics\cnvbo\src\interface.jl:206
  [2] macro expansion
    @ C:\Users\Gosha\.julia\packages\MutableArithmetics\cnvbo\src\rewrite.jl:321 [inlined]
  [3] macro expansion
    @ C:\Users\Gosha\.julia\packages\JuMP\OUdu2\src\macros.jl:710 [inlined]
  [4] (::var"#557#560"{Model})(i::Int64, j::Int64)
    @ Main C:\Users\Gosha\.julia\packages\JuMP\OUdu2\src\Containers\macro.jl:301
  [5] #84
    @ C:\Users\Gosha\.julia\packages\JuMP\OUdu2\src\Containers\container.jl:85 [inlined]
  [6] iterate
    @ .\generator.jl:47 [inlined]
  [7] collect(itr::Base.Generator{JuMP.Containers.VectorizedProductIterator{Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}}}, JuMP.Containers.var"#84#85"{var"#557#560"{Model}}})
    @ Base .\array.jl:782
  [8] map(f::Function, A::JuMP.Containers.VectorizedProductIterator{Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}}})
    @ Base .\abstractarray.jl:3291
  [9] container
    @ C:\Users\Gosha\.julia\packages\JuMP\OUdu2\src\Containers\container.jl:85 [inlined]
 [10] container
    @ C:\Users\Gosha\.julia\packages\JuMP\OUdu2\src\Containers\container.jl:71 [inlined]
 [11] container(f::Function, indices::JuMP.Containers.VectorizedProductIterator{Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}}}, #unused#::Type{JuMP.Containers.AutoContainerType}, names::Vector{Any})
    @ JuMP.Containers C:\Users\Gosha\.julia\packages\JuMP\OUdu2\src\Containers\container.jl:75
 [12] macro expansion
    @ C:\Users\Gosha\.julia\packages\JuMP\OUdu2\src\macros.jl:1211 [inlined]
 [13] top-level scope

用户曾尝试在求和内部乘以标量,脚本可运行但不符合需求,需找到正确写法。

解决方法

错误原因

原始代码括号位置错误:sum(H[k]*pCap[k])/Sb for k in 1:nGen if k != i 中,sum仅包裹了H[k]*pCap[k],后续的/Sb和循环条件被当作**生成器(Generator)**定义,导致Delta_f试图直接乘一个Generator对象,而Julia未定义浮点数与Generator的乘法方法,因此抛出MethodError。

修正代码

需将整个循环求和的结果再除以Sb,提供两种符合语法的写法:

方式1:求和结果整体除以Sb(匹配需求的写法)

@constraint(planing, cons_freq[i=1:nGen, j=1:nBloques],
pg[i,j] <=  Delta_f * (sum(H[k]*pCap[k] for k in 1:nGen if k != i) / Sb))

这里sum包裹了整个循环表达式,先完成求和,再将结果除以Sb,最后与Delta_f相乘,完全符合业务逻辑。

方式2:将/Sb提取到求和外部(数学等价,更高效)

由于Sb是标量,数学上等价于将1/Sb提前计算,写法如下:

@constraint(planing, cons_freq[i=1:nGen, j=1:nBloques],
pg[i,j] <=  (Delta_f / Sb) * sum(H[k]*pCap[k] for k in 1:nGen if k != i))

这种写法避免了循环内重复做除法运算,执行效率更高,若数学逻辑符合需求可优先选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 03:17:28