Академический Документы
Профессиональный Документы
Культура Документы
U.T.M.
Facultatea CIM
Chişinău 2003
Scopul lucrării:
1) Să se rezolve sistemul de ecuaţii liniare Ax=b,utilizînd
-metoda eliminării Gauss.
-metoda lui Cholesky(metoda rădăcinii pătrate).
-metoda iterativă a lui Jacobi cu o eroare e=0.001.
-metoda iterativă a lui Gauss-Seidel cu o eroare e=0,001 şi c=0,00001.
2) Să se determine numărul de iteraţii necesare pentru aproximarea soluţiei cu
eroarea dată e.Să se compare rezultatele.
3) Să se inverseze matricea A cu ajutorul metodei Jordan-Gauss..
Listingul programului:
#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <iomanip.h>
float deter(float a[10][10], int k);
int Allo(int lung);
int simetric(int lung);
void factor(int lung);
void trans(int lung);
void determinare(int lung);
void Choleschi(int lung);
void Iacobi(int lung);
void Gauss_Seidel(int lung);
int DiagDom(float a[10][10], int lung);
void Jordan_Gauss(int lung);
void Gauss(int lung);
float l[10][10]={0};
float a[10][10],b[10];
int lung;
void main(void)
{ clrscr();
int lung,p;
cout<<"Metodele:"<<endl;
cout<<" 1< Gaus"<<endl;
cout<<" 2< Choleschi "<<endl;
cout<<" 3< Iacobi"<<endl;
cout<<" 4< Gauss_Seidel"<<endl;
cout<<" 5< Jordan_Gauss"<<endl;
cout<<"Introdu num:";cin>>p;
clrscr();
cout<<"Numarul liniilor: ";
cin>>lung;
cout<<"Introdu tabloul A:\n";
for(int i=0;i<lung;i++)
for(int j=0;j<lung;j++)
cin>>a[i][j];
switch(p){
case 1:cout<<"Tabloul b:\n";
for(i=0;i<lung;i++)
cin>>b[i];
Gauss(lung);break;
case 2:cout<<"Tabloul b:\n";
for(i=0;i<lung;i++)
cin>>b[i];
Choleschi(lung);
break;
case 3:Iacobi(lung);break;
case 4:Gauss_Seidel(lung);break;
case 5:Jordan_Gauss(lung);break;
}
getche();
}
//------------------------------------------
void Choleschi(int lung)
{ if(!Allo(lung))
{cout<<"\nAceasta matricea nu este pozitiv definita!\n";
goto E; }
if(!simetric(lung))
{cout<<"\nAceasta matricea nu este simetrica !\n";
goto E; }
determinare(lung);
getche();
E:
}
//------------------------------------------
float deter(float a[10][10],int k)
{
if( k==1) return a[0][0];
if( k==2) return a[0][0]*a[1][1]-a[0][1]*a[1][0];
float s=0;
float t[10][10]={0};
for(int i=0;i<k;i++)
{
int x=0;
for(int l=0;l<k;l++)
{ if(l!=i)
{
for(int m=1;m<k;m++)
t[x][m-1]=a[l][m];\
x++; }
}
if(i%2==0) s+=a[i][0]*deter(t,k-1);
else s-=a[i][0]*deter(t,k-1);
}
return s;
}
//------------------------------------------
int Allo(int lung)
{ for(int i=0;i<lung;i++)
if(a[i][i]<=0||deter(a,i+1)<=0) return 0;
return 1;
}
//------------------------------------------
int simetric(int lung)
{
for(int i=0;i<lung;i++)
for(int j=0;j<lung;j++)
if(a[i][j]!=a[j][i]) return 0;
return 1;
}
//------------------------------------------
void factor(int lung)
{
l[0][0]=(float)sqrt(a[0][0]);
for( int i=0;i<lung;i++)
l[i][0]=a[i][0]/l[0][0];
for(i=1;i<lung;i++)
{
float t=0;
for(int j=0;j<i;j++)
t+=l[i][j]*l[i][j];
l[i][i]=(float)sqrt(a[i][i]-t);
for(j=i;j<lung;j++)
{
float t1=0;
for(int k=0;k<i;k++)
t1 += l[j][k] * l[i][k];
l[j][i]=(a[j][i]-t1)/l[i][i];}
}
}
//------------------------------------------
void trans(int lung)
{
float t=0;
for( int i=0;i<lung;i++)
for(int j=0;j<i;j++)
{ t=l[i][j];
l[i][j]=l[j][i];
l[j][i]=t;
}
}
//------------------------------------------
void determinare(int lung)
{
factor(lung);
float y[10],x[10];
y[0]=b[0]/l[0][0];
for(int i=0;i<lung;i++)
{ float t=0;
for(int j=0;j<i;j++)
t+=l[i][j]*y[j];
y[i]=(b[i]-t)/l[i][i];}
trans(lung);
x[lung-1]=y[lung-1]/l[lung-1][lung-1];
float t;
for(i=lung-2;i>=0;i--)
{
t=0;
for(int j=i+1;j<lung;j++)
t+=l[i][j]*x[j];
x[i]=(y[i]-t)/l[i][i];}
for(i=0;i<lung;i++)
cout<<" x"<<i+1<<" = "<<x[i]<<'\n';
}
//-------------------------------------
void Iacobi(int lung)
{
float x[10],x1[10],q[10][10]={0},d[10],t,max;
int ni = 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( !DiagDom(a,lung) )
{ cout<<"Aceasta matricea nu este diagonal dominata\n";
goto E; }
cout<<"Vector b:\n";
for( i=0; i<lung; i++) {
cin>>t;
d[i] = t / a[i][i]; }
cout<<"Eroare:\n";
float Eps;
cin>>Eps;
for( i=0; i<lung; i++)
x[i] = d[i];
do{
for( i=0; i<lung; i++)
x1[i] = x[i];
for( 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( i=1; i<lung; i++)
if( (float)fabs(x[i] - x1[i]) > max ) max = (float)fabs(x[i]-x1[i]);
ni ++; }
while( max > Eps);
for( i =0; i<lung; i++)
cout<<"x"<<i+1<<" = "<<x[i]<<endl;
cout<<"\nNumarul iteratiilor = "<<ni<<endl;
getche(); E:
}
//-------------------------------------
int DiagDom(float a[10][10], int lung)
{
float s;
for( int i=0; i<lung; i++)
{ s = 0;
if( i != j ) s += a[i][j];
return 1;
}
//-----------------------------
void Gauss_Seidel(int lung)
{
float x[10],x1[10],q[10][10]={0},d[10],t,max;
int ni = 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( !DiagDom(a,lung) )
{ cout<<"Aceasta matricea nu este diagonal dominata\n";
goto E; }
cout<<"Vector b:\n";
for( i=0; i<lung; i++) {
cin>>t;
d[i] = t / a[i][i]; }
cout<<"Eroare:\n";
float Eps;
cin>>Eps;
for( i=0; i<lung; i++)
x[i] = d[i];
do{
for( i=0; i<lung; i++)
x1[i] = x[i];
for( 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( i=1; i<lung; i++)
if( (float)fabs(x[i] - x1[i]) > max ) max = (float)fabs(x[i]-x1[i]);
ni ++; }
while( max > Eps);
for( i =0; i<lung; i++)
cout<<"x"<<i+1<<" = "<<x[i]<<endl;
cout<<"\nNumarul iteratiilor = "<<ni<<endl;
getche(); E:
}
//---------------------------------
void Jordan_Gauss(int lung)
{
float ai[10][10];
int i,j,k;
float x,y;
for( i=0; i<lung; i++)
for( j=0; j<lung; j++)
if( i != j ) ai[i][j] = 0;
else ai[i][j] = 1;
for( k=0; k<lung; k++)
{
x = a[k][k];
for( i=0; i<lung; i++)
{
y = a[i][k];
if( i != k )
for( j=0; j<lung; j++)
{
ai[i][j] = ai[i][j] - y * ai[k][j] / x;
a[i][j] = a[i][j] - y * a[k][j] / x;
}
}
for( j=0; j<lung; j++)
{
ai[k][j] = ai[k][j] / x;
a[k][j] = a[k][j] / x;
}
}
cout<<"Matricea inversa:\n";
for( i=0; i<lung; i++)
{
for( j=0; j<lung; j++)
cout<<ai[i][j]<<" ";
cout<<endl;
}
}
//------------------------------------------
void Gauss(int lung)
{
int l,j,i,m,k, rez=0;
double temp, t;
for (l = 0; l < lung; l++)
{ m = l+1; j = l;
for (i = l+1; i < lung; i++)
if ( fabs(a[i][l]) > fabs(a[j][l]) ) j=i;
if (!a[j][l]) {
rez=1;
break;
}
if (j != l)
{
for (k = l; k < lung; k++)
{
temp = a[l][k];
a[l][k] = a[j][k];
a[j][k] = temp;
}
temp = b[l];
b[l] = b[j];
b[j] = temp;
}
i = l+1;
if (a[l+1][l])
do
{
t = a[i][l] / a[l][l];
b[i] -= t * b[l];
for (k = 0; k < lung; k++) a[i][k] -= t * a[l][k];
i++;
}
while (i<lung);
}
l--;
if (!rez)
do {
b[l] /= a[l][l];
m = l--;
for(i = 0; i <= l; i++) b[i] -= a[i][m] * b[m];
}
while (l >= 0);
if (!rez)
{
cout <<endl<< "Resultatul este:" << endl;
for(i = 0; i < lung; i++) cout<<"x["<<i<<"]="<<b[i]<<endl;
cout << endl;
}
else cout <<endl<< "Determinantul matricei este nul! ";
}
Rezultatele obţinute:
x0 x1 x2 x3
1.02603 0.784755 -1.579674 0.679054
x0 x1 x2 x3
1.02603 0.784755 -1.579674 0.679054
x0 x1 x2 x3
1.025822 0.78463 -1.579525 0.67921
Numarul de iteratii 4
.Eroarea 0.001
x0 x1 x2 x3
1.026023 0.784753 -1.579673 0.679055
Numarul de iteratii 4.Eroarea 0.001