diff --git a/lista3/ci164-Exercicios-03.pdf b/lista3/ci164-Exercicios-03.pdf new file mode 100644 index 0000000000000000000000000000000000000000..19379191e4bd0ffb82e2c18b6934d2bd4e47cd02 Binary files /dev/null and b/lista3/ci164-Exercicios-03.pdf differ diff --git a/lista3/ex4.c b/lista3/ex4.c new file mode 100644 index 0000000000000000000000000000000000000000..b3c25811a8a9d1d4e6b167cc23707b0d6370c733 --- /dev/null +++ b/lista3/ex4.c @@ -0,0 +1,107 @@ +#include <stdio.h> +#include <stdlib.h> + +void eliminaGauss(double **a, int n, double *b) { + for(int k=0; k < n; ++k) { + for(int i = k+1; i < n; ++i) { + double m = a[i][k]/a[k][k]; + a[i][k] = 0.0f; + for(int j=k+1; j < n; ++j) { + a[i][j] -= a[k][j] * m; + } + b[i] -= b[k] * m; + } + } +} + +void eliminaGaussPivo(double **a, int n, double *b) { + for(int k=0; k < n; ++k) { + int max = k; + for(int i = k+1; i < n; ++i) { + max = (a[i][k] > a[max][k]) ? i : max; + } + if(max != k) trocaLinha(a, n, b, max, k); + for(int i = k+1; i < n; ++i) { + double m = a[i][k]/a[k][k]; + a[i][k] = 0.0f; + for(int j=k+1; j < n; ++j) { + a[i][j] -= a[k][j] * m; + } + b[i] -= b[k] * m; + } + } +} + +void trocaLinha(double **a, int n, double *b, int l1, int l2) { + double temp; + temp = b[l2]; + b[l2] = b[l1]; + b[l1] = temp; + for(int i = 0; i < n; ++i) { + temp = a[l1][i]; + a[l1][i] = a[l2][i]; + a[l2][i] = temp; + } +} + +void retro(double **a, int n, double *b, double *x) { + x[n-1] = b[n-1]/a[n-1][n-1]; + for(int i = n-2; i >= 0; --i) { + double soma=0.0f; + for(int j = n-1; j > i; --j) { + soma += a[i][j]*x[j]; + } + x[i] = (b[i] - soma)/a[i][i]; + } + +} + +int main() { + double **a, **A, *b, *B, *x; + int n; + + printf("Ordem da matriz: \n"); + scanf("%d", &n); + + a = malloc(n*sizeof(double*)); + A = malloc(n*sizeof(double*)); + b = malloc(n*sizeof(double)); + B = malloc(n*sizeof(double)); + x = malloc(n*sizeof(double)); + for(int i=0; i < n; ++i) { + a[i] = malloc(n*sizeof(double)); + A[i] = malloc(n*sizeof(double)); + } + + for(int i=0; i < n; ++i) { + for(int j=0; j < n; ++j) { + printf("(%d, %d)\t", i, j); + scanf("%lf", &a[i][j]); + A[i][j] = a[i][j]; + } + } + + printf("B\n"); + for(int i=0; i < n; ++i) { + printf("b[%d]", i); + scanf("%lf", &b[i]); + B[i] = b[i]; + } + + eliminaGauss(a, n, b); + retro(a, n, b, x); + printf("Resposta: \n"); + for(int i = 0; i < n; ++i) { + printf("%.4lf\n", x[i]); + } + + eliminaGaussPivo(A, n, B); + retro(A, n, B, x); + printf("Pivo: \n"); + for(int i = 0; i < n; ++i) { + printf("%.4lf\n", x[i]); + } + + return 0; +} +