Я новичок в языке JULIA, и я пытаюсь выполнить глобальную оптимизацию с ограничениями, минимизируя целевую функцию RMSE путем оптимизации P1 и P2. Я попытался запустить алгоритм JumP, но получил много ошибок. Я буду очень признателен, если вы предложите мне пакет, который работает, или помогите мне исправить мою ошибку?
using CSV
using JuMP, Ipopt
using Optim
using JuMP
using GLPKMathProgInterface
function READING()
cd("\\\\RichardHadlee\\user1\\GalvezJ\\Documents\\JULIAPRO")
table1 = CSV.read("table3.6.csv")
Datas = Array(table1[1])
Ydata = Array(table1[2])
println( Datas, Ydata)
return Datas, Ydata
end
function RMSE(Datas, P1,P2)
ParticleSize(Datas, P1,P2) = (1.+(P1./Datas).^P2).^(-(1.-2./P2))
RMSE(P1,P2) = sum(((ParticleSize(Datas, P1,P2) - Ydata)).^2.)
result = RMSE3(P1,P2)
return result
end
function FITTING2()
Datas, Ydata = READING()
println("read")
myModel = Model(solver=GLPKSolverLP())
@variable(myModel, P2 <= 1)
@variable(myModel, 2 <= P1)
JuMP.register(myModel, :RMSE, 2, RMSE, autodiff=true)
@NLobjective(myModel, Min, RMSE(Datas, P1, P2))
solve(myModel) # solves the model
println("End")
end
FITTING2()
СООБЩЕНИЕ ОБ ОШИБКЕ в консоли
LoadError: MethodError: no method matching getname(::Int64
Я внес некоторые изменения, как указано, но все еще не работает. Я копирую его ниже на случай, если кто-нибудь может помочь. Любой альтернативный метод такой оптимизации будет более чем приветствоваться. Большое спасибо!
function READING()
cd("\\\\RichardHadlee\\user1\\GalvezJ\\Documents\\JULIAPRO")
table1 = CSV.read("table3.6.csv")
Datum = Array(table1[1])
Ydata = Array(table1[2])
global Datum, Ydata
return Datum, Ydata
end
function RMSE_Error(P1,P2)
global Datum, Ydata
RMSE_Sum = 0.0
Len_Datum = length(Datum)
for i in 1:Len_Datum
println(i," " ,Datum[i])
ParticleSize(Datum,P1,P2) = (1.0+(P1/Datum[i])^P2)^(2/P2-1)
println("PS ", ParticleSize(Datum,P1,P2))
RMSE(P1,P2, Datum, Ydata) = (ParticleSize(Datum,P1,P2) - Ydata[i])^2.0
RMSE_Sum = RMSE_Sum + RMSE(P1,P2, Datum, Ydata)
end
println("RMSE=", RMSE_Sum)
return RMSE_Sum
end
function FITTING()
Datum, Ydata = READING()
println("read")
myModel = Model(solver=GLPKSolverLP())
@variable(myModel, P1 <= 1.)
@variable(myModel, P2 >= 2.)
JuMP.register(myModel, :RMSE_Error, 2, RMSE_Error, autodiff=true)
@NLobjective(myModel, Min, RMSE_Error( P1, P2))
solve(myModel) # solves the model
end
FITTING()
Мне удалось найти решение. Если нет лучшей альтернативы, я буду придерживаться ее. Спасибо!
using BalckBoxOptim
function sqerror(p, Datum, Ydata)
println( p[1]," " ,p[2])
err = 0.0
for i in 1:length(Datum)
pred_i = (1.0+(p[1]/Datum[i])^p[2])^(2.0/p[2]-1.0)
err += (Ydata[i] - pred_i)^2
end
println("Error: ", err)
return err
end
function Testing()
Datum, Ydata = READING()
res = bboptimize(p ->sqerror(p, Datum, Ydata); SearchRange = [(0.0001, 100.0), (2., 100.)], NumDimensions = 2, MaxSteps=5000000)
end
Testing()
JuMP.register()
нужен аргумент, чтобы отметить, сколько вводов ожидается. Вы дали 2, а ваша функция - 3. (2) Вы просите JuMP использовать GLPKSolverLP, предназначенный для линейного программирования. Это не сработает для вашей проблемы, даже если (1) будет отремонтирован (здесь кандидат ipopt).if you could suggest me a package that works
: когда я немного использовал julia, JuMP была самой мощной библиотекой для математического программирования, которую я когда-либо видел (помимо convxjl; других сценариев). JuMP работает при правильном использовании. - person sascha   schedule 12.10.2017