inline Matrix * fmsolve (const Matrix *m1, const Matrix *m2) { LUDecomposition lud; Matrix *result; lud = makeLUD(m1); result = solveLU(lud, m2); freeLUD(lud); return result; }
void runMyProgram(int N, FILE *output1, FILE *output2){ double A[3*N]; double X[N]; generateTridag(N, A); generateX(N, X); fprintf(output1, "%i, ", N); fprintf(output2, "%i, ", N); GSLRunMyProgram(N, A, X, output1); double L[3*N]; double U[3*N]; zeroTridag(N, L); zeroTridag(N, U); clock_t startTime = clock(); decompose(N, A, L, U); solveLU(N, L, U, X); fprintf(output2, "%f\n", 1000*(double)(clock()-startTime)/(double)(CLOCKS_PER_SEC)); // printX(N, X); }
int main() { int n = 0; char filename[256]; double** matrixA; clock_t time; double* vectorB; n = read_dimension(); printf("Dimensio n=%d\n", n); printf("Arxiu matriu A? (buit per matriu random) "); fgets(filename, 255, stdin); if (filename[0] != '\n') { if (filename[strlen(filename) - 1] == '\n') { filename[strlen(filename) - 1] = '\0'; } printf("\nMatriu de l'arxiu %s\n", filename); matrixA = read_matrix(filename, n); } else { printf("\nMatriu random\n"); matrixA = generate_random_matrix(n); } printf("Arxiu vector b? (buit per vector random) "); fgets(filename, 255, stdin); if (filename[0] != '\n') { if (filename[strlen(filename) - 1] == '\n') { filename[strlen(filename) - 1] = '\0'; } printf("\nVector de l'arxiu %s\n", filename); vectorB = read_vector(filename, n); } else { printf("\n Vector random\n"); vectorB = generate_random_vector(n); } printf("Començant calcul LUx = b...\n"); time = clock(); /*******/ solveLU(n, matrixA, vectorB); /*******/ time = clock() - time; printf("Calcul finalitzat.\n"); printf("S'escriura el vector X a l'arxiu output2.txt\n"); write_vector("output2.txt", vectorB, n); printf("n = %d, t = %.6f, t/n = %.6f\n", n, ((float)time)/CLOCKS_PER_SEC, (((float)time) / CLOCKS_PER_SEC)/n ); free_matrix(matrixA, n); free(vectorB); return 0; }
int main() { double ct_a = 16640030.0 / 1.e6; int n = 6; int i = 0; int j = 0; double** matrix = (double**)malloc(sizeof(double*) * n); double* vectorX = (double*)malloc(sizeof(double) * n); int* p = (int*)malloc(sizeof(int) * n); double det; assert(matrix != NULL); assert(vectorX != NULL); assert(p != NULL); printf("a = %lf\n", ct_a); for (i = 0; i < n; i++) { matrix[i] = (double*)malloc(sizeof(double) * n); assert(matrix[i] != NULL); for (j = 0; j < n; j++) { if (i == j) { matrix[i][j] = ct_a; } else if (i == j + 1 || i + 1 == j) { matrix[i][j] = ct_a + (i < j ? i : j); } else if (i == j + 2 || i + 2 == j) { matrix[i][j] = ct_a - (i < j ? i : j); } else { matrix[i][j] = 0; } } } for (i = 0; i < n; i++) vectorX[i] = 100; for (i = 0; i < n; i++) p[i] = i; print_matrix(matrix, n); det = lupp(n, matrix, p); print_matrix(matrix, n); printf("detA = %+.4e\n", det); printf("\nVECTOR P\n"); for (i = 0; i < n; i++) { printf("%d -> %d\n", i, p[i]); } solveLU(n, matrix, vectorX); printf("\nSOLUCIO Ax=b:\n"); for (i = 0; i < n; i++) { printf("%+.3e\n", vectorX[i]); } solveLU(n, matrix, vectorX); printf("\nSOLUCIO AAy=b:\n"); for (i = 0; i < n; i++) { printf("%+.3e\n", vectorX[i]); } free(vectorX); free(p); for (i = 0; i < n; i++) { free(matrix[i]); } free(matrix); return 0; }
/// Resolution by LU decomposition with pivot. bool solveLU(const matrix<flnum>& A, const vector<flnum>& B, vector<flnum>& X) { X = B; return solveLU(A, X); }