Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Лінійні дії над матрицями. Множення матриць. Обернена матриця.




Під лінійними діями розуміють додавання і віднімання матриць, множення матриць на скаляр (const). Операція + (–) визначається тільки для матриць однакових розмірів. Сумою (різницею) двох матриць A і B розміром mxn називається матриця C такого ж розміру у якій елементи обчислюються за формулою . Наприклад C = AB, де

Нульова матриця при + (–) матриць виконує роль звичайного нуля при + (–) чисел. .

Добутком матриці A на λ (λ = const) називається матриця B, яка отримується з даної помноженням усіх її елементів на скаляр λ.

Помноження матриць відбувається тільки тоді, коли матриця A погоджена з матрицею B (кількість стовпців матриці A дорівнює кількості рядків матриці B).

Тільки квадратні матриці одного порядку є взаємопогоджені. Правило погодження матриць називається правило "рядок на стовбець". Якщо для матриць A і B знайдені добутки A*B і B*A то це не значить, що A*B = B*A. При помноженні квадратної матриці на нульову матрицю отримують нульову матрицю.

Якщо A і B квадратні матриці одного порядку з визначниками |A| і |B|, то для матриці C = A*B, її визначник |C| = |A*B| = |A| * |B|.

Розглянемо квадратну матрицю n-го порядку. Квадратна матриця A-1 називається оберненою для квадратної матриці A того ж порядку, якщо виконується рівність .

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

Формула оберненою матриці.

,

де матриця B – транспонована матриця A, у якій елементи замінені алгебраїчними доповненнями.

Необхідною перевіркою правильності знаходження оберненої матриці є рівність .

З точки зору обчислення оберненої матриці – обчислення за допомогою приведеної формули є неоптимальним варіантом, так як при цьому необхідно обчислити n2 алгебраїчних доповнень (визначників порядку n-1), а це займає досить багато часу. Одним з самих швидких методів обчислення оберненої матриці є метод Жордана-Гауса, який зводиться до вирішення системи лінійних рівнянь.

Позначимо елементи оберненої матриці через αlm. Тоді співвідношення AA-1 = E можна записати так:

.

Якщо розглядати l-й стовпець оберненої матриці як вектор, то він є вирішенням лінійної системи з матрицею A і спеціальною правою частиною (у якій на l-м місці знаходиться одиниця, а на останніх – нулі).

Таким чином, для обернення матриці треба розв’язати n систем лінійних рівнянь з однаковою матрицею A і різними правими частинами. Приведення матриці A до трикутної форми робиться при цьому тільки один раз.

Цікаво відзначити, що обернення матриці зводиться до вирішення n систем лінійних рівнянь, і вимагає лише втричі більше дій ніж вирішення однієї системи рівнянь. Це пояснюється тим, що при вирішенні лінійної системи велика частина обчислень пов'язана з приведенням матриці до трикутного виду, що при оберненні матриці робиться тільки один раз. Зворотний хід і перетворення правих частин виконуються набагато швидше. Тому, якщо потрібно кілька разів розв’язати лінійну систему з однією і тією ж матрицею, то вигідно привести матрицю до трикутної форми лише один раз.

Наведемо код функцій множення матриць та оберненої матриці методом Жордана-Гауса.

 

#include <iostream>

#include <cmath>

using namespace std;

 

# define delta 0.00000001

 

// Ф-я множення 2-х матриць

// Вход:

/*

m1 – масив-шнурок представлення 1-ї матриці розмірності m*n

m2 – масив шнурок представлення 2-ї матриці розмірності n*l

Обов’язкова умова 2-х вхідних матриць (кількість стовбців 1-ї = кількості рядків 2-ї)

m, n, l – розмірності відповідних матриць

*/

// Вихід m3 – отримана матриця (у вигляді масиву)

// розмірністю m*l елементів

 

void mumnog(double*m1, double*m2,

int m, int n, int l, double*m3)

{

int i,j,k;

for(i=0;i<m;i++)

for(j=0;j<l;j++)

{

m3[i*l+j] = 0;

for(k=0;k<n;k++)

m3[i*l+j]+=m1[i*n+k]*m2[k*l+j];

}

}

 

/*

Ф-я знаходження оберненої матриці порядку n методом Гаусса

k - масив входу (матриця A)

bb - масив виходу (матриця A^-1)

*/

bool mObr_Gauss(double*k,double*bb,int n)

{

int i,j,tt,xx,r,kol_el;

double t,vv;

kol_el = n*n;

 

//Якщо визначник 0 - оберненої матриці не існує.

if(fabs(mopred(k,n))<delta)return false;

 

double*aa = new double[kol_el];

double*kk = new double[kol_el];

 

//Перегонка масивів

for(i=0;i<kol_el;i++)

{

aa[i] = 0;

kk[i] = k[i];

}

 

//Заповнення 1 по головній діагоналі –

//aa - одинична матриця

for(i=0;i<n;i++)aa[i*n+i]=1;

 

//Приведення нижнього трикутника до нульових

//коефіцієнтів (методом Гауса)

//Маніпуляції виконуються як з поточною,

//так і з одиничною матрицею

for(j=0;j<n;j++)

for(i=n-1;i>j;i--)

{

if (fabs(kk[(i-1)*n+j])<delta)

{

for(xx=j;xx<n;xx++)

{

vv = kk[i*n+xx];

kk[i*n+xx]=kk[(i-1)*n+xx];

kk[(i-1)*n+xx] = vv;

}

 

for(tt=0;tt<n;tt++)

{

vv = aa[i+tt*n];

aa[i+tt*n] = aa[i+tt*n-1];

aa[i+tt*n-1] = vv;

}

continue;

}//endif

if (fabs(kk[i*n+j])<delta)continue;

t = kk[i*n+j]/kk[(i-1)*n+j];

 

for(r=j;r<=n;r++)

kk[i*n+r]=kk[i*n+r]-kk[(i-1)*n+r]*t;

 

for(tt=0;tt<n;tt++)

aa[i+tt*n]=aa[i+tt*n]-aa[i+tt*n-1]*t;

}

 

//Для кожного стовбця зміненої одиничної матриці

//знаходиться розв’язок

//Таким чином отримуємо обернену матрицю,

//тобто коли A->E, E->A^(-1)

for (i=n-1;i>=0;i--)

{

for (j=n-1;j>i;j--)

for(tt=0;tt<n;tt++)

aa[i+tt*n]-=kk[i*n+j]*aa[j+tt*n];

 

for(tt=0;tt<n;tt++)

aa[i+tt*n]/=kk[i*n+i];

}

 

//Запис вихідного масиву(транспонований вид)

for(i=0;i<kol_el;i++)bb[i] = aa[(i%n)*n + i/n];

 

delete[]aa;

delete[]kk;

 

return true;

}

 

Широкого поширення набули прямі чисельні методи розв’язання системи лінійних алгебраїчних рівнянь: оберненої матриці, Крамера, Гауса. Розв’яжемо систему лінійних рівнянь:

кожним з цих методів.

 


Поделиться:

Дата добавления: 2014-12-30; просмотров: 307; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты