Julia+JuMP:函数参数数量可变

2024-01-23

我正在尝试使用 JuMP 来解决非线性问题,其中变量的数量由用户决定 - 也就是说,在编译时未知。

为了实现这一目标,@NLobjective线路看起来像这样:

@eval @JuMP.NLobjective(m, Min, $(Expr(:call, :myf, [Expr(:ref, :x, i) for i=1:n]...)))

例如,如果n=3,编译器将该行解释为与:

@JuMP.NLobjective(m, Min, myf(x[1], x[2], x[3]))

问题是@eval仅适用于全局范围,并且当包含在函数中时,会引发错误。

我的问题是:我怎样才能完成同样的功能——得到@NLobjective打电话myf具有可变数量的x[1],...,x[n]参数——在函数的本地、编译时未知的范围内?

def testme(n)
    myf(a...) = sum(collect(a).^2)

    m = JuMP.Model(solver=Ipopt.IpoptSolver())

    JuMP.register(m, :myf, n, myf, autodiff=true)
    @JuMP.variable(m, x[1:n] >= 0.5)

    @eval @JuMP.NLobjective(m, Min, $(Expr(:call, :myf, [Expr(:ref, :x, i) for i=1:n]...)))
    JuMP.solve(m)
end

testme(3)

Thanks!


正如中所解释的http://jump.readthedocs.io/en/latest/nlp.html#raw-expression-input http://jump.readthedocs.io/en/latest/nlp.html#raw-expression-input,目标函数可以在没有宏的情况下给出。相关表述:

    JuMP.setNLobjective(m, :Min, Expr(:call, :myf, [x[i] for i=1:n]...))

甚至比@eval基于 1 并在该函数中工作。代码是:

using JuMP, Ipopt

function testme(n)
    myf(a...) = sum(collect(a).^2)

    m = JuMP.Model(solver=Ipopt.IpoptSolver())

    JuMP.register(m, :myf, n, myf, autodiff=true)
    @JuMP.variable(m, x[1:n] >= 0.5)

    JuMP.setNLobjective(m, :Min, Expr(:call, :myf, [x[i] for i=1:n]...))
    JuMP.solve(m)
    return [getvalue(x[i]) for i=1:n]
end

testme(3)

它返回:

julia> testme(3)

:

 EXIT: Optimal Solution Found.
