Skip to content

Instantly share code, notes, and snippets.

@PiotrWegrzyn
Last active June 5, 2018 12:48
Show Gist options
  • Save PiotrWegrzyn/34e36c1ef48deb63a9ea8c96b7604104 to your computer and use it in GitHub Desktop.
Save PiotrWegrzyn/34e36c1ef48deb63a9ea8c96b7604104 to your computer and use it in GitHub Desktop.
Numeryczne rozwiązywanie układu równań liniowych metodą Jacobiego.
#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