# No result from nlsolve

Below is a MWE of a problem I am working with. First, a function is defined with a system of 4 equations. Second, matrices are initialized. Third, I try to solve the system using `nlsolve`. After running this MWE, the code stops without error, but nothing is saved in `results`? Any clue where it might be going wrong? Thanks in advance.

``````function sys_tHE_AB!(F, Z_AB, k_e, fe, Fe) # k_e: (1000, 10, 11)  fe: (11, 11)  Fe:  (11, 11)
ρ = 0.05 # rate of time preference
δ = 0.05 # exogenous death rate (here also endogenous exit)
β = sqrt(2*(ρ + δ))+5
α = -sqrt(2*(ρ + δ))
disc = ρ + δ
F =   Z_AB*max(Z_AB,0)^α +        k_e*Z_AB/disc - fe/disc - Fe - Z_AB*max(Z_AB,0)^β
F =   Z_AB*max(Z_AB,0)^α +        k_e*Z_AB/disc - fe/disc      - Z_AB*max(Z_AB,0)^β
F = α*Z_AB*max(Z_AB,0)^(α-1) +    k_e/disc    - β*Z_AB*max(Z_AB,0)^(β-1)
F = α*Z_AB*max(Z_AB,0)^(α-1) +    k_e/disc    - β*Z_AB*max(Z_AB,0)^(β-1)
N = [F F F F]
end

n=20
N=10
k_e=zeros(n,N,N+1) # 20 x 10 x 11
fe=rand(11,11) # 11 x 11
Fe=rand(11,11) # 11 x 11
Z_HE_0=1*rand(20,10,11) # 20 x 10 x 11
Z_EH_0=2*rand(20,10,11) # 20 x 10 x 11
Bo_0=3*rand(20,10,11) # 20 x 10 x 11
init_HE=rand(20,10,11,4) # 20 x 10 x 11 x4

for i in 1:20
for j in 2:10
for k in 3:11
init_HE[i,j,k,:] = [Z_HE_0[i,j,k] Z_EH_0[i,j,k] 0 Bo_0[i,j,k]] # 1 x 4 vector
result = nlsolve((F, Z_AB) -> sys_tHE_AB!, init_HE[i,j,k,:], method = :trust_region, xtol=10e-5, ftol=10e-8, iterations=10, store_trace=true)
end
end
end
``````

There is no variable called `results` in your code. You have a variable called `result` in your loop, but that is local to the loop. Make sure you define this before you enter the loop, and then either `push!` into it or preallocate the right length (and type) structure in the first place.

The simplest change would be:

``````result = []
for i in 1:2
for j in 2:3
for k in 3:4
init_HE[i,j,k,:] = [Z_HE_0[i,j,k] Z_EH_0[i,j,k] 0 Bo_0[i,j,k]] # 1 x 4 vector
push!(result, nlsolve((F, Z_AB) -> sys_tHE_AB!, init_HE[i,j,k,:], method = :trust_region, xtol=10e-5, ftol=10e-8, iterations=10, store_trace=true))
end
end
end
``````

which gives

``````julia> result
8-element Vector{Any}:
Results of Nonlinear Solver Algorithm
...
``````

This isn’t ideal for performance as `result` is untyped and `push!`ing into it can be slow, although it might be a negligible loss in performance relative to the cost of the solve.

1 Like

Thank you so much @nilshg!! That is extremely helpful!!

1 Like