[C]Problem z Gaussem
: 03 listopada 2007, 15:37
Mam problem ze znalezieniem błędu tzn dla 2 zestawów równań program liczy mi wsio poprawnie tzn do pewnego błędu a do kolejnych dwóch liczy sobie jakieś bzdury nie wiem co schrzaniłem i gdzie
tak dla zestawu wyglądającego następująco program liczy wsio poprawnie:
3.33x_1 + 15920x_2 - 10.333x_3 = 15913
2.22x_1 + 16.71x_2 + 9.612x_3 = 28.544
1.5611x_1 + 5.1791x_2 + 1.6852x_3 = 8.4254
Tutaj wyniki mają być równe x_1=x_2=x_3=1 i tak mi też liczy..
natomiast dla kolejnego zestawu z danymi
0.25x_1 + 0.2x_2 + 0.16666666666667x_3 = 9.0
0.33333333333333x_1 + 0.25x_2 + 0.2x_3 = 8.0
0.5x_1 + 1.0x_2 + 2.0x_3 = 8.0
Wyniki mają wyjśc następujące x_1= -227.08 x_2 = 476.9 x_3 = -177.7
Natomiast u mnie wychodzi ich brak ze względu na to że przy tworzeniu macierzy trójkątnej wywala mi brak wartości przy ostatnim wierszu
A cały mój zwariowany program wygląda następująco
Ja już nad tym dziwnym błędem siedzie od dobrych 2 dni i nie potrafię go rozgryźć .. jeśli ktoś jest w stanie mi pomóc będę mu dozgonnie wdzięczny
pozdrawiam
krzysztof
EDIT -> 15min później
Pitalnołem się aż w jednym znaczku.. ale udało mi się to w końcu znaleźć jednak jeśli ktoś ma jakieś sugestie jak ten kod uprościć i zrobić bardziej przejrzystym to chętnie skorzystam z sugestii )
podrawiam
P.S. Ale ze mnie matął postawic < zamiast > :/
tak dla zestawu wyglądającego następująco program liczy wsio poprawnie:
3.33x_1 + 15920x_2 - 10.333x_3 = 15913
2.22x_1 + 16.71x_2 + 9.612x_3 = 28.544
1.5611x_1 + 5.1791x_2 + 1.6852x_3 = 8.4254
Tutaj wyniki mają być równe x_1=x_2=x_3=1 i tak mi też liczy..
natomiast dla kolejnego zestawu z danymi
0.25x_1 + 0.2x_2 + 0.16666666666667x_3 = 9.0
0.33333333333333x_1 + 0.25x_2 + 0.2x_3 = 8.0
0.5x_1 + 1.0x_2 + 2.0x_3 = 8.0
Wyniki mają wyjśc następujące x_1= -227.08 x_2 = 476.9 x_3 = -177.7
Natomiast u mnie wychodzi ich brak ze względu na to że przy tworzeniu macierzy trójkątnej wywala mi brak wartości przy ostatnim wierszu
Kod: Zaznacz cały
Zera pod jedynka wiodaca 2:
1.00000000000000 2.00000000000000 4.00000000000000 16.00000000000000
0.00000000000000 1.00000000000000 2.72000000000001 -6.40000000000023
0.00000000000000 0.00000000000000 nan nan
rozwiazanie
x0 = nan
x1 = nan
x2 = nan
Kod: Zaznacz cały
#include <stdio.h>
#include <math.h>
int main(void)
{
int i,j,k,n; /* dla pętli*/
double suma,wart,wartosc;
int Kol,Wier; /* Dla Macierzy */
double A[10][10], C[10][10], x[10];
FILE *f;
f=fopen("Zestaw_1.dat","r");
if(f==NULL)
{
puts("Brak poszukiwanego Pliku!");
return 1;
}
fscanf( f," %d " , &Wier );
for(i=0;i<Wier;i++)
{
for(j=0;j<(Wier+1);j++) /* Tyczy się kolumn Kol=Wier+1*/
{
fscanf( f," %lf ", &A[i][j] );
}
}
fclose(f);
for( i=0;i<Wier;i++ )/*Wypisywanie Macierzy*/
{
for(j=0;j<(Wier+1);j++)/* Tyczy się kolumn Kol=Wier+1*/
{
printf("%.14f ",A[i][j]);
}
printf("\n");
}
printf("\n");
//Zabawa macierzami czyli wszystkie operacje na nich
for(i=0;i<Wier;i++)
{
wartosc=0.0;
n=i;
for(k=i;k<Wier;k++)
{
for(j=i;j<Wier+1;j++)
{
C[k][j]=A[k][j];
}
}
for(k=i;k<Wier;k++)
{
//Wybór elementu wiodącego/głównego(maxymalna wartość w kolumnie)fabs->wartość bezwględna
if(fabs(wartosc)<fabs(A[k][i]))
{
wartosc=A[k][i];
n=k;
}
if(wartosc==0)
{
wartosc=A[k][i];
printf("Nie da się rozwiązać/n");
}
}
//Sortowanie wierszy
for(j=i;j<Wier+1;j++)
{
C[i][j]=A[n][j];
C[n][j]=A[i][j];
}
printf("macierz z zamienionymi wierszami %d:\n",i);
for(k=0;k<Wier;++k)
{
for(j=0;j<Wier+1;++j)
printf(" %.14lf ",C[k][j]);
printf("\n");
}
printf("\n");
//Tworzenie jedynki wiodacej w wierszy
for(j=i;j<Wier+1;j++)
A[i][j]=C[i][j]/C[i][i];
for(k=i+1;k<Wier;k++)
for(j=0;j<Wier+1;j++)
C[k][j]=A[k][j];
printf("macierz z jedynka wiodaca wiersza %d:\n",i);
for(k=0;k<Wier;++k)
{
for(j=0;j<Wier+1;++j)
{
printf(" %.14lf ",C[k][j]);
}
printf("\n");
}
printf("\n");
//zera pod jedynka dla kazdej kolumny
for(k=i+1;k<Wier;k++)
for(j=i;j<Wier+1;j++)
A[k][j]=A[i][j]*C[k][i]-C[k][j];
printf("Zera pod jedynka wiodaca %d:\n",i);
for(k=0;k<Wier;++k)
{
for(j=0;j<Wier+1;++j)
printf(" %.14lf ",A[k][j]);
printf("\n");
}
printf("\n");
for(k=0;k<Wier;k++)
for(j=0;j<Wier+1;j++)
C[k][j]=A[k][j];
}
/*WYPISANIE ROZWIAZAÑ */
printf("rozwiazanie\n");
for (i=Wier-1; i>=0; i--) /* Obliczenie rozwiazan */
{
suma = 0.0;
for (j=Wier-1; j>=i+1; j--)
{
suma = suma + C[i][j]*A[j][Wier];
}
A[i][Wier] = (A[i][Wier]-suma)/C[i][i];
}
for (i=0; i<Wier; i++)
printf("x%d = %.14f\n",i,A[i][Wier]);
return 0;
}
pozdrawiam
krzysztof
EDIT -> 15min później
Pitalnołem się aż w jednym znaczku.. ale udało mi się to w końcu znaleźć jednak jeśli ktoś ma jakieś sugestie jak ten kod uprościć i zrobić bardziej przejrzystym to chętnie skorzystam z sugestii )
podrawiam
P.S. Ale ze mnie matął postawic < zamiast > :/