0% au considerat acest document util (0 voturi)
102 vizualizări9 pagini

Raport: La Disciplina Metode Și Modele de Calcul 1

Documentul prezintă rezolvarea numerică a sistemelor de ecuații liniare utilizând metoda eliminării lui Gauss, metoda lui Cholesky, metoda iterativă a lui Jacobi și metoda iterativă a lui Gauss-Seidel. Sunt comparate rezultatele obținute și numărul de iteratii necesare pentru diferite erori.

Încărcat de

Anya Mr
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
102 vizualizări9 pagini

Raport: La Disciplina Metode Și Modele de Calcul 1

Documentul prezintă rezolvarea numerică a sistemelor de ecuații liniare utilizând metoda eliminării lui Gauss, metoda lui Cholesky, metoda iterativă a lui Jacobi și metoda iterativă a lui Gauss-Seidel. Sunt comparate rezultatele obținute și numărul de iteratii necesare pentru diferite erori.

Încărcat de

Anya Mr
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd

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

S-ar putea să vă placă și