Solve system of non-linear equation


I am trying to find the stationary point (gradient g(x) = 0) of this func:

I am new to Julia! I understand that I should use NLsolve package to solve system of nonlinear eq. Could you please tell me how to take each element of the gradient and solve for g(x) = 0.

Here is the code so far:

f1 = (x) → −13 + x[1] +((5 − x[2])*x[2] - 2)*x[2]
f2 = (x) → −29 + x[1] +((x[2] + 1)*x[2] − 14)*x[2]
f(x) = f1(x)^2 + f2(x)^2
g = (x) → ForwardDiff.gradient(f, x);
h = (x) → ForwardDiff.hessian(f, x);

Thanks for the help!

You can solve g(x) = 0 but, really, you could simply minimize (optimize) f(x). Example using Optimization.jl:

using Optimization, ForwardDiff, OptimizationOptimJL
f1(x) = −13 + x[1] + ((5 − x[2]) * x[2] - 2) * x[2]
f2(x) = −29 + x[1] + ((x[2] + 1) * x[2] − 14) * x[2]
f(x) = f1(x)^2 + f2(x)^2
# Initial guess
x0 = [0.0, 0.0]
# Set up the objective function and problem following SciML syntax:
func = OptimizationFunction((x,p) -> f(x), Optimization.AutoForwardDiff())
prob = OptimizationProblem(func, x0, p)
# And solve with, e.g., Newton's method. More examples at
sol = solve(prob, Newton())
# And test that the gradient is good:
ForwardDiff.gradient(f, sol)


2-element Vector{Float64}:

which is very close to zero.

Visual check:

using Plots
x1s = -20:0.1:20
x2s = -5:0.1:5
contourf(x1s, x2s, [log(f([x1, x2])) for x2 in x2s, x1 in x1s])
scatter!([sol[1]], [sol[2]], marker=:x, color=:green, lab="sol")

shows that its only a local minima:



Thank you for the response and for the solution!
I am doing a course on optimization and I want to implement the steps myself using Julia without the package.

So could you please show me how to solve g(x) and get the roots?


There are many ways you can do that. Check this book with optimization algorithms written in Julia: Algorithms for Optimization.

1 Like

Thank you!
I will check it out