Алгебраическая проблема собственных значений для матриц специального вида и ее программное обеспечение
Информация - Компьютеры, программирование
Другие материалы по предмету Компьютеры, программирование
(Matritsaningxossonvaxosvektorlari)">EIG, CDF2RDF - собственные значения и собственные векторы матрицы (Matritsaning xos son va xos vektorlari)
-(matritsako">BALANCE - масштабирование матрицы (matritsa kolmamining kengligi)
-(Xessenbergformasigakeltirish)">HESS - приведение к форме Хессенберга (Xessenberg formasiga keltirish)
-(Shuraformasigakeltirish">SCHUR, RSF2CSF - приведение к форме Шура (Shura formasiga keltirish
-(kompleksbog">CPLXPAIR - сортировка комплексно сопряженных пар (kompleks boglanganlikni saralash)
-">QZ - приведение пары матриц к обобщенной форме Шура
-(xossonlarningmatritsapolinomliginihisoblash)">POLYEIG - вычисление собственных значений матричного полинома (xos sonlarning matritsa polinomligini hisoblash)
-">SVD - сингулярное разложение матрицы
алгебраический программный алгоритм mathlab
4.1 Программы на языке С++
1. Поиск собственных чисел и векторов симметричной матрицы
/******************************************************************
Алгоритм ищет собственные пары симметричной матрицы, приводя её к трехдиагональной и используя QL/QR алгоритм.
Входные параметры:- симметричная матрица, заданная верхним или нижним треугольником. Массив с нумерацией элементов [0..N-1, 0..N-1]- размер матрицыформат храненияфлаг, сообщающий, требуются ли собственные векторы.
Если ZNeeded:
* равно 0, то собственные векторы не возвращаются
* равно 1, то собственные векторы возвращаются
Выходные параметры:- собственные числа в порядке возрастания.
Массив с нумерацией элементов [0..N-1].- если ZNeeded:
* равно 0, не модифицируется
* равно 1, содержит собственные векторы
Массив с нумерацией элементов [0..N-1, 0..N-1], при этом
собственные векторы хранятся в столбцах матрицы.
Результат:, если алгоритм сошелся, если алгоритм не сошелся (редчайший случай)
******************************************************************/
#include
#include "sevd.h"
bool smatrixevd(ap::real_2d_array a,n,zneeded,isupper,::real_1d_array& d,::real_2d_array& z)
{result;::real_1d_array tau;
ap::real_1d_array e;
ap::ap_error::make_assertion(zneeded==0||zneeded==1, "SMatrixEVD: incorrect ZNeeded");(a, n, isupper, tau, d, e);( zneeded==1 )
{(a, n, isupper, tau, z);
}= smatrixtdevd(d, e, n, zneeded, z);result;
}
/******************************************************************
Obsolete 1-based subroutine
******************************************************************/
bool symmetricevd(ap::real_2d_array a,n,zneeded,isupper,::real_1d_array& d,::real_2d_array& z)
{result;::real_1d_array tau;
ap::real_1d_array e;
ap::ap_error::make_assertion(zneeded==0||zneeded==1, "SymmetricEVD: incorrect ZNeeded");
totridiagonal(a, n, isupper, tau, d, e);
if( zneeded==1 )
{(a, n, isupper, tau, z);
}= tridiagonalevd(d, e, n, zneeded, z); result;
}
. Разложение Холецкого
/******************************************************************
Алгоритм осуществляет разложение Холецкого симметричной положительно определенной матрицы
Результатом работы алгоритма является представление матрицы A в виде A = U*U или A = L*L.
Входные параметры:- верхний или нижний треугольник факторизуемой матрицы.
Массив с нумерацией элементов [0..N-1, 0..N-1]- размер матрицыесли IsUpper=True, A содержит верхний треугольник симметричной матрицы, иначе A содержит нижний треугольник.
Выходные параметры:- результат факторизации. Если IsUpper=True, в верхнем треугольнике находится матрица U, такая, что A = U*U, а элементы, лежащие ниже главной диагонали, не модифицируются. Аналогично, если IsUpper=False.
Результат:
Если матрица положительно определена, функция возвращает True.
Если матрица знаконеопределена, то функция возвращает False. При этом факторизация не может быть осуществлена.
******************************************************************/
#include
#include "cholesky.h"spdmatrixcholesky(ap::real_2d_array& a, int n, bool isupper)
{result;i;j;ajj;v;
//
// Test the input parameters.
//::ap_error::make_assertion(n>=0, "Error in SMatrixCholesky: incorrect function arguments");
// Quick return if possible= true;( n<=0 )
{result;
}( isupper )
{
// Compute the Cholesky factorization A = U*U.(j = 0; j <= n-1; j++)
{
// Compute U(J,J) and test for non-positive-definiteness.= ap::vdotproduct(a.getcolumn(j, 0, j-1), a.getcolumn(j, 0, j-1));= a(j,j)-v;( ajj<=0 )
{= false;result;
}= sqrt(ajj);(j,j) = ajj;
// Compute elements J+1:N of row J.
if( j<n-1 )
{(i = 0; i <= j-1; i++)
{= a(i,j);::vsub(&a(j, j+1), &a(i, j+1), ap::vlen(j+1,n-1), v);
}= 1/ajj;::vmul(&a(j, j+1), ap::vlen(j+1,n-1), v);
}
}
}
{
// Compute the Cholesky factorization A = L*L.(j = 0; j <= n-1; j++)
{
// Compute L(J,J) and test for non-positive-definiteness.= ap::vdotproduct(&a(j, 0), &a(j, 0), ap::vlen(0,j-1));= a(j,j)-v;( ajj<=0 )
{= false;result;
}= sqrt(ajj);(j,j) = ajj;
// Compute elements J+1:N of column J.
if( j<n-1 )
{(i = j+1; i <= n-1; i++)
{= ap::vdotproduct(&a(i, 0), &a(j, 0), ap::vlen(0,j-1));(i,j) = a(i,j)-v;
}= 1/ajj;::vmul(a.getcolumn(j, j+1, n-1), v);
}
}
}result;
}
/******************************************************************
Obsolete 1-based subroutine.
******************************************************************/
bool choleskydecompositio