Обчислення характеристичних многочленів власних значень і власних векторів

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

СУМСЬКИЙ ДЕРЖАВНИЙ УНІВЕРСИТЕТ

КАФЕДРА ІНФОРМАТИКИ

Курсова робота

з дисципліни «Чисельні методи»

на тему:

«Обчислення характеристичних многочленів, власних значень і власних векторів»

Суми, 2005

Зміст

ЗМІСТ

ТЕОРЕТИЧНІ ДАНІ

ВСТУП

МЕТОД ДАНИЛЕВСЬКА

ВКАЗІВКИ ЩОДО ВИКОРИСТАННЯ ПРОГРАМИ

ПРОГРАМНА РЕАЛІЗАЦІЯ

АНАЛІЗ ПРОГРАМИ

Список використаної літератури

Теоретичні дані

Введення

Велика кількість завдань з механіки, фізики та техніки вимагає знаходження власних значень і власних векторів матриць, тобто таких значень λ, для яких існує нетривіальне рішення однорідної системи лінійних алгебраїчних рівнянь . Тут А-дійсна квадратична матриця порядку n з елементами a jk, а - Вектор з компонентами x 1, x 2, ..., x n Кожному власному значенню λ i відповідає хоча б одне нетривіальне рішення. Якщо навіть матриця А дійсна, їй власні числа (всі або деякі) і власні вектори можуть бути недійсними. Власні числа є коренями рівняння , Де Е - одинична матриця порядку n

або

Дане рівняння називається характеристичним рівнянням матриці А. Власним векторах , Яким відповідає власному значенню λ i, називають ненульове рішення однорідної системи рівнянь . Таким чином, завдання знаходження власних чисел і власних векторів зводиться до знаходження коефіцієнтів характеристичного рівняння, знаходженню його коренів і знаходженню нетривіального рішення системи.

Метод Данилевського

Простий і вишуканий метод знаходження характеристичного многочлена запропонував А. М. Данилевський. Розглянемо ідею методу. Розглянемо матрицю A

Для якої знаходиться характеристичний многочлен, за допомогою подібних перетворень перетвориться до матриці

,

яка має нормальну форму Ф робеніуса, тобто матриця має в явному вигляді в останньому стовпці шукані коефіцієнти характеристичного рівняння. Т. к. подібні матриці мають один і той же характеристичний многочлен, а

, То і .

Тому для обгрунтування методу досить показати, яким чином з матриці A будується матриця P.

Подібні перетворення матриці A до матриці P відбуваються послідовно. На першому кроці матриця А перетворюється до подібної до неї матриці А (1), в якій передостанній стовпець має необхідний вигляд. На другому кроці матриця А (1) перетворюється на подібну до неї матрицю А (2), в якої вже два передостанніх стовпця мають необхідний вид, і т.д.

На першому кроці матриця А множиться справа на матрицю

і зліва на матрицю їй зворотний

Перший крок дає

,

де

На другому кроці матриця А (1) множиться справа на матрицю

і ліворуч на зворотну до неї матрицю

Очевидно, що елементи матриці

.

Це означає, що два передостанніх стовпця матриці А (2) мають необхідний вид. Продовжуючи цей процес, після n -1 кроків прийдемо до матриці

,

яка має форму Фробеніуса і подібна до вхідних матриці А. При цьому на кожному кроці елементи матриці А (j) знаходяться за елементами матриці А (j -1) також, як ми знаходили елементи матриці А (2) за елементами А (1). При цьому передбачається, що всі елементи відмінні від нуля. Якщо на j-му кроці виявиться, що , То продовжувати процес у такому вигляді не буде можливо. При цьому можуть виникнути два випадки:

  1. Серед елементів є хоча б один, відмінний від нуля, наприклад . Для продовження процесу поміняємо в А (j) місцями перший і -Го рядка і одночасно 1-й і -Й стовпці. Таке перетворення матриці А (j) буде подібним. Після того, як отримаємо матрицю , Процес можна продовжувати, тому що стовпці матриці А (j), наведені до необхідного увазі не будуть зіпсовані.

  2. Всі елементи дорівнюють нулю. Тоді матриця А (j) має вигляд , Де F - квадратична матриця порядку j, яка має нормальний вигляд Фробеніуса; В-квадратна матриця порядку n - j, але , Тобто характеристичний многочлен матриці F є дільником характеристичного многочлена матриці А. Для знаходження характеристичного многочлена матриці А необхідно ще знайти характеристичний многочлен матриці В, для якої використовуємо цей же метод.

