Студопедия

КАТЕГОРИИ:

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


Метод Гауса




 

Метод Гауса – це метод послідовного виключення невідомих. Він є самим швидким методом розв’язку системи лінійних рівнянь порівняно з методами оберненої матриці та методом Крамера. Нехай задана система n лінійних рівнянь з n невідомими. Складемо розширену матрицю системи.

Шляхом елементарних перетворень із матриці B побудуємо трикутну матрицю. Ця система має лише один розв’язок (визначник не повинен дорівнювати нулю). Невідомі знаходяться шляхом розв’язку у зворотному порядку.

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

 

#include <iostream>

#include <cmath>

using namespace std;

 

# define delta 0.00000001

 

// aaa - массив свободных членов

// bb - выходной массив

 

bool mGauss(double*k,double*aaa,double*bb,int n)

{

int i,j,xx,r,kol_el;

double t,vv;

kol_el = n*n;

 

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

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

 

double*aa = new double[n];

double*kk = new double[kol_el];

 

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

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

aa[i] = aaa[i];

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

kk[i] = k[i];

 

// Перетворення коефіцієнтів рівняння до

// трикутного виду

// нижній трикутник 0

// переставляються та продвигаються рядки (також

// як і в методиці знаходження визначника,

// тільки стовбці замінені на рядки, так як

// кожному рівнянню відповідає визначений рядок

// матриці

 

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;

}

 

vv = aa[i];aa[i] = aa[i-1];aa[i-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;

aa[i]=aa[i]-aa[i-1]*t;

}

 

/* Знаходження коренів рівняння обратним ходом (знизу вверх)

по зміні матриці невідомих та масиву вихідних членів

*/

 

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

{

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

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

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

 

}

 

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

 

delete[]aa;

delete[]kk;

 

return true;

}

void main()

{

double k[9]={

1, 0, 8,

2, 5, 9,

3, 6, 0

};

double bb[3];

double aa[3]={6, 4, 9};

mGauss(k,aa,bb,3);

cout<<"\nx1="<<bb[0]<<"\x2="<<bb[1]

<<"\tx3="<<bb[2];

}

 

У представленій функції mGauss() спочатку перевіряється визначник матриці коефіцієнтів рівняння (масив k). Якщо він не дорівнює нулю, матриця за допомогою алгоритму описаному вище (при отриманні визначника) – зводиться до трикутної форми (нижній трикутник заповнюється нулями). Відмінність полягає в тому, що операції здійснюються не над стовпчиками, а над рядками, так як кожен рядок характеризує відповідне рівняння. Крім того, розглядається ще й масив вільних членів (aaa). Після приведення матриці до трикутної форми – у зворотному порядку знаходяться корені рівняння. Серед прямих методів розв’язку системи лінійних рівнянь метод Гауса є самим швидким та оптимальним.

У результаті виконання програми одержимо корені рівняння на екрані дисплею:

x1 = 6.30769 x2 = -1.65385 x3 = -0.0384615

 

Контрольні питання

 

1. Які ви знаєте чисельні методи розв’язання системи лінійних алгебраїчних рівнянь?

2. Які дії можна робити над матрицями?

3. Яким чином обчислюється обернена матриця? Наведіть фрагмент програми.

4. Розкрийте сутність методу оберненої матриці розв’язання системи лінійних алгебраїчних рівнянь. Наведіть фрагмент програми.

5. Розкрийте сутність методу Крамера розв’язання системи лінійних алгебраїчних рівнянь. Наведіть фрагмент програми.

6. Розкрийте сутність методу Гауса розв’язання системи лінійних алгебраїчних рівнянь. Наведіть фрагмент програми.

 


Поделиться:

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





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