Witam wszystkich.
Poniżej jest algorytm rozwiązywania układu równań liniowych metodą eliminacji Gaaussa:
Lista zmiennych:
Calkowite: n,i,p,j
Tablice: a[1..n, 1..n+1], x[1..n]
Podaj n
Dla i=1,2,...,n
{
Dla j=1,2,...,n+1
{
Podaj a[i][j]
}
}
Dla p=1,2,...,n
{
Dla i=p+1,p+2,...,n
{
Dla j=p+1,p+2,...,n+1 //realizacja układu trójkątnego
{
a[i][j]=a[i][j]-a[i][p]/a[p][p]*a[p][j]
}
}
}
x[n]=a[n][n+1]/a[n][n]
Dla i=n-1,n-2,...,1
{
w=0;
Dla p=i+1,1+2,...,1
{
w=w+a[i][p]*x[p]
}
}
x[i]=a[i][n+1]-w/a[i][i]
Dla i==1,2,...,n
{
Drukuj x[i]
}
Napisany przeze mnie program w C++ wygląda tak:
int main(int argc, char *argv[])
{
int n,i,p,j;
double m,w;
/*cout<<"Podaj n: "<<endl;
cin>>n;*/
n=3;
double a[3][4];
double x[3];
a[0][0]=4;
a[0][1]=2;
a[0][2]=-1;
a[0][3]=7;
a[1][0]=2;
a[1][1]=2;
a[1][2]=1;
a[1][3]=9;
a[2][0]=1;
a[2][1]=-1;
a[2][2]=1;
a[2][3]=4;
/*for(i=0;i<n;i++)
{
for(j=0;j<=n;j++)
{
cout<<"Podaj a["<<i<<"]["<<j<<"]"<<endl;
cin>>a[i][j];
}
}*/
for (p=0;p<n;p++)
{
for(i=p+1;i<n;i++)
{
for(j=p+1;j<=n;j++)
{
m=(a[i][p]/a[p][p]);
a[i][j]=a[i][j]-a[p][j]*m;
cout<<"a["<<i<<"]["<<j<<"]="<<a[i][j]<<endl;
}
}
}
x[n-1]=a[n-1][n]/a[n-1][n-1];
for (i=n-2;i>=0;i--)
{
w=0;
for(p=i+1;p<n;p++)
{
cout<<"i="<<i<<endl;
cout<<"p="<<p<<endl;
w=w+a[i][p]*x[p];
cout<<"w="<<w<<endl<<endl;
}
x[i]=a[i][n]-w/a[i][i];
}
for(i=0;i<n;i++)
{
cout<<"x"<<i+1<<"="<<x[i]<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
Jednak daje nieprawidłowy wynik przy x[0], wynik powinien wynosić 5.75. wydaaj mi się że petla wwykonnuje o jeden obrót za dużo? . Proszę pomóżcie coś bo męcze się z tym już tydzień.
// chyba zacina Ci się literka "a" - Ł