Підраховано, що кількість операцій множення і ділення, необхідних для отримання характеристичного многочлена матриці порядку n становить n (n -1) (2 n +3) / 2.

На даному етапі роботи ми отримали характеристичний поліном, корінням якого будуть власні числа матриці А. Процедура знаходження коренів полінома n-го ступеня не проста. Тому скористаємося пакетом MathCAD Professional для реалізації даного завдання. Для пошуку коренів звичайного полінома р (х) ступеня n в Mathcad включена дуже зручна функція polyroots (V). Вона повертає вектор всіх коренів многочлена ступеня n, коефіцієнти якого перебувають у векторі V, мають довжину рівну n +1. Зауважимо, що корені полінома можуть бути як речовими, так і комплексними числами. Таким чином ми маємо власні числа, за допомогою яких ми знайдемо власні вектори нашої матриці А. Для знаходження власних векторів скористаємося функцією eigenvec (A, v i), де А-вихідна матриця, v i-власне число, для якого ми шукаємо власний вектор . Ця функція повертає власний вектор дня v i.

Вказівки щодо використання програми

Ця курсова робота виконана на мові програмування Pascal. У курсову роботу входить файл danil. exe. Danil. exe призначений для знаходження характеристичного полінома методом Данилевського. Вхідними параметрами є розмірність матриці і сама матриця, а вихідним - характеристичний поліном.

Програмна реалізація

Програмний код програми danil. exe

uses wincrt;

label 1;

type mas = array [1 .. 10,1 .. 10] of real;

var A, M, M1, S: mas;

z, max: real;

f, jj, tt, ww, v, h, b, y, i, j, w, k, e, l, q, x, u: byte;

p, o: array [1 .. 10] of real;

t: array [1 .. 10] of boolean;

procedure Umnogenie (b, c: mas; n: byte; var v: mas);

var i, j, k: byte;

begin

for i: = 1 to n do

for j: = 1 to n do

begin

v [i, j]: = 0;

for k: = 1 to n do

v [i, j]: = b [i, k] * c [k, j] + v [i, j];

end;

end;

procedure dan (n: byte; var a: mas);

label 1,2;

var y: byte;

begin

For y: = 1 to n-1 do

begin

if a [1, n] = 0 then

begin

if y> 1 then begin

max: = abs (a [1, n]);

w: = 1;

for i: = 1 to ny do

if abs (a [i, n])> max then begin max: = abs (a [i, j]); w: = i; end;

if max = 0 then

begin

for l: = n downto n-y +1 do

begin

p [f]: = a [l, n];

t [f]: = false;

f: = f-1;

end;

t [f +1]: = true;

x: = x +1;

u: = ny;

if y = n-1 then begin o [q]: = a [1,1]; q: = q +1; end else dan (u, a);

goto 2;

end;

for j: = 1 to n do

begin

z: = a [1, j];

a [1, j]: = a [w, j];

a [w, j]: = z;

end;

for k: = 1 to n do

begin

z: = a [k, 1];

a [k, 1]: = a [k, w];

a [k, w]: = z;

end;

goto 1;

end

else

begin

max: = abs (a [1,2]);

w: = 1; e: = 2;

for i: = 1 to n-1 do

if abs (a [i, n])> max then begin max: = abs (a [i, j]); w: = i; e: = n; end;

for j: = 2 to n do

if abs (a [1, j])> max then begin max: = abs (a [i, j]); w: = 1; e: = j; end;

if abs (a [n, 1])> max then begin max: = abs (a [n, 1]); w: = n; e: = 1; end;

if max = 0 then

begin

o [q]: = a [n, n];

q: = q +1;

u: = n-1;

if n = 2 then begin o [q]: = a [1,1]; q: = q +1; o [q]: = a [n, n]; q: = q +1; end else dan ( u, a);

goto 2;

end;

