I have an objective function that solves for a vector
z using an iterative algorithm. I then feed this into
optimize(). I can use a “static” starting guess
z0 that I set before calling
optimize. However, it might be faster to use the actual
z obtained the last time
optimize called the objective function. The idea is that often
optimize is calculating numerical gradients so the new
z will be very close.
I can probably achieve this using a global for
z0, but I was wondering
(A) whether this can be achieved more cleanly, and
(B) if there are reasons to not do this altogether.
For this application, I can prove that
z is unique (and hence the starting condition does not matter except for speed).
Here is a MWE (note, in the real application, I cannot solve
z analytically as is the case here, so I do need to iterate)
function mylossfn(delta, xgrid, z0, z_data) z = z0 error = 1.0 # solve Bellman equation by iteration # (in the real application there is no closed form soln) while error > 1e-8 z_next = (xgrid .^ 2) .+ delta .* z error = sum( (z .- z_next).^2 ) end # loss function return sum( (z .- z_data).^2 ) end xgrid = 1:100 myz0 = zeros(100) # read my_z_data from a data file delta0 = 0.5 optimize((x -> mylossfn(x, myz0, my_z_data)), delta0, BFGS())