diff --git a/utils/matrix.c b/utils/matrix.c deleted file mode 100644 index e23d062506849a04525c41deb6e9168ab0c67613..0000000000000000000000000000000000000000 --- a/utils/matrix.c +++ /dev/null @@ -1,117 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#include "matrix.h" - -/* Cria com calloc() matriz 'n x m' */ -double **criaMatriz (int n, int m) -{ - double **C; - int i, j; - - C = (double **) calloc(n,sizeof(double *)); - C[0] = (double *) calloc(n*m,sizeof(double)); - for (i=1; i < n; ++i) - C[i] = C[i-1] + m; - - return C; -} - -/* Retorna ponteiro para matriz inversa de matriz 'A'. - Matriz inversa é alocada com 'criaMatriz()' -*/ -// Adaptação de https://www.programming-techniques.com/2011/09/numerical-methods-inverse-of-nxn-matrix.html -double **invMatriz (double **A, int n) -{ - double ratio,a, **aux, **IA; - int i, j, k; - - aux = criaMatriz(n, 2*n); - IA = criaMatriz(n,n); - - for(i = 0; i < n; i++) { - for(j = 0; j < 2*n; j++) { - if (j < n) - aux[i][j] = A[i][j]; - else if(i==(j-n)) - aux[i][j] = 1.0; - else - aux[i][j] = 0.0; - } - } - - for(i = 0; i < n; i++){ - for(j = 0; j < n; j++){ - if(i!=j){ - ratio = aux[j][i]/aux[i][i]; - for(k = 0; k < 2*n; k++){ - aux[j][k] -= ratio * aux[i][k]; - } - } - } - } - - for(i = 0; i < n; i++){ - a = aux[i][i]; - for(j = n; j < 2*n; j++){ - IA[i][j-n] = aux[i][j] / a; - } - } - - freeMatriz(aux, n); - - return IA; - -} - -/* Libera matriz com 'n' linhas, alocada com 'criaMatriz()' */ -void freeMatriz (double **A, int n) -{ - int i; - - free(A[0]); - free(A); -} - -/* Multiplica matrizes 'A' e 'B', ambas 'n x n' */ -double **multMatriz (double **A, double **B, int n) -{ - double **C; - int i, j,k; - - C = (double **) malloc(n*sizeof(double *)); - for (i=0; i < n; ++i) { - C[i] = (double *) calloc(n,sizeof(double)); - for (j=0; j < n; ++j) - for (k=0; k < n; ++k) - C[i][j] += A[i][k] * B[k][j]; - } - - return C; -} - -/* Mostra na tela matriz 'n x n' alocada com 'criaMatriz()' */ -void prnMatriz (double **A, int n) -{ - int i, j; - - for(i = 0; i < n; i++){ - for(j = 0; j < n; j++){ - printf("%15.5lg", A[i][j]); - } - printf("\n"); - } -} - -/* Preenche matriz 'n x n' alocada com 'criaMatriz()' */ -void lerMatriz (double **A, int n) -{ - int i, j; - - for(i = 0; i < n; i++){ - for(j = 0; j < n; j++){ - scanf("%lg", A[i]+j); - } - } -} - diff --git a/utils/matrix.h b/utils/matrix.h deleted file mode 100644 index 53a7bbb52dfd14b87331e5acb1617044fb88f981..0000000000000000000000000000000000000000 --- a/utils/matrix.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Cria com calloc() matriz 'n x m' */ -double **criaMatriz (int n, int m); - -/* Retorna ponteiro para matriz inversa de matriz 'A'. - Matriz inversa é alocada com 'criaMatriz()' -*/ -double **invMatriz (double **A, int n); - -/* Libera matriz com 'n' linhas, alocada com 'criaMatriz()' */ -void freeMatriz (double **A, int n); - -/* Multiplica matrizes 'A' e 'B', ambas 'n x n' */ -double **multMatriz (double **A, double **B, int n); - -/* Mostra na tela matriz 'n x n' alocada com 'criaMatriz()' */ -void prnMatriz (double **A, int n); - -/* Preenche matriz 'n x n' alocada com 'criaMatriz()' */ -void lerMatriz (double **A, int n); - diff --git a/utils/sislin.c b/utils/sislin.c deleted file mode 100644 index 75f649be5051939638a7a78905832b95a2d4633c..0000000000000000000000000000000000000000 --- a/utils/sislin.c +++ /dev/null @@ -1,186 +0,0 @@ -#include <stdio.h> -#include <math.h> -#include <stdlib.h> - -#include "utils.h" -#include "sislin.h" - -// Alocaçao de matriz em memória. -SistLinear_t* alocaSisLin (unsigned int n, tipoAloc_t tipo) -{ - SistLinear_t *SL = (SistLinear_t *) malloc(sizeof(SistLinear_t)); - - if ( SL ) { - - SL->n = n; - SL->tipoAloc_A = tipo; - SL->A = (real_t **) malloc(n * sizeof(real_t *)); - SL->b = (real_t *) malloc(n * sizeof(real_t)); - - if (!(SL->A) || !(SL->b)) { - liberaSisLin(SL); - return NULL; - } - - // Matriz como vetor de N ponteiros para um único vetor com N*N elementos - if (tipo == pontVet) { - SL->A[0] = (real_t *) malloc(n * n * sizeof(real_t)); - if (!(SL->A[0])) { - liberaSisLin(SL); - return NULL; - } - - for (int i=1; i < n; ++i) { - SL->A[i] = SL->A[i-1]+n; - } - } - else if (tipo == pontPont) { // Matriz como vetor de N ponteiros - // para N vetores de N elementos cada - - for (int i=0; i < n; ++i) - SL->A[i] = (real_t *) malloc(n * sizeof(real_t)); - } - } - - return (SL); -} - -// Liberacao de memória -void liberaSisLin (SistLinear_t *SL) -{ - if (SL) { - if (SL->A) { - if (SL->tipoAloc_A == pontVet) { - if (SL->A[0]) free (SL->A[0]); - } - else if (SL->tipoAloc_A == pontPont) { - for (int i=0; i < SL->n; ++i) - free (SL->A[i]); - } - - free(SL->A); - } - if (SL->b) free(SL->b); - free(SL); - } -} - - -/*! - \brief Cria coeficientes e termos independentes do SL - * - \param SL Ponteiro para o sistema linear - \param tipo Tipo de sistema linear a ser criado. Pode ser: - comSolucao, eqNula, eqProporcional, eqCombLinear, hilbert - \param coef_max Maior valor para coeficientes e termos independentes -*/ -void iniSisLin (SistLinear_t *SL, tipoSistLinear_t tipo, real_t coef_max) -{ - unsigned int n = SL->n; - // para gerar valores no intervalo [0,coef_max] - real_t invRandMax = ((real_t)coef_max / (real_t)RAND_MAX); - - // inicializa vetor b - for (unsigned int i=0; i<n; ++i) { - SL->b[i] = (real_t)rand() * invRandMax; - } - - if (tipo == hilbert) { - for (unsigned int i=0; i<n; ++i) { - for (unsigned int j=0; j<n; ++j) { - SL->A[i][j] = 1.0 / (real_t)(i+j+1); - } - } - } - else { // inicializa sistema normal e depois altera - // inicializa a matriz A - for (unsigned int i=0; i<n; ++i) { - for (unsigned int j=0; j<n; ++j) { - SL->A[i][j] = (real_t)rand() * invRandMax; - } - } - if (tipo == eqNula) { - // sorteia eq a ser "nula" - unsigned int nula = rand() % n; - for (unsigned int j=0; j<n; ++j) { - SL->A[nula][j] = 0.0; - } - SL->b[nula] = 0.0; - } - else if (tipo == eqProporcional) { - // sorteia eq a ser "proporcional" e valor - unsigned int propDst = rand() % n; - unsigned int propSrc = (propDst + 1) % n; - real_t mult = (real_t)rand() * invRandMax; - for (unsigned int j=0; j<n; ++j) { - SL->A[propDst][j] = SL->A[propSrc][j] * mult; - } - SL->b[propDst] = SL->b[propSrc] * mult; - } - else if (tipo == eqCombLinear) { - // sorteia eq a ser "combLinear" - unsigned int combDst = rand() % n; - unsigned int combSrc1 = (combDst + 1) % n; - unsigned int combSrc2 = (combDst + 2) % n; - for (unsigned int j=0; j<n; ++j) { - SL->A[combDst][j] = SL->A[combSrc1][j] + SL->A[combSrc2][j]; - } - SL->b[combDst] = SL->b[combSrc1] + SL->b[combSrc2]; - } - else if (tipo == diagDominante) { - // aumenta o valor dos termos da diagonal principal - for (unsigned int i=0; i<n; ++i) { - real_t soma = 0.0; - for (unsigned int j=0; j < i; ++j) soma += SL->A[i][j]; - for (unsigned int j=i+1; j < n; ++j) soma += SL->A[i][j]; - SL->A[i][i] += soma; - } - } - } -} - - -SistLinear_t *lerSisLin (tipoAloc_t tipo) -{ - unsigned int n; - SistLinear_t *SL; - - scanf("%d",&n); - - SL = alocaSisLin (n, tipo); - - for(int i=0; i < n; ++i) - for(int j=0; j < n; ++j) - scanf ("%lg", &SL->A[i][j]); - - for(int i=0; i < n; ++i) - scanf ("%lg", &SL->b[i]); - - return SL; -} - - -void prnSisLin (SistLinear_t *SL) -{ - int n=SL->n; - - for(int i=0; i < n; ++i) { - printf("\n "); - for(int j=0; j < n; ++j) - printf ("%10g", SL->A[i][j]); - printf (" | %g", SL->b[i]); - } - printf("\n\n"); -} - -void prnVetor (real_t *v, unsigned int n) -{ - int i; - - printf ("\n"); - for(i=0; i < n; ++i) - printf ("%10g ", v[i]); - printf ("\n\n"); - -} - diff --git a/utils/sislin.h b/utils/sislin.h deleted file mode 100644 index e861beecb8040ad3b012862a9bbd5d471d727650..0000000000000000000000000000000000000000 --- a/utils/sislin.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef __SISLIN_H__ -#define __SISLIN_H__ - -#define COEF_MAX 32.0 // Valor máximo usado para gerar valores aleatórios de - // coeficientes nos sistemas lineares. - -// Tipo de alocação para matrizes -typedef enum { - pontPont=0, // Matriz como vetor de N ponteiros para vetores de tamanho N - pontVet // Matriz como vetor de N ponteiros para um único vetor de tamanho N*N -} tipoAloc_t; - -// Estrutura para definiçao de um sistema linear qualquer -typedef struct { - real_t **A; // coeficientes - real_t *b; // termos independentes - unsigned int n; // tamanho do SL - tipoAloc_t tipoAloc_A; // tipo de alocação usada na matriz de coeficientes -} SistLinear_t; - -// Tipos de matrizes de coeficientes usados pela função 'inicializaSistLinear()' -typedef enum { - generico = 0, - hilbert, - diagDominante, - eqNula, - eqProporcional, - eqCombLinear -} tipoSistLinear_t; - - -// Alocaçao e desalocação de matrizes -SistLinear_t* alocaSisLin (unsigned int n, tipoAloc_t tipo); -void liberaSisLin (SistLinear_t *SL); -void iniSisLin (SistLinear_t *SL, tipoSistLinear_t tipo, real_t coef_max); - -// Leitura e impressão de sistemas lineares -SistLinear_t *lerSisLin (); -void prnSisLin (SistLinear_t *SL); -void prnVetor (real_t *vet, unsigned int n); - -#endif // __SISLIN_H__ -