3-element Array{Float64,1}:
 0.5
 0.5
 0.5
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Julia+JuMP:函数参数数量可变 的相关文章

  • 有没有办法重置 Julia 中的当前工作目录?

    假设当前工作目录是C 保存 jl文件的目录 然后我将cwd切换到一些子文件夹来执行一些任务 有没有办法直接将cwd重置回C 之后 即最初的cwd 或者 是否可以独立于当前工作目录来定位正在运行的 jl 文件所在的目录 无需事先将 cwd 保
  • 类型稳定性如何让 Julia 如此之快?

    我听说类型稳定性使 Julia 如此之快 同时仍然与其他解释语言 例如 Python 一样具有表达能力 类型稳定性允许编译器在编译时直接根据输入类型确定函数的输出类型 因为 Julia 专门针对每种输入类型进行编译 这意味着如果所有函数都是
  • 从 Julia 程序执行 >> shell 运算符

    我试图使用反引号从 Julia 内部附加一个文件 run cat file2 gt gt file1 但这行不通 似乎 gt gt 运算符无法正确解释 有没有办法通过管道或其他技巧来做到这一点 如果您尝试以编程方式执行此操作 则主要问题正文
  • 如何创建并推送到共享或分布式数组数组?

    我编写了 Julia 代码 其中初始化一个空数组 如下所示 a 稍后在代码中 我简单地推送到该数组 如下所示 推 a b 其中 b c d e 是另一个数组 每个 b 可以具有不同的长度 这在非并行化代码中工作得很好 但是 我想在并行代码中
  • 如何更改julia(1.8.5)默认安装包的位置?

    如何更改julia 1 8 5 默认安装包的位置 我不想把包安装到c盘 因为pwd 和homedir 都默认到c盘 如何修改 我想每次都像安装python包一样打开Julia 有固定的安装路径 例如user Base User site 我
  • 朱莉娅中未显示情节

    我有一个名为 mycode jl 的文件 其中包含以下代码here https juliastats org MultivariateStats jl dev pca using MultivariateStats RDatasets Pl
  • Julia 中过时的软件包列表

    有没有办法列出 Julia 中所有过时的软件包 相当于pip3 list outdated在Python中 我做了几次搜索 1 https docs julialang org en v1 stdlib Pkg 2 https pkgdoc
  • 如何在 Julia 中创建一个数组?

    在许多机器学习用例中 您需要创建一个充满 1 且具有特定维度的数组 在Python中 我会使用np ones 2 1 Julia 中的模拟版本是什么 朱莉娅有一个内置的ones可以使用如下函数 julia gt ones 1 2 1 2 M
  • 如何在一张图中显示多个相邻的图像?

    我正在使用 Julia PyPlot 和 Images 来处理一些图片 因为显示几十个图是不可能的 所以我想堆叠图像 如下所示 我有图像数据Array Array Float64 2 1 已经正常化了 以下代码仅显示最后一个最小的图像 该数
  • 用以前的非缺失值填充“缺失”值的有效方法是什么?

    我有一个向量 using Missings v allowmissing rand 100 v rand 100 lt 0 1 missing 最好的填充方式是什么v与最后一个非缺失值 现在 for i val in enumerate v
  • 如何在 Julia `DataFrame` 中折叠具有重复时间戳的数据

    我有一个DataFrame对象如下所示 Row timestamp price volume 1 2011 08 14T14 14 40 10 40 0 779 2 2011 08 14T15 15 17 10 40 0 101 3 201
  • 为什么 Julia 中的“where”语法对换行符敏感?

    在 Stack Overflow 上的另一个问题中 答案包括以下函数 julia gt function nzcols b SubArray T 2 P Tuple UnitRange Int64 UnitRange Int64 where
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • Julia Threads.@threads 比单线程性能慢

    我正在尝试求解一维热方程的数值 我正在使用有限差分 并且在 Julia 中使用 threads 指令时遇到一些问题 特别是下面有相同代码的两个版本 第一个是单线程 而另一个使用 threads 除了 thread指令之外 它们是相同的 fu
  • Julia 中的 Refs 和 Broadcasting 之间有什么联系

    对于两个对象A and B我们之前可以得到向量 A A A B 与代码A A B 从 Julia 0 7 中的弃用警告来看 执行此操作的新方法似乎是使用第一个 A 的引用 所以它变成Ref A A B 参考文献和广播操作之间似乎没有很强的联
  • 如何将缺失值插入到 Julia 的数据框中

    df3 10 A missing df3 15 B missing df3 15 C missing 即使 NA 也不起作用 我收到错误 方法错误 不能convertMissings Missing 类型的对象到 Int64 类型的对象 这
  • 将全局标题添加到 Plots.jl 子图

    我想使用 Plots jl 向一组子图添加全局标题 理想情况下 我会做类似的事情 using Plots pyplot plot rand 10 2 plot title Main title title A B layout 2 但是 根
  • Julia 中使用微分方程的二阶 ODE

    我正在尝试使用 Julia 中的微分方程求解谐振子 IE using DifferentialEquations using Plots m 1 0 1 0 function mass system ddu du u p t a t 1 m
  • 从 python 文件调用 Julia 函数

    我能够创建一个 docker 环境 然后按照这个线程我有一个用 Julia 编写的高性能函数 如何从 Python 中使用它 https stackoverflow com questions 64241264 i have a high
  • 在向量的参数向量上调度时出现 MethodError

    我编写了一个函数 该函数在向量的向量上进行分派Integers 但是 当我尝试使用它时 出现 MethodError julia gt foo x Vector Vector lt Integer last last x julia gt

随机推荐