![]() |
Системы линейных уравнений Ax=b можно поделить на два класса. Первый класс - это системы с квадратной невырожденной матрицей A, имеющие единственное решение. Вторым классом являются системы с прямоугольной матрицей A произвольного размера, возможно вырожденной. Эти системы обычно решаются с минимизацией квадрата невязки. Пакет ALGLIB предлагает подпрограммы для поиска решений обеих проблем.
Для решения систем с квадратной невырожденной матрицей общего вида могут быть использованы следующие подпрограммы:
Подпрограммы могут быть поделены на следующие группы:
Последнее нуждается в уточнении:
Для решения систем с симметричной/Эрмитовой положительно определенной матрицей общего вида могут быть использованы следующие подпрограммы:
Соглашения об именах те же, что и в предыдущем разделе. Однако следует отметить, что подпрограммы этого раздела не поддерживают итеративное улучшение.
Для решения систем с вещественной прямоугольной матрицей общего вида (возможно вырожденной) служит подпрограмма RMatrixSolveLS, основанная на сингулярном разложении матрицы системы. Если матрица система вырождена или близка к вырожденной, то минимизируется невязка. Подпрограмма поддерживает итеративное улучшение. Текущая версия ALGLIB не содержит версии этой подпрограммы для комплексных систем или для систем с множественными правыми частями.
RMatrixSolveLS solves systems with rectangular possibly degenerate matrix. Is system matrix is rank deficient, solution in a least squares sense is searched for. Subroutine supports iterative refinement. Current version of ALGLIB doesn't include complex version of this subroutine or version which accept multiple right-hand parts.
На быстродействие линейного солвера влияет несколько факторов:
Итеративное улучшение - это метод, позволяющий улучшить качество решения системы линейных уравнений, имея одновременно матрицу системы A и её треугольную факторизацию. После того, как система решена и получено решение x0 , мы вычисляем остаток r0 =b-Ax0 и используем его для уточнения решения: Ad0 =r0 , x1 =x0 +d0 Операция может повторяться несколько раз. В пакете ALGLIB используется двухпроходное улучшение.
Замечание #1
Итеративное улучшение позволяет уменьшить ошибки, возникающие из-за округления, и сделать решение настолько точным, насколько это позволяет обусловленность матрицы A. Однако качество полученного результата зависит от того, с какой точностью вычисляется b-Ax0 . Для того, чтобы итеративное улучшение оказалось стоящим усилий, требуется вычислять эту разность с существенно более высокой точностью, чем используемая при решении системы. В пакете ALGLIB для итеративного улучшения используется переносимый матричный мультипликатор, позволяющий вычислять b-Ax0 с максимальной точностью, имеющей смысл при наличии в A и b ошибок величиной не более 1 ulp. "Переносимый" в данном контексте обозначает, что он не использует специфичных для той или иной архитектуры расширений (например, 80-битных расширений в архитектуре Intel) и не содержит низкоуровневых ассемблерных вставок.
| C++ | densesolver.h | |
| C# | densesolver.cs | |
| MPFR | densesolver.h | |
| Delphi | densesolver.pas | |
| FreePascal | densesolver.pas | |
| VBA | densesolver.bas |
This article is intended for personal use only.
Исходный код на C#
Исходный код на C++
Исходный код на C++, использующий библиотеки MPFR/GMP.
Исходный код GMP доступен на сайте gmplib.org. Исходный код MPFR доступен на сайте www.mpfr.org.
Исходный код на Free Pascal.
Исходный код на Delphi.
Исходный код на VBA.
|
ALGLIB project, 1999-2010 |