Last active
June 5, 2018 12:48
-
-
Save PiotrWegrzyn/34e36c1ef48deb63a9ea8c96b7604104 to your computer and use it in GitHub Desktop.
Numeryczne rozwiązywanie układu równań liniowych metodą Jacobiego.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <iomanip> | |
#include <cmath> | |
using namespace std; | |
void metoda_Jacobiego(); | |
bool gauss(int, double**, double*); | |
void metoda_eliminacji_gaussa(); | |
int main() | |
{ | |
// metoda_eliminacji_gaussa(); | |
metoda_Jacobiego(); | |
cout << "\n\n"; | |
system("pause"); | |
return 0; | |
} | |
bool gauss(int n, double ** AB, double * X) | |
{ | |
const double eps = 1e-12; // stala przyblizenia zera | |
int i, j, k; | |
double m, s; | |
for (i = 0; i < n - 1; i++) | |
{ | |
for (j = i + 1; j < n; j++) | |
{ | |
if (fabs(AB[i][i]) < eps) return false; | |
m = -AB[j][i] / AB[i][i]; | |
for (k = i + 1; k <= n; k++) | |
AB[j][k] += m * AB[i][k]; | |
} | |
} | |
for (i = n - 1; i >= 0; i--) | |
{ | |
s = AB[i][n]; | |
for (j = n - 1; j >= i + 1; j--) | |
s -= AB[i][j] * X[j]; | |
if (fabs(AB[i][i]) < eps) return false; | |
X[i] = s / AB[i][i]; | |
} | |
return true; | |
} | |
void metoda_eliminacji_gaussa() | |
{ | |
double **AB, *X; | |
int n, i, j; | |
cout << setprecision(4) << fixed; | |
cout << "podajliczbe niewiadomych" << endl; | |
cin >> n; | |
AB = new double *[n]; | |
X = new double[n]; | |
for (i = 0; i < n; i++) | |
AB[i] = new double[n + 1]; | |
cout << "podaj dane dla macierzy" << endl; | |
for (i = 0; i < n; i++) | |
for (j = 0; j <= n; j++) cin >> AB[i][j]; | |
if (gauss(n, AB, X)) | |
{ | |
for (i = 0; i < n; i++) | |
cout << "x" << i + 1 << " = " << setw(9) << X[i] | |
<< endl; | |
} | |
else | |
cout << "DZIELNIK ZERO\n"; | |
for (i = 0; i < n; i++) delete[] AB[i]; | |
delete[] AB; | |
delete[] X; | |
} | |
void metoda_Jacobiego() | |
{ | |
float A[100][100]; | |
float M[100][100]; | |
float N[100][100]; | |
float b[100]; | |
float x1[100]; | |
float x2[100]; | |
int num, iter; | |
/* | |
cout << "Metoda Jacobiego\n" << endl; | |
cout << "Rozwiazywanie ukladu n-rownan z n-niewiadomymi Ax=b\n" << endl; | |
cout << "Podaj n\n" << endl; | |
cin >> num; | |
if ((num < 1) && (num > 100)) | |
{ | |
cout << "Nieprawidlowa warosc parametru n\n" << endl; | |
return; | |
} | |
*/ | |
num = 3; | |
/* | |
for (int i = 0; i<num; i++) | |
for (int j = 0; j<num; j++) | |
{ | |
cout << "A[" << (i + 1) << "][" << (j + 1) << "] = "; | |
cin >> A[i][j]; | |
if ((i == j) && (A[i][j] == 0)) | |
{ | |
cout << "Wartosci na przekatnej musza byc rozne od 0\n"; | |
return; | |
} | |
} | |
cout << endl; | |
for (int i = 0; i<num; i++) | |
{ | |
cout << "b" << (i + 1) << ": "; | |
cin >> b[i]; | |
} | |
*/ | |
A[0][0] = 5; | |
A[0][1] = -2; | |
A[0][2] = 3; | |
A[1][0] = -3; | |
A[1][1] = 9; | |
A[1][2] = 1; | |
A[2][0] = 2; | |
A[2][1] = -1; | |
A[2][2] = -7; | |
b[0] = -1; | |
b[1] = 2; | |
b[2] = 3; | |
for (int i = 0; i < num; i++){ | |
for (int j = 0; j < num; j++){ | |
if(i ==j)N[i][j] = 1 / A[i][i]; | |
else N[i][j] = 0; | |
} | |
} | |
for (int i = 0; i<num; i++) | |
for (int j = 0; j<num; j++) | |
if (i == j) | |
M[i][j] = 0; | |
else | |
M[i][j] = -(A[i][j] * N[i][i]); | |
for (int i = 0; i<num; i++) | |
x1[i] = 0; | |
iter = 5; | |
for (int k = 0; k<iter; k++) | |
{ | |
for (int i = 0; i<num; i++) | |
{ | |
x2[i] = N[i][i] * b[i]; | |
for (int j = 0; j<num; j++) | |
x2[i] += M[i][j] * x1[j]; | |
} | |
for (int i = 0; i<num; i++) | |
x1[i] = x2[i]; | |
for (int i = 0; i<num; i++) | |
cout << "x" << (i + 1) << " = " << setprecision(4) << x1[i] << endl; | |
} | |
cout << endl; | |
cout << "N matrix:" << endl; | |
for (int i = 0; i < num; i++){ | |
for (int j = 0; j < num; j++){ | |
cout << N[i][j] << " "; | |
} | |
cout << endl; | |
} | |
cout << endl; | |
cout << endl; | |
cout << "A matrix:" << endl; | |
for (int i = 0; i < num; i++){ | |
for (int j = 0; j < num; j++){ | |
cout << A[i][j] << " "; | |
} | |
cout << endl; | |
} | |
cout << endl; | |
cout << "M matrix:" << endl; | |
for (int i = 0; i < num; i++){ | |
for (int j = 0; j < num; j++){ | |
cout << M[i][j] << " "; | |
} | |
cout << endl; | |
} | |
cout << endl; | |
for (int i = 0; i<num; i++) | |
cout << "x" << (i + 1) << " = " << setprecision(4) << x1[i] << endl; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment