Metody numeryczne
Laboratorium
Temat ćwiczenia: Rozwiązywanie układów równań
liniowych
Grupa V
Sekcja 2, podsekcja 6
Przemysław Zając
Matthias Koziełło-Poklewski
Wstęp
Celem ćwiczenia jest zaprogramowanie metody rozwiązywania układów liniowych. Poniżej została
przedstawiona metoda iteracji prostej. Metoda ta umożliwia rozwiązywanie układów liniowych za
pomocą przybliżeń. Metoda ta jest dość szybka, ale ze względu na stosowane przybliżenie,
otrzymywane wyniki posiadają błąd.
Przekształcamy równanie Ax = b do postaci macierzowej xi+1 = g + Hxi
Gdzie:
xi+1 to wartość przybliżona
x wartość aktualnego rozwiązania
g wektor powstały z przekształceń wektora b
H wektor powstały z przekształceń macierzy A
Kryterium stopu to: || xi+1 xi || < µ
Przykłady
µ = 0.0001
A)
6x1 + 2x2 = 9
5x1 3x2 = 10
det = -28
Wyniki metody dokładnej:
x1 = 1.678571
x2 = -0.535713
Wyniki metody iteracji prostej:
x1 = 1.678567
x2 = -0.535785
liczba iteracji = 36
B)
51x1 + 75x2 = 12
20x1 + 36x2 = 99
det = 336
Wyniki metody dokładnej:
x1 = -20.8125
x2 = 14.3125
Wyniki metody iteracji prostej:
x1 = -20.811798
x2 = 14.312114
liczba iteracji = 102
C)
12.5x1 + 12x2 = 7
5x1 + 5x2 = 4
det = -2.5
Wyniki metody dokładnej:
x1 = -5.2
x2 = 6
Wyniki metody iteracji prostej:
x1 = -5.199372
x2 = 5.999275
liczba iteracji = 441
D)
3.5x1 + 6x2 = -2
1x1 + 4x2 = 4
det = 8
Wyniki metody dokładnej:
x1 = -4
x2 = 2
Wyniki metody iteracji prostej:
x1 = -3.999693
x2 = 1.999910
liczba iteracji = 22
E)
8.25x1 + 8.1x2 = 6
3.03x1 + 3x2 = 2
det = 0.207
Wyniki metody dokładnej:
x1 = 8.695652
x2 = -8.115941
Wyniki metody iteracji prostej:
x1 = 8.694559
x2 = -8.114737
liczba iteracji = 2118
Wnioski
Wyniki otrzymane metodą iteracji prostej zostały porównane z dokładnymi rozwiązaniami. Różnice
między otrzymanymi wynikami są nie wielkie, co potwierdza skuteczność metody iteracji prostej.
Wyznacznik układu równań decyduje o ilości iteracji. Dla wartości wyznacznika bliskich zeru, liczba
iteracji potrzebnych do uzyskania wyniku jest znacznie większa. W związku z tym wzrasta też czas
potrzebny do wykonania tej operacji. Można zauważyć też znaczny wzrost błędów obliczeń.
Znak przy wyznaczniku nie ma wpływu na ilość iteracji i błędy.
Kod
#include
#include
#include
#define N 2
using namespace std;
void pokaz(double x[N], int k)//funkcja wyświetlająca wyniki
{
int i;
printf("Numer iteracji = %d ", k);
for(i=0; i {
printf("x%d = " , i+1);
printf("%f ", x[i]);
}
printf("\n");
}
double warunek(double x1[N], double x2[N])//funkcja sprawdzajÄ…ca epsilon
{
double epsx=0.0, epsmax=0.0;
int i;
for(i=0; i {
epsx = fabs(x1[i]-x2[i]);
if(epsx>epsmax)
{
epsmax=epsx;
}
}
return epsmax;
}
int main()
{
double a[N][N],b[N],x1[N],x2[N], h[N][N], g[N], eps=0.0, epsx=0.0;
int i=0,j=0,k=0, max=1000000;
//Zadane wartości
eps = 0.0001;
a[0][0] = 8.25;
a[0][1] = 8.10;
a[1][0] = 3.03;
a[1][1] = 3.00;
b[0] = 6.00;
b[1] = 2.00;
//Przekształcanie układu równań
for(i=0; i {
g[i] = (b[i]/a[i][i]);
h[i][i]=0.0;
for(j=0; j {
if(i!=j)
{
h[i][j] = -(a[i][j]/a[i][i]);
}
}
}
//Pierwsze przybliżenie
for(i=0; i {
x1[i] = g[i];
}
pokaz(x1, k);
//Kolejne przybliżenia
do
{
k++;
for(i=0; i {
x2[i] = x1[i];
}
for(i=0; i {
x1[i] = g[i];
for(j=0; j {
if(i!=j)
{
x1[i] += (h[i][j]*x2[j]);
}
}
}
pokaz(x1, k);
epsx = warunek(x1,x2);
}while(keps);
system("PAUSE");
return 0;
}
Wyszukiwarka
Podobne podstrony:
sprawozdanie felixa2
Sprawozdanie Konduktometria
zmiany w sprawozdaniach fin
Errata do sprawozdania
2009 03 BP KGP Niebieska karta sprawozdanie za 2008rid&657
Sprawozdanie nr 3 inz
Sprawozdanie FundacjaBioEdu2007
Sprawozdanie Ćw 2
sprawozdanie 4
sprawozdanie 2009
Sprawozdanie ćw 10 (4)
więcej podobnych podstron