3 Commits

Author SHA1 Message Date
20e98a1105 SolveFuction_gauss_jacobi_working 2020-03-10 19:51:15 +01:00
8bd26b9a9c jacobi and gauss solve function working 2020-03-10 19:43:16 +01:00
077a54af18 More basic structure for solve 2020-02-24 15:20:02 +01:00

75
main.c
View File

@@ -51,7 +51,7 @@ int main(int argc, char* argv[]) {
strncpy(filePath, argv[1], MAX_FILE_PATH_LENGTH); strncpy(filePath, argv[1], MAX_FILE_PATH_LENGTH);
} else { } else {
puts("Please enter the path of the file you'd like to open"); puts("Please enter the path of the file you'd like to open");
int result = scanf("%" STR(MAX_FILE_PATH_LENGTH) "[^\n]", filePath); int result = scanf("%s" STR(MAX_FILE_PATH_LENGTH) "[^\n]", filePath);
if(result == EOF || result == 0 || filePath[0] == 0) { if(result == EOF || result == 0 || filePath[0] == 0) {
return 0; return 0;
} }
@@ -78,7 +78,7 @@ int main(int argc, char* argv[]) {
//printVector(b); //printVector(b);
//puts("Vector x:"); //puts("Vector x:");
//printVector(x); //printVector(x);
puts("Please enter the algorithm to use:\n\t0: Jacobi (default)\n\t1: Gauss-Seidel"); puts("Please enter the algorithm to use:\n\t0: Jacobi (default)\n\t1: Gauss-Seidel");
int algorithm; int algorithm;
@@ -212,7 +212,7 @@ bool load(const char* filename, Matrix* matrix, Vector* b, Vector* x) {
// initialize vector x with zeros // initialize vector x with zeros
memset(x->data, 0, cols * sizeof(double)); memset(x->data, 0, cols * sizeof(double));
} }
} }
success: success:
@@ -234,7 +234,7 @@ int readMatrixLine(FILE* file, double* matrixLine, int maxCols) {
if(fscanf(file, "%lf", &buffer) != 1) { if(fscanf(file, "%lf", &buffer) != 1) {
return -1; return -1;
} }
matrixLine[col] = buffer; matrixLine[col] = buffer;
col++; col++;
@@ -253,7 +253,66 @@ void flushStdin(void) {
} }
Vector* solve(Method method, Matrix* A, Vector* b, Vector* x, double e) { Vector* solve(Method method, Matrix* A, Vector* b, Vector* x, double e) {
Vector* vectors = malloc(sizeof(Vector) * (MAX_ITERATION_STEPS + 1)); Vector* vectors = malloc(sizeof(Vector) * (MAX_ITERATION_STEPS + 1));
initVector(&vectors[0], b->n);
memcpy(vectors[0].data, x->data, b->n * sizeof(double));
int vectorCount = 1;
double temp;
double delta = 0.0;
if (method == 0){
do {
delta= 0.0;
initVector(&vectors[vectorCount],b->n);
for(int i=0; i<b->n; i++){
temp=0.0;
for(int j=0; j<b->n; j++){
if(j!=i){
temp= temp+A->data[i][j]*vectors[vectorCount-1].data[j];
}
}
vectors[vectorCount].data[i]=(b->data[i]-temp)/A->data[i][i];
delta=fmax(fabs(vectors[vectorCount].data[i]-vectors[vectorCount-1].data[i]),delta);
}
printVector(&vectors[vectorCount]);
vectorCount++;
} while (delta > e && vectorCount < MAX_ITERATION_STEPS);
}
if (method ==1){
do{
delta = 0.0;
if (vectorCount==1){
initVector(&vectors[vectorCount], b->n);
memcpy(vectors[vectorCount].data, x->data, b->n * sizeof(double));}
else {
initVector(&vectors[vectorCount], b->n);
memcpy(vectors[vectorCount].data, vectors[vectorCount-1].data, b->n * sizeof(double));}
for (int i = 0; i<b->n; i++){
temp=0.0;
for (int j=0; j<b->n; j++){
if (j!=i){
temp = temp + A->data[i][j]*vectors[vectorCount].data[j];
}
}
vectors[vectorCount].data[i] = (b->data[i]-temp)/A->data[i][i];
delta=fmax(fabs(vectors[vectorCount].data[i]-vectors[vectorCount-1].data[i]),delta);
}
printVector(&vectors[vectorCount]);
vectorCount++;
}while(delta > e && vectorCount < MAX_ITERATION_STEPS);
}
// MAX_ITERATION_STEPS enthält die maximal zulässige Anzahl an Iterationsschritten (100) // MAX_ITERATION_STEPS enthält die maximal zulässige Anzahl an Iterationsschritten (100)
// Die einzelnen Vektoren müssen noch mit initVector initialisiert werden // Die einzelnen Vektoren müssen noch mit initVector initialisiert werden
@@ -263,11 +322,9 @@ Vector* solve(Method method, Matrix* A, Vector* b, Vector* x, double e) {
// on success // on success
// Sei x die Anzahl der durchgeführten Iterationschritte. Dann setzt vectors[x+1].n = 0. Damit weiß das folgende Programm wie viele Schritte getätigt wurden. // Sei x die Anzahl der durchgeführten Iterationschritte. Dann setzt vectors[x+1].n = 0. Damit weiß das folgende Programm wie viele Schritte getätigt wurden.
return vectors; vectors[vectorCount].n=0;
// on failure return vectors;
free(vectors);
return NULL;
} }
inline Matrix* createMatrix(void) { inline Matrix* createMatrix(void) {