Как решать численные методы
Численные методы решения систем нелинейных уравнений
Введение
Многие прикладные задачи приводят к необходимости нахождения общего решения системы нелинейных уравнений. Общего аналитического решения системы нелинейных уравнений не найдено. Существуют лишь численные методы.
Следует отметить интересный факт о том, что любая система уравнений над действительными числами может быть представлена одним равносильным уравнением, если взять все уравнения в форме , возвести их в квадрат и сложить.
Для численного решения применяются итерационные методы последовательных приближений (простой итерации) и метод Ньютона в различных модификациях. Итерационные процессы естественным образом обобщаются на случай системы нелинейных уравнений вида:
(1)
Обозначим через вектор неизвестных и определим вектор-функцию
Тогда система (1) записывается в виде уравнения:
(2)
Теперь вернёмся к всеми любимому Python и отметим его первенство среди языков программирования, которые хотят изучать [1].
Этот факт является дополнительным стимулом рассмотрения числительных методов именно на Python. Однако, среди любителей Python бытует мнение, что специальные библиотечные функции, такие как scipy.optimize.root, spsolve_trianular, newton_krylov, являются самым лучшим выбором для решения задач численными методами.
С этим трудно не согласится хотя бы потому, что в том числе и разнообразие модулей подняло Python на вершину популярности. Однако, существуют случаи, когда даже при поверхностном рассмотрении использование прямых известных методов без применения специальных функций библиотеки SciPy тоже дают неплохие результаты. Иными словами, новое- это хорошо забытое старое.
Так, в публикации [2], на основании проведенных вычислительных экспериментов, доказано, что библиотечная функция newton_krylov, предназначенная для решения больших систем нелинейных уравнений, имеет в два раза меньшее быстродействие, чем алгоритм TSLS+WD
(two-step least squares), реализованный средствами библиотеки NumPy.
Целью настоящей публикации является сравнение по числу итераций, быстродействию, а главное, по результату решения модельной задачи в виде системы из ста нелинейных алгебраических уравнений при помощи библиотечной функции scipy.optimize.root и методом Ньютона, реализованного средствами библиотеки NumPy.
Возможности решателя scipy.optimize.root для численного решения систем алгебраических нелинейных уравнений
Библиотечная функция scipy.optimize.root выбрана в качестве базы сравнения, потому что имеет обширную библиотеку методов, пригодных для сравнительного анализа.
scipy.optimize.root(fun, x0, args=(), method=’hybr’, jac=None, tol=None,callback=None, ptions=None)
fun — Векторная функция для поиска корня.
x0 –Начальные условия поиска корней
Методы решения систем нелинейных уравнений
Приведенный далее материал действительно можно прочитать в литературе, например в [4], но я уважаю своего читателя и для его удобства приведу вывод метода по возможности в сокращенном виде. Те, кто не любит формулы, этот раздел пропускают.
В методе Ньютона новое приближение для решения системы уравнений (2) определяется из решения системы линейных уравнений:
(3)
Определим матрицу Якоби:
(4)
(5)
Многие одношаговые методы для приближенного решения (2) по аналогии с двухслойными итерационными методами для решения систем линейных алгебраических уравнений можно записать в виде:
(6)
где — итерационные параметры, a
— квадратная матрица n х n, имеющая обратную.
При использовании записи (6) метод Ньютона (5) соответствует выбору:
Система линейных уравнений (5) для нахождения нового приближения может решаться итерационно. В этом случае мы имеем двухступенчатый итерационный процесс с внешними и внутренними итерациями. Например, внешний итерационный процесс может осуществляться по методу Ньютона, а внутренние итерации — на основе итерационного метода Зейделя
При решении систем нелинейных уравнений можно использовать прямые аналоги стандартных итерационных методов, которые применяются для решения систем линейных уравнений. Нелинейный метод Зейделя применительно к решению (2) дает:
(7)
В этом случае каждую компоненту нового приближения из решения нелинейного уравнения, можно получить на основе метода простой итерации и метода Ньютона в различных модификациях. Тем самым снова приходим к двухступенчатому итерационному методу, в котором внешние итерации проводятся в соответствии с методом Зейделя, а внутренние — с методом Ньютона.
Основные вычислительные сложности применения метода Ньютона для приближенного решения систем нелинейных уравнений связаны с необходимостью решения линейной системы уравнений с матрицей Якоби на каждой итерации, причем от итерации к итерации эта матрица меняется. В модифицированном методе Ньютона матрица Якоби обращается только один раз:
(8)
Выбор модельной функции
Такой выбор не является простой задачей, поскольку при увеличении числа уравнений в системе в соответствии с ростом числа переменных результат решения не должен меняться, поскольку в противном случае невозможно отследить правильность решения системы уравнений при сравнении двух методов. Привожу следующее решение для модельной функции:
Функция f создаёт систему из n нелинейных уравнений, решение которой не зависит от числа уравнений и для каждой из n переменных равно единице.
Программа для тестирования на модельной функции c результатами решения системы алгебраических нелинейных уравнений с помощью библиотечной функции optimize.root для разных методов отыскания корней
Только один из методов, приведенных в документации [3] прошёл тестирование по результату решения модельной функции, это метод ‘krylov’.
Solution:
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1.]
Krylov method iteration = 4219
Optimize root time 7.239 seconds:
Вывод: С увеличением числа уравнений вдвое заметно появление ошибок в решении. При дальнейшем увеличении n решение становится не приемлемым, что возможно из-за автоматической адаптации к шагу, эта же причина резкого падения быстродействия. Но это только моё предположение.
Программа для тестирования на модельной функции c результатами решения системы алгебраических нелинейных уравнений с помощью программы написанной на Python 3 с учётом соотношений (1)-(8) для отыскания корней по модифицированному методу Ньютона
Solution:
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1.]
Newton iteration = 13
Newton method time 0.496 seconds
Solution:
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1. 1. 1.]
Newton iteration = 14
Newton method time 1.869 seconds
Чтобы убедиться в том, что программа действительно решает систему, перепишем модельную функцию для ухода от корня со значением 1 в виде:
Вывод: Программа работает и при изменении модельной функции.
Теперь вернёмся к начальной модельной функции и проверим более широкий диапазон для n, например в 2 и 500.
n=2
Solution:
[1. 1.]
Newton iteration = 6
Newton method time 0.048 seconds
n=500
Численные методы решения СЛАУ
Постановка задачи
Прикладные задачи, характерные для проектирования современных объектов новой техники, часто сводятся к многомерным в общем случае нелинейным уравнениям, которые решаются методом линеаризации, т.е. сведением нелинейных уравнений к линейным. В общем случае система [math]n[/math] уравнений с [math]n[/math] неизвестными записывается в виде
где [math]A=(a_
i,\,j[/math] — переменные, соответствующие номерам строк и столбцов (целые числа); [math]b=(b_1,\ldots,b_n)^T\in \mathbb
1. Из линейной алгебры известно, что решение задачи (1.2) существует и единственно, если детерминант матрицы [math]A[/math] отличен от нуля, т.е. [math]\det A \equiv |A|\ne0[/math] ( [math]A[/math] — невырожденная матрица, называемая также неособенной).
3. Задача (1.2) имеет следующие особенности:
б) количество уравнений равно количеству неизвестных (система замкнута);
в) количество уравнений для некоторых практических задач велико: k\cdot10^3
г) при больших [math]n[/math] использовать формулу [math]x=A^<-1>b[/math] не рекомендуется в силу трудностей нахождения обратной матрицы.
Число обусловленности
В численном анализе используются два класса численных методов решения систем линейных алгебраических уравнений:
Численные схемы реализации метода Гаусса
Рассмотрим частный случай решения СЛАУ — задачу нахождения решения системы линейных алгебраических уравнений
Согласно изложенному ранее, метод Гаусса содержит две совокупности операций, которые условно названы прямым ходом и обратным ходом.
Заметим, что в отличие от общего подхода здесь не требуется приводить расширенную матрицу к упрощенному виду. Считается, что для реализации эффективных численных процедур достаточно свести проблему к решению системы с треугольной матрицей коэффициентов.
Алгоритм численного метода Гаусса
б) Выбрать ведущий элемент одним из двух способов.
в) каждый элемент строки, в которой находится ведущий элемент, поделить на него:
г) элементы строк, находящихся ниже строки с ведущим элементом, подсчитать по правилу прямоугольника, схематически показанного на рис. 10.1 (исключить элементы, стоящие ниже ведущего элемента).
1. Схема единственного деления имеет ограничение, связанное с тем, что ведущие элементы должны быть отличны от нуля. Одновременно желательно, чтобы они не были малыми по модулю, поскольку тогда погрешности при соответствующем делении будут большими. С этой точки зрения схема с выбором ведущего элемента является более предпочтительной.
2. По окончании прямого хода может быть вычислен определитель матрицы [math]A[/math] путем перемножения ведущих элементов.
При [math]b_1=11[/math] система имеет единственное решение [math]x_1=1,
Таким образом, решение плохо обусловленной системы может существенно изменяться даже при малых изменениях исходных данных.
Пример 10.4. Решить систему линейных алгебраических уравнений методом Гаусса (схема единственного деления)
1. Прямой ход. Запишем расширенную матрицу и реализуем прямой ход с помощью описанных преобразований:
Решая эту систему, начиная с последнего уравнения, находим: [math]x_3=3,
Пример 10.5. Методом Гаусса с выбором ведущего элемента по столбцам решить систему:
1. Прямой ход. Реализуем поиск ведущего элемента по правилу: на k-м шаге переставляются [math](n-k+1)[/math] оставшихся уравнений так, чтобы наибольший по модулю коэффициент при [math]x_k[/math] попал на главную диагональ:
Согласно пункту 2 замечаний 10.2 определитель матрицы системы равен произведению ведущих элементов:
Решая ее, последовательно получаем: [math]x_3=1,
Пример 10.6. Решить систему уравнений методом Гаусса единственного деления
Метод прогонки для решения СЛАУ
Метод применяется в случае, когда матрица [math]A[/math] — трехдиагональная. Сформулируем общую постановку задачи.
которому соответствует расширенная матрица
Здесь первое и последнее уравнения, содержащие по два слагаемых, знак минус (–) при коэффициенте [math]\beta_i[/math] взят для более удобного представления расчетных формул метода.
Если к (10.2) применить алгоритм прямого хода метода Гаусса, то вместо исходной расширенной матрицы получится трапециевидная:
Учитывая, что последний столбец в этой матрице соответствует правой части, и переходя к системе, включающей неизвестные, получаем рекуррентную формулу:
Приводя эту формулу к виду (10.3) и сравнивая, получаем рекуррентные соотношения для [math]P_i,\,Q_i\colon[/math]
Определение прогоночных коэффициентов по формулам (10.4) соответствует прямому ходу метода прогонки.
Тогда определяется [math]x_n:[/math]
Остальные значения неизвестных находятся по рекуррентной формуле (10.3).
Алгоритм решения систем уравнений методом прогонки
Q_1=-\frac<\delta_1><\beta_1>[/math] (в (10.4) подставить [math]\alpha_1=0[/math] ).
2. Вычислить прогоночные коэффициенты: [math]P_2,Q_2;\,P_3,Q_3;\,\ldots;\,P_
2. Значения [math]x_
1. Аналогичный подход используется для решения систем линейных алгебраических уравнений с пятидиагональными матрицами.
2. Алгоритм метода прогонки называется корректным, если для всех [math]i=1,\ldots,n,
Пример 10.7. Дана система линейных алгебраических уравнений с трехдиагональной матрицей [math]A
1. Прямой ход. Вычислим прогоночные коэффициенты:
Подчеркнем, что [math]\beta_1=-5;
Подстановкой решения [math]x_<\ast>=\begin
Для наглядности представления информации исходные данные и результаты расчетов поместим в табл. 10.1, где в первых четырех колонках содержатся исходные данные, а в последних трех — полученные результаты.
Результаты расчетов в прямом и обратном ходе занесены в табл. 10.2.
Пример 10.9. Решить методом прогонки систему уравнений
1. Прямой ход. Вычислим прогоночные коэффициенты:
Метод LU-разложения для решения СЛАУ
Рассмотрим ещё один метод решения задачи (10.1). Метод опирается на возможность представления квадратной матрицы [math]A[/math] системы в виде произведения двух треугольных матриц:
где [math]L[/math] — нижняя, a [math]U[/math] — верхняя треугольные матрицы,
С учётом (10.7) система [math]Ax=b[/math] представляется в форме
Решение системы (10.8) сводится к последовательному решению двух простых систем с треугольными матрицами. В итоге процедура решения состоит из двух этапов.
В силу треугольности матриц [math]L[/math] и [math]U[/math] решения обеих систем находятся рекуррентно (как в обратном ходе метода Гаусса).
Результат представления матрицы [math]A[/math] в виде произведения двух треугольных матриц (операции факторизации) удобно хранить в одной матрице следующей структуры:
Вычисления на k-м шаге метода LU-разложения удобно производить, пользуясь двумя схемами, изображенными на рис. 10.2.
можно представить в виде LU-разложения, причем это разложение будет единственным. Это условие выполняется для матриц с преобладанием диагональных элементов, у которых
2. В результате прямого хода может быть вычислен определитель матрицы [math]A[/math] по свойствам определителя произведения матриц (теорема 2.2) и определителя треугольных матриц:
Алгоритм метода LU-разложение
Пример 10.10. Решить систему линейных алгебраических уравнений методом LU-разложения
1. Выполним операцию факторизации:
В результате получены две треугольные матрицы:
2. Решим систему [math]L\cdot y=b[/math] :
3. Решим систему [math]U\cdot x=y:[/math]
Пример 10.11. Решить систему линейных алгебраических уравнений методом LU-разложения.
1. Выполним операцию факторизации:
2. Решим систему линейных уравнений [math]L\cdot y=b[/math] :
3. Решим систему [math]U\cdot x=y[/math] :
\begin
Пример 10.12. Решить систему линейных алгебраических уравнений методом LU-разложения
1. Выполним процедуру факторизации:
В результате получаем матрицы LU-разложения:
2. Решим систему уравнений [math]L\cdot y=b:[/math]
\begin
3. Решим систему уравнений [math]U\cdot x=y:[/math]
Метод квадратных корней для решения СЛАУ
При решении систем линейных алгебраических уравнений с симметрическими матрицами можно сократить объем вычислений почти вдвое.
Система имеет следующий вид:
Из первой строки системы находим
Из второй строки определяем
Таким образом, элементы матрицы [math]U[/math] находятся из соотношений
Алгоритм метода квадратных корней
Найти решение системы уравнений методом квадратных корней
при [math]i=1[/math] получаем [math]u_<11>= \sqrt
при [math]i=2[/math] имеем
Таким образом, получили
2. Решим систему [math]U^T\cdot y=b[/math] :
3. Решим систему [math]U\cdot x=y[/math] :
В результате получили решение исходной системы [math]x_1=1,
Метод простых итераций для решения СЛАУ
Реализация простейшего итерационного метода — метода простых итераций — состоит в выполнении следующих процедур.
1. Исходная задача [math]A\cdot x=b[/math] преобразуется к равносильному виду:
2. Столбец [math]\beta[/math] принимается в качестве начального приближения [math]x^<(0)>= \beta[/math] и далее многократно выполняются действия по уточнению решения, согласно рекуррентному соотношению
или в развернутом виде
3. Итерации прерываются при выполнении условия (где 0″>[math]\varepsilon>0[/math] — заданная точность, которую необходимо достигнуть при решении задачи)
2. Начальное приближение [math]x^<(0)>[/math] может выбираться произвольно или из некоторых соображений. При этом может использоваться априорная информация о решении или просто «грубая» прикидка. При выполнении итераций (любых) возникают следующие вопросы:
б) если сходимость есть, то какова ее скорость?
Ответ на вопросы о сходимости дают следующие две теоремы.
2. Сходящийся процесс обладает свойством «самоисправляемости», т.е. отдельная ошибка в вычислениях не отразится на окончательном результате, так как ошибочное приближение можно рассматривать, как новое начальное.
3. Условия сходимости выполняются, если в матрице [math]A[/math] диагональные элементы преобладают, т.е.
и хотя бы для одного [math]i[/math] неравенство строгое. Другими словами, модули диагональных коэффициентов в каждом уравнении системы больше суммы модулей недиагональных коэффициентов (свободные члены не рассматриваются).
Замечание 10.7. Хотя теорема 10.2 дает более общие условия сходимости метода простых итераций, чем теорема 10.1, однако ею воспользоваться сложнее, так как нужно предварительно вычислить границы собственных значений матрицы [math]\alpha[/math] или сами собственные значения.
Выражая [math]x_1[/math] из первого уравнения, [math]x_2[/math] — из второго, а [math]x_3[/math] — из третьего, получаем систему вида [math]x=\alpha x+\beta:[/math]
Проиллюстрируем применение других элементарных преобразований. Так, система [math]\begin
2. Уравнения преобразуются так, чтобы выполнялось условие преобладания диагональных элементов, но при этом коэффициенты [math]\alpha_
i,j=1,\ldots,n[/math] достаточно малы, условие сходимости выполняется.
Алгоритм метода простых итераций
1. Преобразовать систему [math]Ax=b[/math] к виду [math]x=\alpha x+\beta[/math] одним из описанных способов.
Методом простых итераций с точностью [math]\varepsilon=0,\!01[/math] решить систему линейных алгебраических уравнений:
3. Выполним расчеты по формуле (10.12):
до выполнения условия окончания и результаты занесем в табл. 10.4.
Приведем результаты расчетов для другого начального приближения [math]x^<(0)>=\begin
Метод Зейделя для решения СЛАУ
Этот метод является модификацией метода простых итераций и в некоторых случаях приводит к более быстрой сходимости.
В каждое последующее уравнение подставляются значения неизвестных, полученных из предыдущих уравнений.
Записывая (10.15) в матричной форме, получаем
где [math]L,\,U[/math] являются разложениями матрицы [math]\alpha:[/math]
Тогда достаточное, а также необходимое и достаточное условия сходимости будут соответственно такими (см. теоремы 10.1 и 10.2):
1. Для обеспечения сходимости метода Зейделя требуется преобразовать систему [math]Ax=b[/math] к виду [math]x=\alpha x+\beta[/math] с преобладанием диагональных элементов в матрице а (см. метод простых итераций).
3. При расчетах на ЭВМ удобнее пользоваться формулой (10.16).
4. Преимуществом метода Зейделя, как и метода простых итераций, является его «самоисправляемость».
5. Метод Зейделя имеет преимущества перед методом простых итераций, так как он всегда сходится для нормальных систем линейных алгебраических уравнений, т.е. таких систем, в которых матрица [math]A[/math] является симметрической и положительно определенной. Систему линейных алгебраических уравнений с невырожденной матрицей [math]A[/math] всегда можно преобразовать к нормальной, если ее умножить слева на матрицу [math]A^T[/math] (матрица [math]A^TA[/math] — симметрическая). Система [math]A^TAx= A^Tb[/math] является нормальной.
Алгоритм метода Зейделя
1. Преобразовать систему [math]Ax=b[/math] к виду [math]x=\alpha x+\beta[/math] одним из описанных способов.
Пример 10.15. Методом Зейделя с точностью [math]\varepsilon=0,\!001[/math] решить систему линейных алгебраических уравнений:
1. Приведем систему [math]Ax=b[/math] к виду [math]x=\alpha x+\beta[/math] (см. пример 10.14):
Выполним расчеты по формуле (10.15): [math]\begin
Очевидно, найденное решение [math]x_<\ast>= \begin
Пример 10.16. Методом Зейделя с точностью [math]\varepsilon=0,\!005[/math] решить систему линейных алгебраических уравнений:
k=0,1,\ldots[/math] и результаты занесем в табл. 10.7.
Очевидно, найденное решение [math]x_<\ast>= \begin