if (w> 1) and (e = n) then

begin

for j: = 1 to n do

begin

z: = a [1, j];

a [1, j]: = a [w, j];

a [w, j]: = z;

end;

for k: = 1 to n do

begin

z: = a [k, 1];

a [k, 1]: = a [k, w];

a [k, w]: = z;

end;

goto 1;

end;

if (w = n) and (e = 1) then

begin

for j: = 1 to n do

begin

z: = a [1, j];

a [1, j]: = a [n, j];

a [n, j]: = z;

end;

for k: = 1 to n do

begin

z: = a [k, 1];

a [k, 1]: = a [k, n];

a [k, n]: = z;

end;

goto 1;

end;

if w = 1 then

begin

for j: = 1 to n do

begin

z: = a [n, j];

a [n, j]: = a [e, j];

a [e, j]: = z;

end;

for k: = 1 to n do

begin

z: = a [k, n];

a [k, n]: = a [k, e];

a [k, e]: = z;

end;

goto 1;

end;

end;

end;

1:

for i: = 1 to n do

for j: = 1 to n do

if i <> (j +1) then M [i, j]: = 0

else M [i, j]: = 1;

for i: = 1 to n do

for j: = 1 to n do

if (i +1) <> j then M1 [i, j]: = 0

else M1 [i, j]: = 1;

for i: = 1 to n do

if i <> n then begin M [i, n]: = a [i, n]; M1 [i, 1]: =- a [i +1, n] / a [1, n]; end

else begin M [i, n]: = a [i, n]; M1 [i, 1]: = 1 / a [1, n]; end;

Umnogenie (M1, A, n, S);

Umnogenie (S, M, n, A);

if y = n-1 then

begin

for l: = n downto 1 do

begin

p [f]: = a [l, n];

t [f]: = false;

f: = f-1;

end;

t [f +1]: = true;

x: = x +1;

end;

end;

2:

end;

begin

writeln ('Vvedite razmernost `matrici A');

readln (ww);

f: = ww;

for i: = 1 to ww do

begin

for j: = 1 to ww do

begin

write ('a [', i, j ,']=');

Readln (A [i, j]);

end;

end;

q: = 1;

x: = 0;

dan (ww, a);

for i: = 1 to q-1 do

writeln ('Koren `har-ogo ur-iya =', o [i]: 2:2);

writeln;

i: = ww +1;

if (x = 1) or (x> 1) then

begin

for v: = 1 to x do

begin

tt: = 0;

repeat

tt: = tt +1;

i: = i-1;

until t [i] <> false;

write ('l ^', tt, '+');

for jj: = ww downto i do

begin

tt: = tt-1;

write (-p [jj]: 2:2, '* l ^', tt, '+');

end;

ww: = i-1;

writeln;

end;

end;

end.

Отримання форми Жордана: form. Exe

uses wincrt;

label 1;

type mas = array [1 .. 10,1 .. 10] of real;

var A, M, M1, S, R, R1, A1: mas;

z, max: real;

f, jj, tt, ww, v, h, b, y, i, j, w, k, e, l, q, x, u, n1: byte;

p, o: array [1 .. 10] of real;

t: array [1 .. 10] of boolean;

procedure Umnogenie (b, c: mas; n: byte; var v: mas);

var i, j, k: byte;

begin

for i: = 1 to n do

for j: = 1 to n do

begin

v [i, j]: = 0;

for k: = 1 to n do

v [i, j]: = b [i, k] * c [k, j] + v [i, j];

end;

end;

procedure dan (n: byte; var a: mas);

label 1,2;

var y: byte;

begin

For y: = 1 to n-1 do

begin

if a [1, n] = 0 then

begin

if y> 1 then begin

max: = abs (a [1, n]);

w: = 1;

for i: = 1 to ny do

if abs (a [i, n])> max then begin max: = abs (a [i, j]); w: = i; end;

if max = 0 then

begin

for l: = n downto n-y +1 do

begin

p [f]: = a [l, n];

t [f]: = false;

f: = f-1;

end;

t [f +1]: = true;

x: = x +1;

u: = ny;

if y = n-1 then begin o [q]: = a [1,1]; q: = q +1; end else dan (u, a);

