Документация Engee
Notebook

Решение систем нелинейных уравнений

В этом примере продемонстрировано, как решать системы нелинейных уравнений с использованием проблемно-ориентированного подхода.

Мы воспользуемся функциями библиотеки JuMP.jl для формулировки оптимизационной задачи и библиотекой нелинейной оптимизации Ipopt.jl.

Установка библиотек

Если в вашем окружении не установлена последняя версия пакета JuMP, раскомментируйте и запустите ячейку ниже:

In [ ]:
#Pkg.add("JuMP");

Для запуска новой версии библиотеки после завершения установки нажмите на кнопку «Личный кабинет»:

screenshot_20240710_134852.png Затем нажмите на кнопку «Стоп»:

screenshot_20240710_2.png

Перезапустите сессию нажатием кнопки «Старт Engee»:

screenshot_20240710_135431.png

Описание задачи

Найдем решения $x_1$ и $x_2$ для системы нелинейных уравнений, представленных ниже, используя проблемно-ориентированный подход:

\begin{cases} exp(-exp(-(x_1+x_2)))=x_2(1+x_1^2) \\ \\x_1cos(x_2)+x_2sin(x_1)={\frac{{1}}{2}}\end{cases}

Подключение библиотек

Подключите библиотеку JuMP:

In [ ]:
using JuMP;

Подключите библиотеку нелинейного решателя Ipopt:

In [ ]:
using Ipopt;

Создание задачи оптимизации

Создайте оптимизационную задачу с помощью функции Model() и укажите название решателя в скобках:

In [ ]:
sys_prob = Model(Ipopt.Optimizer)
Out[0]:
A JuMP Model
Feasibility problem with:
Variables: 0
Model mode: AUTOMATIC
CachingOptimizer state: EMPTY_OPTIMIZER
Solver name: Ipopt

Создайте переменную x, содержащую два значения – $x_1$ и $x_2$:

In [ ]:
@variable(sys_prob, x[1:2]);

Задайте первое нелинейное условие с помощью макроса @NLconstraint:

In [ ]:
@NLconstraint(sys_prob, exp(-exp(-(x[1] + x[2]))) == x[2] * (1 + x[1]^2))
Out[0]:
$$ (exp(-(exp(-((x[1] + x[2]))))) - x[2] * (1.0 + x[1] ^ {2.0})) - 0.0 = 0 $$

Задайте второе нелинейное условие с помощью макроса @NLconstraint:

In [ ]:
@NLconstraint(sys_prob, x[1] * cos(x[2]) + x[2] * sin(x[1]) == 1/2)
Out[0]:
$$ ((x[1] * cos(x[2]) + x[2] * sin(x[1])) - 1.0 / 2.0) - 0.0 = 0 $$

Установка начальных значений для оптимизационных переменных может помочь более эффективно управлять процессом оптимизации. Решите задачу, начиная с точки [0,0]. Для этого используйте функцию set_start_value() и задайте начальные значения для $x_1$ и $x_2$:

In [ ]:
set_start_value(x[1], 0.0);
set_start_value(x[2], 0.0);

Решение задачи оптимизации

Решите оптимизационную задачу:

In [ ]:
optimize!(sys_prob)
This is Ipopt version 3.14.13, running with linear solver MUMPS 5.6.1.

Number of nonzeros in equality constraint Jacobian...:        4
Number of nonzeros in inequality constraint Jacobian.:        0
Number of nonzeros in Lagrangian Hessian.............:        6

Total number of variables............................:        2
                     variables with only lower bounds:        0
                variables with lower and upper bounds:        0
                     variables with only upper bounds:        0
Total number of equality constraints.................:        2
Total number of inequality constraints...............:        0
        inequality constraints with only lower bounds:        0
   inequality constraints with lower and upper bounds:        0
        inequality constraints with only upper bounds:        0

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls
   0  0.0000000e+00 5.00e-01 0.00e+00  -1.0 0.00e+00    -  0.00e+00 0.00e+00   0
   1  0.0000000e+00 3.15e-01 0.00e+00  -1.7 8.73e-01    -  1.00e+00 1.00e+00h  1
   2  0.0000000e+00 5.73e-02 0.00e+00  -1.7 1.98e-01    -  1.00e+00 1.00e+00h  1
   3  0.0000000e+00 8.66e-04 0.00e+00  -2.5 6.84e-02    -  1.00e+00 1.00e+00h  1
   4  0.0000000e+00 2.66e-07 0.00e+00  -5.7 6.23e-04    -  1.00e+00 1.00e+00h  1
   5  0.0000000e+00 2.28e-14 0.00e+00  -8.6 3.20e-07    -  1.00e+00 1.00e+00h  1

Number of Iterations....: 5

                                   (scaled)                 (unscaled)
Objective...............:   0.0000000000000000e+00    0.0000000000000000e+00
Dual infeasibility......:   0.0000000000000000e+00    0.0000000000000000e+00
Constraint violation....:   2.2759572004815709e-14    2.2759572004815709e-14
Variable bound violation:   0.0000000000000000e+00    0.0000000000000000e+00
Complementarity.........:   0.0000000000000000e+00    0.0000000000000000e+00
Overall NLP error.......:   2.2759572004815709e-14    2.2759572004815709e-14


Number of objective function evaluations             = 6
Number of objective gradient evaluations             = 6
Number of equality constraint evaluations            = 6
Number of inequality constraint evaluations          = 0
Number of equality constraint Jacobian evaluations   = 6
Number of inequality constraint Jacobian evaluations = 0
Number of Lagrangian Hessian evaluations             = 5
Total seconds in IPOPT                               = 0.003

EXIT: Optimal Solution Found.

Сохраните значения x в переменной:

In [ ]:
sol_x = value.(x);

Выведите результаты оптимизации:

In [ ]:
println("Solution: x = ", sol_x)
Solution: x = [0.35324661959670156, 0.6060817366414603]

Найденные нами решения для системы нелинейных уравнений:

$$x_1 = 0.35324661959670156$$ $$x_2 = 0.6060817366414603$$

Заключение

В данном примере мы нашли решения для системы нелинейных уравнений, используя проблемно-ориентированный подход. Мы воспользовались библиотекой JuMP для формулировки нашей задачи и библиотекой нелинейного решателя Ipopt для нахождения решений к задаче.