I am trying to optimize a function that has several contributions. So I need to add several terms to it, but when I pass that function to nlsolve I am getting strange results. I have reproduced a minimal example that reproduces the problem.
using SparseArrays
using NLsolve
bins = Int(4)
function f!(f0,x)
f0=0*x
for i in 1:bins
f0[i] = f0[i] + x[i]*x[i] - 1
end
end
function j!(j0,x)
for i in 1:bins
j0[i,i] = 2.0*x[i]
end
end
x0 = 0.5*ones(bins)
f0 = zeros(Float64,bins)
f!(f0,x0)
j0 = spzeros(bins, bins)
j!(j0,x0)
df = OnceDifferentiable(f!, j!, x0, f0, j0)
sol = nlsolve(df, x0,method=:newton)
println(sol)
If I run this code I get the answer [0.5,0.5,0.5,0.5], which is obviously wrong. But if I change the function f! to
function f!(f0,x)
for i in 1:bins
f0[i] = x[i]*x[i] - 1
end
end
then I get the correct result. If I want to optimize a function that has several components it is easier to initialize f0 to zero and add components to it. But that does not work with NLsolve. Is there a way to initialize f0 to zero and add various components to it? Also, this behavior is quite nonintuitive. Functions should not behave this way depending on the sequence of mutation.