Ministеrul Еducаțiеi, Culturii și Cеrcеtării аl Rеpublicii Mоldоvа
Univеrsitаtеа Tеhnică а Mоldоvеi
Fаcultаtеа Cаlculаtоаrе, Infоrmаtică şi Micrоеlеctrоnică
Dеpаrtаmеntul Ingineria Software și Automatică
RAPORT
Lucrarea de laborator Nr.2
la disciplina Metode și Modele de Calcul 1
VARIANTA 13
A efectuat: [Link]-192
Mereuță Ana
A verificat: Lector Universitar
Anatol Godonoagă
CHIŞINĂU – 2020
Tema: Rezolvarea numerică a sistemelor de ecuații liniare
Scopul lucrării: Să se rezolve sistemul de ecuaţii lineare Ax=b, utilizând:
- Metoda eliminării lui Gauss;
- Metoda lui Cholesky (metoda rădăcinii pătrate);
- Metoda iterativă a lui Jacobi cu o eroare ε=10-3;
- Metoda iterativă a lui Gauss-Seidel cu o eroare ε=10-3 şi ε=10-5.
- Sa se determine numarul de iteratii necesare pentru aproximarea solutiei sistemului cu eroarea data ε. Sa se
compare rezultatele.
Listning-ul Programului:
#include <iostream>
#include <cmath>
#include <conio.h>
using namespace std;
void Cholesky(int lung, float Eps);
void Iacobi(int lung, float Eps);
void Gauss_Seidel(int lung, float Eps);
void Gauss(int lung);
float det(int n, float mat[4][4]);
int EDD(float a[4][4], int lung);
float l[10][10] = { 0 };
float a[4][4] = { 8.7, -1.2, 0.8, 0.7, -1.2, 9.6, -1.2, 0.8, 0.8, -1.2, 8.8,
0.9, 0.7, 0.8, 0.9, 11.3 };
float b[4] = { -2.7, 8.9, 7.2, 6.4 };
int lung = 4;
int main() {
int lung = 4, choice;
system("cls");
cout << "Alegeti o metoda de rezolvare a sistemului\n";
cout << " 1. Gaus\n";
cout << " 2. Jacobi\n";
cout << " 3. Gauss-Seidel\n";
cout << " 0. Nici una";
cout << "\n\n >> ";
cin >> choice;
switch (choice) {
case 1:
system("cls");
cout << "\n\t Metoda lui Gaus\n\n";
Gauss(lung);
system("pause");
main();
break;
case 2:
system("cls");
cout << "\n\t Metoda Jacobi (Eroarea = 0.001)\n";
Iacobi(lung, 0.001);
system("pause");
main();
break;
case 3:
system("cls");
cout << "\n\t Metoda Gauss-Seidel (Eroarea = 0.001)\n";
Gauss_Seidel(lung, 0.001);
cout << "\n\t Metoda Gauss-Seidel (Eroarea = 0.00001)\n";
Gauss_Seidel(lung, 0.00001);
system("pause");
main();
break;
default:
cout << "Wrong option!";
break;
case 0:
exit(0);
}
float det(int n, float mat[4][4]) {
int c, subi, i, j, subj;
float submat[4][4];
int d = 0;
if (n == 2)
{
return((mat[0][0] * mat[1][1]) - (mat[1][0] * mat[0][1]));
}
else
{
for (c = 0; c < n; c++) {
subi = 0;
for (i = 1; i < n; i++) {
subj = 0;
for (j = 0; j < n; j++) {
if (j == c)
{
continue;
}
submat[subi][subj] = mat[i][j];
subj++;
}
subi++;
}
d = d + (pow(-1, c) * mat[0][c] * det(n - 1, submat));
}
}
return d;
}
void Gauss(int lung) {
int l = 0, it = 0;
float t, x[10];
if (EDD(a, lung)) {
if (det(lung, a) != 0) {
while (l < lung) {
for (int i = l + 1; i < lung; i++) {
t = a[i][l] / a[l][l];
for (int j = l; j < lung; j++)
a[i][j] -= t * a[l][j];
b[i] -= t * b[l];
}
l++; it++;
}
for (int i = lung - 1; i >= 0; i--) {
t = 0;
for (int j = lung - 1; j > i; j--)
t += a[i][j] * x[j];
t = b[i] - t;
x[i] = t / a[i][i];
}
cout << "\n\tSolutiille x:\n";
for (int i = 0; i < lung; i++)
cout << "x" << i + 1 << " = " << x[i] << endl;
cout << "\nIteratii = " << it << endl;
for (int i = 0; i < lung; i++) {
for (int j = 0; j < lung; j++) {
cout << a[i][j] << " ";
}
cout << " | " << b[i] << endl;
}
cout << "\nDet = " << det(lung, a) << endl;
}
else { cout << "\nDet = 0" << endl; }
}
else {
cout << "Matricea nu este diagonal dominata\n";
}
}
void Iacobi(int lung, float Eps) {
float t, max;
float* x = new float[lung];
float* x1 = new float[lung];
float** q = new float* [lung];
for (int i = 0; i < lung; i++)
{
q[i] = new float[lung];
}
for (int i = 0; i < lung; i++)
{
for (int j = 0; j < lung; j++)
{
q[i][j] = 0;
}
}
float* d = new float[lung];
int it = 0;
for (int i = 0; i < lung; i++)
for (int j = 0; j < lung; j++)
if (i != j) q[i][j] = -(a[i][j] / a[i][i]);
else q[i][j] = 0;
if (EDD(a, lung)) {
for (int i = 0; i < lung; i++)
d[i] = b[i] / a[i][i];
for (int i = 0; i < lung; i++)
x[i] = d[i];
do {
for (int i = 0; i < lung; i++)
x1[i] = x[i];
for (int i = 0; i < lung; i++) {
t = 0;
for (int j = 0; j < lung; j++)
t += q[i][j] * x1[j]; // Jakobi
x[i] = t + d[i];
}
max = (float)fabs(x[0] - x1[0]);
for (int i = 1; i < lung; i++)
if ((float)fabs(x[i] - x1[i]) > max)
max = (float)fabs(x[i] - x1[i]);
it++;
} while (max > Eps);
cout << "\n\tSolutiille x:\n";
for (int i = 0; i < lung; i++)
cout << "x" << i + 1 << " = " << x[i] << endl;
cout << "\nIteratii = " << it << endl;
}
else {
cout << "Aceasta matricea nu este diagonal dominata\n";
}
}
int EDD(float a[4][4], int lung) {
//Este Dominant diagonala?
float s;
for (int i = 0; i < lung; i++) {
s = 0;
for (int j = 0; j < lung; j++)
if (i != j) s += a[i][j];
if (a[i][i] < s) return 0;
if (a[i][i] == 0) return 0;
}
return 1;
}
void Gauss_Seidel(int lung, float Eps) {
float* x = new float[lung];
float* x1 = new float[lung];
float** q = new float*[lung];
for (int i = 0; i < lung; i++)
{
q[i] = new float[lung];
}
for (int i = 0; i < lung; i++)
{
for (int j = 0; j < lung; j++)
{
q[i][j] = 0;
}
}
float* d = new float[lung];
float t, max;
int it = 0;
for (int i = 0; i < lung; i++)
for (int j = 0; j < lung; j++)
if (i != j) q[i][j] = -(a[i][j] / a[i][i]);
else q[i][j] = 0;
if (EDD(a, lung)) {
for (int i = 0; i < lung; i++)
d[i] = b[i] / a[i][i];
for (int i = 0; i < lung; i++)
x[i] = d[i];
do {
for (int i = 0; i < lung; i++)
x1[i] = x[i];
for (int i = 0; i < lung; i++) {
t = 0;
for (int j = 0; j < lung; j++)
t += q[i][j] * x[j]; // Gauss - Seidel
x[i] = t + d[i];
}
max = (float)fabs(x[0] - x1[0]);
for (int i = 1; i < lung; i++)
if ((float)fabs(x[i] - x1[i]) > max) max = (float)fabs(x[i] -
x1[i]);
it++;
} while (max > Eps);
cout << "\n\tSolutiille x:\n";
for (int i = 0; i < lung; i++)
cout << "x" << i + 1 << " = " << x[i] << endl;
cout << "\nIteratii = " << it << endl;
}
else {
cout << "Aceasta matricea nu este diagonal dominata\n";
}
}
Fig 1. Metoda lui Gauss
Fig 2. Metoda lui Jacobi
Fig 3. Metoda lui Gauss-Seidel