Решение систем нелинейных уравнений¶
В этом примере продемонстрировано, как решать системы нелинейных уравнений с использованием проблемно-ориентированного подхода.
Установка библиотек¶
Если в вашем окружении не установлена последняя версия пакета JuMP
, раскомментируйте и запустите ячейку ниже:
#Pkg.add("JuMP");
Для запуска новой версии библиотеки после завершения установки нажмите на кнопку «Личный кабинет»:
Затем нажмите на кнопку «Стоп»:
Перезапустите сессию нажатием кнопки «Старт Engee»:
Описание задачи¶
Найдем решения $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
:
using JuMP;
Подключите библиотеку нелинейного решателя Ipopt
:
using Ipopt;
Создание задачи оптимизации¶
Создайте оптимизационную задачу с помощью функции Model()
и укажите название решателя в скобках:
sys_prob = Model(Ipopt.Optimizer)
Создайте переменную x
, содержащую два значения – $x_1$ и $x_2$:
@variable(sys_prob, x[1:2]);
Задайте первое нелинейное условие с помощью макроса @NLconstraint
:
@NLconstraint(sys_prob, exp(-exp(-(x[1] + x[2]))) == x[2] * (1 + x[1]^2))
Задайте второе нелинейное условие с помощью макроса @NLconstraint
:
@NLconstraint(sys_prob, x[1] * cos(x[2]) + x[2] * sin(x[1]) == 1/2)
Установка начальных значений для оптимизационных переменных может помочь более эффективно управлять процессом оптимизации. Решите задачу, начиная с точки [0,0]
. Для этого используйте функцию set_start_value()
и задайте начальные значения для $x_1$
и $x_2$
:
set_start_value(x[1], 0.0);
set_start_value(x[2], 0.0);
Решение задачи оптимизации¶
Решите оптимизационную задачу:
optimize!(sys_prob)
Сохраните значения x
в переменной:
sol_x = value.(x);
Выведите результаты оптимизации:
println("Solution: x = ", sol_x)
Найденные нами решения для системы нелинейных уравнений:
$$x_1 = 0.35324661959670156$$ $$x_2 = 0.6060817366414603$$
Заключение¶
В данном примере мы нашли решения для системы нелинейных уравнений, используя проблемно-ориентированный подход. Мы воспользовались библиотекой JuMP
для формулировки нашей задачи и библиотекой нелинейного решателя Ipopt
для нахождения решений к задаче.