Главная Обратная связь

Дисциплины:






Якщо то розв’язок не може бути отриманим

Розв’язком СЛАР звуть набір значень невідомих , підстановка яких у рівняння системи перетворює їх одночасно на тотожності.

Для розробки схем розрахунків і програмування методів розв’язання СЛАР зручно використовувати матричні позначення, в яких система записується наступним чином.

,

де: - матриця коефіцієнтів системи;

Вектор невідомих; - вектор правих частин.

Метод послідовного виключення невідомих (Гаусса)

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

Алгоритм методу Гаусса може бути поданим наступним чином:

Початок

{прямий хід - зведення системи до трикутного вигляду}

для i:=1 до m-1

початок циклу

визначити номер рядку(k) такий, що

якщо то розв’язок не може бути отриманим

інакше

початок

поміняти місцями рядки (i) та (k);

поділити рядок (i) на

для n:=i+1 до m

початок циклу

відняти від рядка (n) рядок (i), помножений на ;

кінець циклу

кінець

кінець циклу

{зворотній хід}

для i:= m назад до 1

початок циклу кінець циклу

кінець

 

Нижче наведено приклад програми ЕОМ мовою програмування Pascal для розв’язання СЛАР за методом Гауса, яка зчитує коефіцієнти при невідомих і праві частини системи з файлу varN.lriі записує результати у файл Gauss.res

const

nmax=30;

type

Vector = array[1..nmax] of real;

Matrix = array[1..nmax] of Vector;

var

A : Matrix ;

x,b : Vector ;

n,i, ercode :integer;

fl: text;

 

procedure ReadMatrixAb( str : string; n:integer;

var A : Matrix; var b : Vector);

var

i,j : integer;

fl : text;

begin

Assign(fl,str); Reset(fl); { открыть файл }

readln(fl); { пропустить первую строку в файле }

for i:=1 to n do { читать элементы матрицы А }

begin

for j:=1 to n do read(fl, A[i,j]);

readln(fl);

end;

readln(fl); { пропустить строку в файле }

for i:=1 to n do read(fl,b[i]); { читать элементы вектора b }

close(fl); { закрыть файл }

end; {ReadMatrixAb}

 

procedure Gauss(A: Matrix; b: Vector; n: integer;

var x: Vector; var error : integer );

label MEnd;



const Zero = 0.000000000000001;

var

i,j,k, kmax : integer;

amax, xk : real;

row : Vector;

c : real;

begin

for k:=1 to n do {цикл по неизвестным}

begin

{найти строку с максимальныи по модулю a[i,k]}

amax:=abs(A[k,k]); kmax:=k;

for i:=k+1 to n do

if abs(A[i,k]) > amax then

begin amax:=abs(A[i,k]); kmax:=i; end;

if amax < Zero then begin error:=1; goto MEnd; end;

{переставить строку kmax и k местами}

 

if kmax <> k then {переставить уравнения kmax и k местами }

begin

row:=A[kmax]; A[kmax]:=A[k]; A[k]:=row;

{ for i:=k to n do

begin

c:=A[kmax,i]; A[kmax,i]:=A[k,i]; A[k,i]:=c;;

end;}

 

c:=b[kmax]; b[kmax]:=b[k]; b[k]:=c;

end;

{поделитьстроку на ведущий элемент}

amax:=A[k,k];

for j:=k to n do A[k,j]:=A[k,j]/amax; b[k]:=b[k]/amax;

{исключить к-тое неизвестное из уравнений k+1....n}

 

for i:=k+1 to n do

begin

amax:=A[i,k];

for j:=k+1 to n do A[i,j]:=A[i,j]-A[k,j]*amax;

b[i]:=b[i]-b[k]*amax;

end;

end;{ прямого хода }

{ обратный ход }

for k:=n downto 1 do

begin

xk:=b[k];

for i:=k+1 to n do xk:=xk-A[k,i]*x[i];

x[k]:=xk;

end;

error:=0;

MEnd :

end; {Gauss}

 

begin

ReadMatrixAb( 'varN.lri', n, A, b);

Gauss(A, b, n, x, ercode);

Assign(fl,'Gauss.res'); Rewrite(fl);

if ercode=0 then

begin

writeln(fl,'решение системы');

for i:=1 to n do writeln(fl,x[i]);

end

else

writeln(fl,'система не решена');

Close(fl);

end.

 

Розроблено більш ефективні і зручні для програмування методи приведення СЛАР до трикутного вигляду. Нижче наведена схема Халецького () обчислення коефіцієнтів системи, зведеної до трикутного вигляду, за рекурентними формулами. Цей метод використовує подання матриці системи добутком двох трикутних матриць:

,

де - ліва трикутна,

а - права трикутна матриці.

Коефіцієнти цих матриць обчислюються за формулами:

при ;

при

для послідовності

Далі розв’язок системи може бути отримано послідовним розв’язанням двох трикутних систем:

і

Метод квадратного кореня

Цей метод можна вважати модифікацією схеми Халецького для випадку симетричної матриці системи.

Якщо матриця є симетричною, тобто , її можна подати добутком матриць:

,

де: - права трикутна матриця;

- діагональна матриця, діагональні елементи якої дорівнюють +1 або –1.

Елементи матриць обчислюються за наступними формулами.

для

Далі розв’язок системи може бути отримано послідовним розв’язанням двох трикутних систем:

і

Розглянуті методи відносяться до класу точних, так як теоретично при відсутності похибки обчислень дають точний розв’язок системи за визначене число обчислень. У дійсності похибка обчислень має місце внаслідок округлення чисел при їх поданні в ЕОМ. Ця похибка зростає з ростом числа обчислень і для великих за розміром СЛАР може стати неприйнятною. Наступний метод розв’язання СЛАР має більшу у порівнянні з вже розглянутими стійкість до процесу зростання похибки обчислень

Метод віддзеркалення

Для нормованого вектора ( ) матрицю

(де - одинична матриця відповідного розміру)

звуть матрицею віддзеркалення внаслідок її властивості:

1)

тобто матриця є ортогональною.





sdamzavas.net - 2017 год. Все права принадлежат их авторам! В случае нарушение авторского права, обращайтесь по форме обратной связи...