русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Метод неопределенных коэффициентов


Дата добавления: 2015-01-16; просмотров: 772; Нарушение авторских прав


Под стандартной матричной проблемой собственных значений мы понимаем задачу отыскания комплексных чисел λ1, λ2, …, λn и соответствующих ненулевых векторов X1, …, Xn удовлетворяющих уравнению АХ=λХ, где А – заданная комплексная матрица размера nxn. Решения этого уравнения являются корнями характеристического уравнения det(АλЕ)=0. Левая часть этого уравнения есть полином степени n по λ, и, следовательно, характеристическое уравнение имеет ровно n корней. Если собственное значение λi найдено, то соответствующий собственный вектор можно определить как решение однородной системы уравнений (АλiЕ)Х=0.

Пусть

D(λ)=λn+p1λn-1+…+pn

есть вековой определитель матрицы А, т.е. det(АλЕ)=0. Если в этом равенстве последовательно положить i=0, 1, 2, …, n-1, то для коэффициентов рi (i=1, 2, …, n) получим систему линейных уравнений, решая которую, можно определить коэффициенты характеристического полинома. Найдя коэффициенты, с помощью метода Ньютона определяем собственные значения, а затем – собственные векторы.

 

/*Выполняем переименование используемых типов с заменой шаблона типом complex - нам вероятно придется иметь дело с комплексными корнями полиномов

*/

typedef polynom<complex> cpolynom;

typedef vector<complex> cvector;

typedef matrix<complex> cmatrix;

 

//Прототипы функций

cvector eigenval(cmatrix&);

cmatrix eigenvec(cmatrix&, cvector&);

 

/*Подпрограмма вычисления собственных значений произвольной матрицы по методу неопределенных коэффициентов */

cvector eigenval(cmatrix &x)

{

if(x.getn()!=x.getm())

throw xmsg("Для неквадратных матриц собственные значения не определены \n");

/*Вид характеристического полинома хорошо известен - это обычный полином n степени с (n+1)-им коэффициентом. Для того, чтобы найти эти коэффициенты, используем следующий способ: характеристический полином прямыми методами получается развёрткой детерминанта, и значение полинома в некоторой точке х соответствует значению детерминанта матрицы, из диагональных элементов которой вычтен х. Тогда, взяв набор из (n+1) несовпадающих точек, мы можем составить систему из n уравнений, линейных относительно коэффициентов характеристического полинома. Результатом решения этой системы и будут искомые коэффициенты, зная которые, мы можем найти корни полинома, и являющиеся искомыми собственными значениями */



cmatrix a(x.getm()+1,x.getm()+1),b(x.getm()+1,1);

for(long i=0;i<a.getm();i++)//набор точек

{

for(long j=0;j<a.getm();j++)/*вычисляем степени при коэффициентах*/

a[i][j]=pow(i,a.getm()-j-1);

cmatrix temp=x;

for(long j=0;j<temp.getm();j++)

temp[j][j]-=i;/* вычитаем из элементов главной диагонали текущую точку и находим детерминант*/

b[i][0]=det(temp);

}

cmatrix result=SLAE_Orto(a,b);//решаем СЛАУ

cpolynom lambdaeq=result.getm();

for(long i=0;i<result.getm();i++)/*формируем характеристический полином и находим*/

lambdaeq[i]=result[result.getm()-i-1][0];

return newton(lambdaeq);/*его корни модифицированным методом Ньютона*/

}

 

 

/*Подпрограмма вычисления собственных векторов при известных матрице и её собственных значениях*/

cmatrix eigenvec(cmatrix &x, cvector &e)

{

if(x.getn()!=x.getm())

throw xmsg("Для неквадратных матриц собственные вектора не определены \n");

if(x.getm()!=e.getm())/*при несовпадении размерностей*/

throw xmsg("Собственные значения не соответствуют матрице \n");

cmatrix ev(x.getm(),x.getm());/*в строках этой матрицы будут находиться собственные вектора*/

for(long i=0;i<e.getm();i++)/*цикл по собственным значениям*/

{

cmatrix temp=x;

for(long j=0;j<temp.getm();j++)/*вычитаем единичную матрицу, умноженную */

temp[j][j]-=e[i]; //на собственное значение

/*Для нахождения ненулевого решения однородной системы уравнений проделаем следующее: примем одну из компонент вектора равной 1. Затем перенесём в системе уравнений в правую часть с противоположным знаком столбец, соответствующий этой компоненте. Решив такую СЛАУ, мы найдём все остальные компоненты вектора. Для того, чтобы вектора не совпадали, для каждого из них "объединичим" свою компоненту - сначала первую, затем - вторую и т.д. */

cmatrix a(temp.getm()-1,temp.getm()-1),

b(temp.getm()-1,1);/*матрицы для СЛАУ*/

for(long k=0;k<a.getm();k++)

for(long j=0,l=0;j<temp.getm();j++)

if(j==i)/*компоненту вектора, номер которой соответствует номеру собственного значения, сделаем равным 1, а соответствующий столбец переносим в правую часть; все остальное остаётся в левой части*/

b[k][0]=-temp[k][j];

else

a[k][l++]=temp[k][j];

cmatrix res=SLAE_Orto(a,b);/*решаем СЛАУ относительно неизвестных составляющих*/

for(long j=0,l=0;j<ev.getm();j++)/*компонуем собственный вектор*/

ev[i][j]=((i==j)?complex(1,0):res[l++][0]);

ev[i]=~ev[i];/*для удобства нормируем его по модулю*/

}

return ev;//возвращаем массив векторов

}



<== предыдущая лекция | следующая лекция ==>
Интерфейсный файл реализации матричного класса matrix.h | Программная реализация метода Крылова вычисления собственных значений


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.514 сек.