Юлия ЮМП оптимизатор Ipopt MethodError - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь минимизировать энергию модели с пружинным шаром. Я пытаюсь использовать оптимизатор Ipopt, чтобы минимизировать энергию. Однако я получаю сообщение об ошибке:

MethodError: no method matching Float64(::ForwardDiff.Dual{ForwardDiff.Tag{getfield(JuMP, Symbol("##85#87")){typeof(ObjFn)},Float64},Float64,12})
Closest candidates are:
  Float64(::Real, !Matched::RoundingMode) where T<:AbstractFloat at rounding.jl:194
  Float64(::T<:Number) where T<:Number at boot.jl:718
  Float64(!Matched::Int8) at float.jl:60

Код, который я написал:

nVertices = length(x);
EnMinM = Model(with_optimizer(Ipopt.Optimizer));
@variable(EnMinM, DesignVar[1 : 3*nVertices]);

for i = 1 : nVertices #Initial Values of Design Variables
    set_start_value(DesignVar[i], x[i]);
end
for i = (nVertices + 1) : 2*nVertices
    set_start_value(DesignVar[i], y[i - nVertices]);
end
for i = (2*nVertices + 1) : 3*nVertices
    set_start_value(DesignVar[i], z[i - 2*nVertices]);
end

#Support conditions
for i in supportx
    fix(DesignVar[i], x[i]; force = true);
end
for i in supporty
    fix(DesignVar[i+nVertices], y[i]; force = true);
end
for i in supportz
    fix(DesignVar[2*nVertices], z[i]; force = true);
end


ObjFn(DesignVar...) = LatEnergy(S_vec, DesignVar);
register(EnMinM, :ObjFn, 3*nVertices, ObjFn, autodiff=true)
@NLobjective(EnMinM, Min, ObjFn(DesignVar...))

optimize!(EnMinM)

Здесь DesignVar объединяет векторы координат x, y и z. Я проверил LatEnergy и ObjFn, и они работают нормально.

Буду очень признателен за любую помощь или направление. ТИА.

...