Алгебраическая проблема собственных значений для матриц специального вида и ее программное обеспечение

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

(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