Piotr Filek gr I
Michał Gil gr 1
METODY NUMERYCZNE
SPRAWOZDANIE NR 3
W sprawozdaniu wykorzystana została metoda dokładnego rozwiązywania układów równań Thomasa dla układów trójprzekątnych.
Algorytm rozwiązywania trójdiagonalnego układu równań o n niewiadomych metodą Thomasa wygląda następująco:
Lista zmiennych: całkowite : n, i
tablice: a[1..n], b[1..n], c[1..n], d[1..n],
x[1..n], β[1..n], γ[1..n]
Podaj n
Dla i := 1, 2, …, n
Podaj ai, bi, ci, di
Oblicz β1 =
Oblicz γ1 =
Dla i := 2, 3, …, n
Oblicz βi =
Oblicz γi =
Podstaw xn = γn
Dla := n - 1, n - 2, …, 1
Oblicz xi :=
Dla i := 1, 2, …, n
Drukuj xi
Implementacja w języku C++ wygląda następująco:
#include <iostream>
#include <stdlib.h>
void oblicz_thomas()
{
int n;
const char * ABCD = "abcd";
double **abcd, *x, *Beta, *Gamma;
cout << "Podaj n: ";
cin >> n;
abcd = new double[4];
for (int i = 0; i <= 3; ++i)
abcd[i] = new double[n];
for (int i=0; i <= 3; ++i)
{
for (int j = 1; j <= n; ++j)
{
cout << "Podaj: " << ABCD[i] << " [" << j << "]";
cin >> abcd[i][j-1];
}
}
Beta = new double[n];
Gamma = new double[n];
Beta[0] = -(abcd[2][0] / abcd[1][0]);
Gamma[0] = (abcd[3][0] / abcd[1][0]);
for (int i = 2; i <= n; ++i)
{
Beta[i-1] = -(abcd[2][i-1] / (abcd[0][i-1] * Beta[i-2] + abcd[1][i-1]));
Gamma[i-1] = (abcd[3][i-1] - abcd[0][i-1] * Gamma[i-2]) / (abcd[0][i-1] * Beta[i-2] + abcd[1][i-1]);
}
x = new double[n];
x[n-1] = Gamma[n-1];
for (int i = n-1; i >=1; --i)
x[i-1] = Beta[i-1]*x[i]+Gamma[i-1];
for (int i = 1; i <= n; ++i)
cout << "i[" << i << "] rowne: " << x[i-1] << endl;
system(„pause”);
for (int i = 0; i <= 3; i++)
delete [] abcd[i];
delete [] abcd;
delete [] x;
delete [] Beta;
delete [] Gamma;
}
Wnioski
Algorytm Thomasa ma duże znaczenie w praktyce inżynieryjskiej, gdyż wiele zadań z dziedziny numerycznego modelowania procesów fizycznych sprowadza się do rozwiązania układów równań.
Zaimplementowany program oblicza układ równań z n-niewiadomymi prawidłowo.