lab106 2258 1395959527

background image

Metody numeryczne

Laboratorium

Temat ćwiczenia: Rozwiązywanie układów równań

liniowych

Grupa 4

sekcja 2, podsekcja 5

Mariusz Matyszkiewicz

Mateusz Odrobiński

background image

1. Wstęp - metoda iteracji prostej

Metoda iteracji prostej umożliwia obliczanie przybliżonych wartości rozwiązań układów równań
liniowych za pomocą kolejnych aproksymacji.
Jest to powszechnie wykorzystywany sposób, ponieważ pozwala obliczyć wartość rozwiązania
znacznie szybciej niż w tradycyjny sposób. Obarczony jest jednak błędem, który powstaje w
wyniku kolejnych przybliżeń.

W technice zachodzi potrzeba rozwiązywania układów równań w jak najkrótszym czasie,
zaś dokładność obliczeń często nie jest tak ważna. Ograniczenie ilości wykonywanych obliczeń
jest szczególnie ważne w urządzeniach cyfrowych o małej mocy obliczeniowej
czy w urządzeniach mobilnych, w których co raz większe zapotrzebowanie na moc obliczeniową
przekłada się na zwiększenie poboru energii.

W metodzie iteracji prostej przekształcamy równanie

do postaci

wartość przybliżona kolejnego rozwiązania

wektor powstały z przekształceń wektora

wartość bieżącego rozwiązania

wektor powstały z przekształceń macierzy

Warunkiem dostatecznym zbieżności procesu jest:

Koniec procesu jest uwarunkowany kryterium stopu:


background image

2. Wyniki działania algorytmu iteracji prostej zaimplementowanego w C++


Do obliczeń przyjęliśmy

I.

Układ równań

1. Parametry:

A =

[

]; b = [

]

detA = -42

2. Rozwiązania:

Metoda dokładna

[



] [

]

Metoda iteracji prostej

[

]

3. Ilość iteracji = 13

4. Błędy:

5. Wykres

-1,5

-1

-0,5

0

0,5

1

1,5

2

2,5

3

3,5

0

2

4

6

8

10

12

14

x1

x2

background image

II.

Układ równań

1. Parametry:

A =

[

]; b = [

]

detA = 971

2. Rozwiązania:

Metoda dokładna

[

]

Metoda iteracji prostej

[

]

3. Ilość iteracji = 18

4. Błędy

5. Wykres

-12

-10

-8

-6

-4

-2

0

2

4

6

8

10

0

2

4

6

8

10

12

14

16

18

20

x1

x2

background image

III.

Układ równań

1. Parametry:

A =

[

]; b = [

]

detA = 80,3026

2. Rozwiązania:

Metoda dokładna

[

]

Metoda iteracji prostej

[

]

3. Ilość iteracji = 17

4. Błędy

5. Wykres

0

0,1

0,2

0,3

0,4

0,5

0,6

0

2

4

6

8

10

12

14

16

18

x1

x2

background image

IV.

Układ równań

1. Parametry:

A =

[

]; b = [

] eps = 0.0001

detA = 838

2. Rozwiązania:

Metoda dokładna

[

];

Metoda iteracji prostej

[

]

3. Ilość iteracji = 8

4. Błędy

5. Wykres

-1,4

-1,2

-1

-0,8

-0,6

-0,4

-0,2

0

0,2

0,4

0,6

0,8

0

2

4

6

8

10

x1

x2

x3

background image

V.

Układ równań

1. Parametry:

A =

[

]; b = [

] eps = 0.0001

detA = 0.5846

Wyznacznik bliski 0.

2. Rozwiązania:

Metoda dokładna

[

]

Metoda iteracji prostej

[

]

3. Ilość iteracji = 2164

4. Błędy

5. Wykres

-50

-40

-30

-20

-10

0

10

20

30

40

50

0

500

1000

1500

2000

2500

x1

x2

background image

VI.

Układ równań dla którego nie spełnione są warunki zbieżności

1. Parametry:

A =

[

]; b = [

] eps = 0.0001

detA = 0,053

2. Rozwiązania:

Metoda dokładna

[

]

Metoda iteracji prostej

[

]

3. Ilość iteracji = 3118

-800

-600

-400

-200

0

200

400

0

500

1000

1500

2000

2500

3000

3500

x1

x2

background image

3. WNIOSKI

W celu zbadania działania algorytmu przeprowadziliśmy obliczenia dla różnych danych
wejściowych. Wyniki działania programu porównaliśmy z dokładnymi rozwiązaniami,
należy jednak pamiętać, że nie zawsze są one idealne, ze względu na skończoną ilość cyfr
na których są zapisane. W przypadku układów równań od I do V różnice pomiędzy
otrzymanym wynikiem a dokładnym rozwiązaniem są pomijalnie małe.

