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 中的并行梯度计算

    不久前我被说服放弃我舒适的 matlab 编程并开始使用 Julia 编程 我已经在神经网络方面工作了很长时间 我认为现在有了 Julia 我可以通过并行计算梯度来更快地完成工作 不需要一次性对整个数据集计算梯度 相反 我们可以拆分计算 例
  • 像 R 的 is.na 函数一样在 Julia 中查找缺失值

    朱莉娅 1 0 0文档 https docs julialang org en v1 manual noteworthy differences Noteworthy differences from R 1关于 Julia 和 R 中缺失
  • 为什么我的 Julia 代码运行速度比 JavaScript 慢?

    最近 我对 Julia lang 很感兴趣 因为它声称是一种具有接近 C 性能的动态语言 然而 到目前为止我的经验并不好 至少在性能方面 我正在编写的应用程序需要随机访问特定的数组索引 然后将它们的值与其他特定的数组索引进行比较 经过多次迭
  • 有没有办法在 julia-lang 中构建包依赖关系树?

    Using npm list将显示已安装的软件包 版本和关系的树 尽管 Julia 包管理有所不同 例如 通常不存在包的重复副本 但有什么方法可以 知道为什么要安装一个软件包吗 或构建包依赖关系树 我认为没有一个简单的函数 但是使用这两个函
  • julia变量的范围:在开放表达式的循环内重新分配

    我正在努力在 Julia 的循环中重新分配变量 我有一个以下的例子 infile test txt feature for ln in 1 3 println feature feature end open infile do f if
  • 如何在命令行中执行 Julia 代码?

    我最近在 Julia 中转移了我的代码 我想知道如何在命令行中执行 Julia 代码 我知道 Julia 代码可以通过运行一次来 编译 但问题是我需要对集 群上的模拟模型进行参数扫描 我只能使用命令行 而不能使用 REPL 在集群上运行模拟
  • 有没有办法重置 Julia 中的当前工作目录?

    假设当前工作目录是C 保存 jl文件的目录 然后我将cwd切换到一些子文件夹来执行一些任务 有没有办法直接将cwd重置回C 之后 即最初的cwd 或者 是否可以独立于当前工作目录来定位正在运行的 jl 文件所在的目录 无需事先将 cwd 保
  • 我可以使用具有固定输入的“map”吗?

    假设我这样做f x y 2x ythen map f 2 4 6 1 1 1 我会得到 3 element Array Int64 1 5 9 13 If I do map f 2 4 6 1 即我想假设第二个输入始终相同 我会得到 1 e
  • 在 Julia 中迭代具有不同数量参数的不同函数

    我正在尝试使用不同数量的参数对不同的函数运行循环 变量是在运行时在循环内创建的 我想在每次迭代时使用 eval 来使用变量 symbol 实例化一个 Struct 但是 我不能这样做 因为 eval 只在全局范围内有效 这是有效案例的 MW
  • 如何让 Rosenbrock23 在 ParameterizedFunctions.jl DSL 中使用 ODE?

    进一步这个问题 https stackoverflow com questions 54422068 how to fix typeerror in setindex in differentialequations jl 54423008
  • Julia:生成唯一的随机整数数组

    我正在尝试创建 10 个唯一随机整数的元素数组 但是我无法创建具有唯一值的数组 Julia 中是否有类似 Python 的东西样本函数 https docs python org 2 library random html random s
  • 如何在 Julia 中提供可重现的样本数据

    Here on stackoverflow com 当我提供样本数据来制作可重现的示例时 我该如何以朱利安方式做到这一点 In R例如dput df 将输出一个字符串 您可以用它来创建df再次 因此 您只需将结果发布到 stackoverf
  • Julia:数组是否包含特定的子数组

    在 julia 中 我们可以检查数组是否包含值 如下所示 gt 6 in 4 6 5 true 然而 当尝试按特定顺序检查子数组时 这会返回 false gt 4 6 in 4 6 5 false 验证数组中是否存在特定子数组的正确语法是什
  • 在 Julia 中有效求解特定线性系统

    我广泛使用朱莉娅的线性方程求解器res X b 由于参数变化 我必须在程序中使用它数百万次 这工作正常 因为我使用的是小尺寸 最多30 现在我想分析更大的系统 最多1000 线性求解器不再有效 我认为可以有一个解决办法 然而我必须说 有时我
  • 离散连续概率分布

    认识到这可能是一个统计问题和编码问题 假设我使用 Distributions jl 创建了一个正态分布 using Distributions mydist Normal 0 0 2 有没有一种好的 直接的方法可以离散化这样的分布以获得 P
  • Julia 中的指针解引用(unsafe_load(ptr) 有效,但 unsafe_wrap(Array, ptr, 1) 段错误)

    我正在尝试取消引用指针unsafe load and unsafe wrap 我发现unsafe load不过效果很好unsafe wrap如果取消引用指向可变结构的指针 则会崩溃 玩具示例 mutable struct Wrapper d
  • Julia:如何让多个工作人员访问模块中的函数?

    我有以下测试模块 MyMod jl 来在 Julia 中存储一些测试函数 一些核心函数是串行编写的 其他函数并行调用核心函数 module MyMod export Dummy distribute data getfrom recombi
  • 具有单变量优化的 NLopt

    任何人都知道 NLopt 是否适用于单变量优化 尝试运行以下代码 using NLopt function myfunc x grad x 2 end opt Opt LD MMA 1 min objective opt myfunc mi
  • 从 Julia 中的文本文件读取数据矩阵

    我有一个包含矩阵的文本文件 我想在朱莉娅中将其作为矩阵来阅读 文本文件如下 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 在 matlab 中 您可以执行以下操作来创建矩阵M
  • 获取参数类型的参数

    假设我定义了一个这样的类型 type Point Tx Ty end 然后我创建一个这种类型的变量 例如 a Point Int64 something 现在 我只知道我可以获得以下类型a by typeof a 那是 Point Int6

随机推荐