КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Метод Гауса
Метод Гауса – це метод послідовного виключення невідомих. Він є самим швидким методом розв’язку системи лінійних рівнянь порівняно з методами оберненої матриці та методом Крамера. Нехай задана система 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. Розкрийте сутність методу Гауса розв’язання системи лінійних алгебраїчних рівнянь. Наведіть фрагмент програми.
|