goto 2;

end;

for j: = 1 to n do

begin

z: = a [1, j];

a [1, j]: = a [w, j];

a [w, j]: = z;

end;

for k: = 1 to n do

begin

z: = a [k, 1];

a [k, 1]: = a [k, w];

a [k, w]: = z;

end;

goto 1;

end

else

begin

max: = abs (a [1,2]);

w: = 1; e: = 2;

for i: = 1 to n-1 do

if abs (a [i, n])> max then begin max: = abs (a [i, j]); w: = i; e: = n; end;

for j: = 2 to n do

if abs (a [1, j])> max then begin max: = abs (a [i, j]); w: = 1; e: = j; end;

if abs (a [n, 1])> max then begin max: = abs (a [n, 1]); w: = n; e: = 1; end;

if max = 0 then

begin

o [q]: = a [n, n];

q: = q +1;

u: = n-1;

if n = 2 then begin o [q]: = a [1,1]; q: = q +1; o [q]: = a [n, n]; q: = q +1; end else dan ( u, a);

goto 2;

end;

if (w> 1) and (e = n) then

begin

for j: = 1 to n do

begin

z: = a [1, j];

a [1, j]: = a [w, j];

a [w, j]: = z;

end;

for k: = 1 to n do

begin

z: = a [k, 1];

a [k, 1]: = a [k, w];

a [k, w]: = z;

end;

goto 1;

end;

if (w = n) and (e = 1) then

begin

for j: = 1 to n do

begin

z: = a [1, j];

a [1, j]: = a [n, j];

a [n, j]: = z;

end;

for k: = 1 to n do

begin

z: = a [k, 1];

a [k, 1]: = a [k, n];

a [k, n]: = z;

end;

goto 1;

end;

if w = 1 then

begin

for j: = 1 to n do

begin

z: = a [n, j];

a [n, j]: = a [e, j];

a [e, j]: = z;

end;

for k: = 1 to n do

begin

z: = a [k, n];

a [k, n]: = a [k, e];

a [k, e]: = z;

end;

goto 1;

end;

end;

end;

1:

for i: = 1 to n do

for j: = 1 to n do

if i <> (j +1) then M [i, j]: = 0

else M [i, j]: = 1;

for i: = 1 to n do

for j: = 1 to n do

if (i +1) <> j then M1 [i, j]: = 0

else M1 [i, j]: = 1;

for i: = 1 to n do

if i <> n then begin M [i, n]: = a [i, n]; M1 [i, 1]: =- a [i +1, n] / a [1, n]; end

else begin M [i, n]: = a [i, n]; M1 [i, 1]: = 1 / a [1, n]; end;

Umnogenie (M1, A, n, S);

Umnogenie (S, M, n, A);

if y = n-1 then

begin

for l: = n downto 1 do

begin

p [f]: = a [l, n];

t [f]: = false;

f: = f-1;

end;

t [f +1]: = true;

x: = x +1;

end;

end;

2:

end;

procedure ObrMatr (A: mas; Var AO: mas; n: byte);

const e = 0.00001;

var i, j: integer;

a0: mas;

procedure MultString (var A, AO: mas; i1: integer; r: real);

var j: integer;

begin

for j: = 1 to n do

begin

A [i1, j]: = A [i1, j] * r;

AO [i1, j]: = AO [i1, j] * r;

end;

end;

procedure AddStrings (var A, AO: mas; i1, i2: integer; r: real);

{Процедура додає до i 1 рядок матриці a i 2-у помножену на r}

var j: integer;

begin

for j: = 1 to n do

begin

A [i1, j]: = A [i1, j] + r * A [i2, j];

AO [i1, j]: = AO [i1, j] + r * AO [i2, j];

end;

end;

function Sign (r: real): shortint;

begin

if (r> = 0) then sign: = 1

else sign: =- 1;

end;

begin {початок основної процедури}

for i: = 1 to n do

for j: = 1 to n do

a0 [i, j]: = A [i, j];

for i: = 1 to n do

