Я пытаюсь минимизировать энергию модели с пружинным шаром. Я пытаюсь использовать оптимизатор 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, и они работают нормально.
Буду очень признателен за любую помощь или направление. ТИА.