Strona 1 z 1

[C]Problem z Gaussem

: 03 listopada 2007, 15:37
autor: kristof
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

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


A cały mój zwariowany program wygląda następująco

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;
}

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 > :/