begin {К i-тому рядку додаємо (або віднімаємо)

j-ту рядок взяту зі знаком i-того

елемента j-того рядка. Таким чином,

на місце елемента a [i, i] виникає сума

модулів елементів i-того стовпця (нижче i-того рядка)

взята зі знаком колишнього елемента a [i, i],

рівність нулю яку говорить про неіснування

зворотної матриці}

for j: = i +1 to n do

AddStrings (A, AO, i, j, sign (A [i, i]) * sign (A [j, i])); {Прямий хід}

if (abs (A [i, i])> e) then

begin

MultString (a, AO, i, 1 / A [i, i]);

for j: = i +1 to n do

AddStrings (a, AO, j, i,-A [j, i]);

end

else begin writeln ('Зворотною матриці не існує.');

halt;

end

end; {Зворотний хід:}

if (A [n, n]> e) then begin

for i: = n downto 1 do

for j: = 1 to i-1 do

begin

AddStrings (A, AO, j, i,-A [j, i]);

end; end

else writeln ('Зворотною матриці не існує.');

end;

procedure EdMatr (Var E: mas; n: byte);

var i, j: byte;

begin

for i: = 1 to n do

for j: = 1 to n do

if i <> j then E [i, j]: = 0 else E [i, i]: = 1;

end;

{Procedure UmnogMatr (A, F: mas; Var R: mas; n: byte);

Var s: real;

l, i, j: byte;

begin

for i: = 1 to n do

for j: = 1 to n do

begin

s: = 0;

for l: = 1 to n do

s: = s + A [i, l] * F [l, j];

R [i, j]: = s;

end;

end;}

begin

writeln ('Vvedite razmernost `matrici A');

readln (ww);

f: = ww;

n1: = ww;

for i: = 1 to ww do

begin

for j: = 1 to ww do

begin

write ('a [', i, j ,']=');

Readln (A [i, j]);

A1 [i, j]: = A [i, j];

end;

end;

q: = 1;

x: = 0;

dan (ww, a);

for i: = 1 to q-1 do

writeln ('Koren `har-ogo ur-iya =', o [i]: 2:2);

writeln;

i: = ww +1;

if (x = 1) or (x> 1) then

begin

for v: = 1 to x do

begin

tt: = 0;

repeat

tt: = tt +1;

i: = i-1;

until t [i] <> false;

write ('l ^', tt, '+');

for jj: = ww downto i do

begin

tt: = tt-1;

write (-p [jj]: 2:2, '* l ^', tt, '+');

end;

ww: = i-1;

writeln;

end;

end;

for i: = 1 to n1 do

begin

for j: = 1 to n1 do

read (R [i, j]);

readln;

end;

EdMatr (R1, n1);

ObrMatr (R, R1, n1);

Umnogenie (R1, A1, n1, A);

Umnogenie (A, R, n1, M1);

for i: = 1 to n1 do

begin

for j: = 1 to n1 do

write ('', M1 [i, j]: 2:3, '');

writeln;

end;

end.

Аналіз програми

Протестуємо роботу програми на прикладі. Нехай маємо матрицю А

Характеристичний поліном має вигляд:

Власні числа 20.713, 4.545, 2.556, -5.814

Власні вектори , , ,

Список використаної літератури

Я. М. Григоренко, Н. Д. Панкратова «обчислювальні методи» 1995 р.

В. Д. Гетмнцев «Л інійна алгебра и Лінійне програмування» 2001р.

Д.Мак-Кракена, У. Дорн «Програмування на Фортрані» 1997р.

http://alglib.manual.ru/eigen/danilevsky.php

http://doors.infor.ru/allsrs/alg/index.html

Посилання (links):
  • http://alglib.manual.ru/eigen/danilevsky.php
  • http://doors.infor.ru/allsrs/alg/index.html
  • Додати в блог або на сайт

    Цей текст може містити помилки.

    Математика | Курсова
    109.1кб. | скачати


    Схожі роботи:
    Алгебраїчна проблема власних значень
    Чисельне рішення алгебраїчних проблем власних значень
    Портфель власних акцій
    Семантика власних імен
    Ортогональність власних хвиль у хвильоводі
    Облік власних коштів підприємства
    Атрибуції власних дій і переживань
    Ресемантизації власних імен в арго
    Облік власних коштів організації
    © Усі права захищені
    написати до нас