Układ równań VI nie spełnia wymagań (norma macierzy H>1) dlatego program generuje
ostrzeżenie, celowo jednak nie przerwaliśmy jego działania – algorytm kończy działanie
dopiero po 3118 iteracjach, a otrzymane wyniki są diametralnie różne od prawidłowego
rozwiązania. Niewątpliwie jest to wada metody iteracji prostej.

Analizując wyniki stwierdziliśmy, że o ilości iteracji potrzebnych do otrzymania wyniku
spełniającego warunek stopu decyduje wyznacznik macierzy A. Jeśli jego wartość jest
bliska zeru (układ równań V), czas działania programu wzrasta około kilkaset razy, błędy
obliczeń również rosną, jednak można przypuszczać że wyznaczone rozwiązania
są wystarczająco dokładne w większości zastosowań. Zarówno dla ujemnych wartości
wyznacznika macierzy A, jak i dla dużych jego wartości nie zauważyliśmy wpływu na
ilość iteracji czy błędy otrzymanych wyników.

Ilość iteracji w przypadku układu 3 równań jest podobna jak w przypadku układu 2
równań.

Na podstawie wykresów można zauważyć, że w przypadku gdy wymagana jest mała
dokładność obliczeń, ilość wykonywanych operacji może być znacznie mniejsza, jednak
gdy wyznacznik macierzy A jest bliski zeru, ilość iteracji nadal musiałaby być bardzo
duża.

4. Kod programu

#include <iostream>
#include <math.h>
#include <fstream>

using namespace std;
#define N 2

int main()
{

ofstream file("wielomiany_wykresy.csv", ios::out);

ofstream file2("wielomiany_wyniki.csv", ios::out);


file << "Iteracja;" << "x1;" << "x2;" << "x...\n";

double a[N][N], b[N], x[N], h[N][N], g[N], suma, ilosc_iteracji = 0, suma_eps, xp, det, eps;

background image

//Dane wejściowe

eps=0.0001;

a[0][0] = 15.43;

a[0][1] = 13.94;

a[1][0] = 10.5;

a[1][1] = 14.82;

b[0] = 9.42;

b[1] = 8.35;


if (N == 2) det = a[0][0] * a[1][1] - a[0][1] * a[1][0];

double sum;


for (int i = 0; i<N; ++i)

{

g[i] = b[i] / a[i][i];

x[i] = g[i];


sum=0;

for (int j = 0; j<N; ++j)

{

if (i == j)h[i][j] = 0;

else h[i][j] = -a[i][j] / a[i][i];

sum += fabs(h[i][j]);

}

if(sum>=1) cout << "Uklad rownan nie spelnia warunkow !";

}


do

{

file << ++ilosc_iteracji << ";";

suma_eps = 0;

for (int i = 0; i<N; i++)

{


suma = 0;

for (int j = 0; j<N; ++j) suma += (h[i][j] * x[j]);

xp = x[i];

x[i] = g[i] + suma;

suma_eps += powf(x[i] - xp, 2.0);

file << x[i] << ";";

}


file << endl;

suma_eps = powf(suma_eps, 0.5);


} while (suma_eps > eps);


for (int i = 0; i<N; ++i)

{

cout << x[i] << endl;

}

background image

cout << "Iteracje "<< ilosc_iteracji <<endl;

cout <<"detA " << det <<endl;


file2 << "A=;" << a[0][0] << ";" << a[0][1] << endl << ";"<< a[1][0] << "; " << a[1][1] << endl;

file2 << "B=;" << b[0] << endl << ";" << b[1] <<endl;

file2 << "zadany eps=;" << eps << endl;

if (N == 2) file2 << "detA=;" << det << endl;

file2 << "x=;" << x[0] << endl << ";" << x[1]<<endl;

file2 << "Ilosc iteracji:;" << ilosc_iteracji << endl;

system("pause");

return 0;

}


Wyszukiwarka

Podobne podstrony:
2258
2258
2258
lab106 19656 1462385132
2258
KKK (2258 – 2291; 2297 – 2298)
2258
106, LAB106M(1), ˙w.nr.106 Temat: Wyznaczanie stosunku H=Cp/Cv dla powietrza metod˙
lab106 19544 1462389000
2258
lab106 19654 1462389421
2258
lab106 19643 1465153892
2258
Whirlpool AWT 2258

więcej podobnych podstron