Julia 跳转查询解决方案不';我不能在循环中工作
我在Ipopt优化器中使用JuMP v0.20.0,我试图在一个循环中求解一个非线性方程组,其中问题陈述根据我循环的内容而变化 假设我有一个非常简单的问题,试图选取$$t\u 1、\dots,t\u n$$来最小化非线性方程$$\sum\u{I=1到n}t\u I^2$$。当我在没有循环的情况下运行它时,我有以下代码Julia 跳转查询解决方案不';我不能在循环中工作,julia,numerical-methods,nonlinear-optimization,julia-jump,Julia,Numerical Methods,Nonlinear Optimization,Julia Jump,我在Ipopt优化器中使用JuMP v0.20.0,我试图在一个循环中求解一个非线性方程组,其中问题陈述根据我循环的内容而变化 假设我有一个非常简单的问题,试图选取$$t\u 1、\dots,t\u n$$来最小化非线性方程$$\sum\u{I=1到n}t\u I^2$$。当我在没有循环的情况下运行它时,我有以下代码 using JuMP, Optim, Ipopt, NLsolve m = Model(Ipopt.Optimizer) @variable(m, t[1:N] >= 0.0
using JuMP, Optim, Ipopt, NLsolve
m = Model(Ipopt.Optimizer)
@variable(m, t[1:N] >= 0.00000001)
function solve_Aik(tlist...)
t = collect(tlist)
return sum([t[i]^2 for i in 1:N])
end
register(m, :solve_Aik, N, solve_Aik, autodiff=true)
@NLobjective(m, Min, solve_Aik(t...))
optimize!(m)
solution = [value.(t[i]) for i=1:N]
最后一行为我提供了很好的解决方案
然而,一旦我将其放入一个循环(甚至没有提供我循环到问题的数字),我就无法恢复我的解决方案,错误为“MethodError:no method matching value(::ForwardDiff.Dual{ForwardDiff.Tag{JuMP.var”#107#109{var”#solve#Aik#378},Float64},Float64,8}”。请参阅下面的代码:
nums = [1,2,3]
for num in nums
m = Model(Ipopt.Optimizer)
@variable(m, t[1:N] >= 0.00000001)
function solve_Aik(tlist...)
t = collect(tlist)
return sum([t[i]^2 for i in 1:N])
end
register(m, :solve_Aik, N, solve_Aik, autodiff=true)
@NLobjective(m, Min, solve_Aik(t...))
optimize!(m)
solution = [value.(t[i]) for i=1:N]
end
提供解决方案的最后一行是Julia挂断的内容。还有其他人遇到过类似的问题吗?蒂亚 根据错误消息,我的猜测是,由于Julia的作用域规则有点奇怪,
t=collect(tlist)
覆盖了for循环体中定义的跳转变量t
。请尝试为有效的solve\u Aik
内的变量使用其他名称,谢谢!奇怪的是,范围界定问题不会在for循环或函数之外出现,人们会认为我从一开始就遇到了它。