Ir para conteúdo
Fórum Script Brasil

Thiago Heidrich

Membros
  • Total de itens

    1
  • Registro em

  • Última visita

Sobre Thiago Heidrich

Thiago Heidrich's Achievements

0

Reputação

  1. Pessoal, bom dia. Estou com um baita problema p resolver. Tenho um trabalho p entregar sobre autovalor e autovetor de uma matriz, consegui um código que acha esses dados q desejo. Ele não estava depurando, consegui depurar até metade do código porém tá dando erro. Estou usando o microsoft visual studio. O erro está em anexo. Esse é o link com o código original:https://www.vivaolinux.com.br/script/Metodo-de-Power-para-calcular-o-autovelor-dominante-de-uma-matriz Esse aqui é o código. #include <stdlib.h> #include <stdio.h> #include <math.h> #include<malloc.h> #define MAX(a,b) c = (absval(a) >= absval(b)) ? a : b // usado no calculo da norma infinita. FILE * fp; // arquivo texto com o autovetor e seu autovalor associado double* cria_vetor(int tam) { /* rotina para alocar vetores dinamicamente */ double* vetor; vetor = (double*)calloc(tam, sizeof(double)); if (!vetor) { printf("Falta memoria para alocar o vetor de ponteiros"); exit(1); } return vetor; } double absval(double val) // valor absoluto com precisao dupla { if (val >= 0) return val; else return -val; } void dados(int dim, int* N, double* TOL, double** A, double* x) { /* recebe os dados da matriz de entrada */ for (int i = 0; i < dim; i++) for (int j = 0; j < dim; j++) A[j] = 0.0; /* entrada da matriz */ for (int i = 0; i < dim; i++) { printf("\n Linha #%d: \n", i + 1); for (int j = 0; j < dim; j++) { printf("\n Coluna #%d: ", j + 1); scanf_s("%lf", &A[j]); } } printf("\n Entre com o vetor X inicial:"); /* vetor inicial X(0) */ for (int i = 0; i < dim; i++) { printf_s("\n x#%d: ", i + 1); scanf_s("%lf", &x); } printf("\n Entre com a Tolerancia: "); scanf_s("%lf", TOL); printf("\n Entre com o numero maximo de iteracoes: "); scanf_s("%d", N); system("clear"); fprintf(fp, "Matriz de entrada\n"); for (int i = 0; i < dim; i++) { for (int j = 0; j < dim; j++) fprintf(fp, "%lf ", A[j]); fprintf(fp, "\n"); } fprintf(fp, "\n"); } // fim dados double norma_inf(double* x, int dim) { int i; double c; // norma infinita do vetor i = 0; c = x[0]; for (i = 1; i < dim; i++) c = MAX(c, x); if (c == 0) { printf("\n A matriz \"A\" possui um autovalor 0, selecione um novo vetor \"x\" e reinicie!"); fprintf(fp, "\nA matriz \"A\" possui um autovalor 0, selecione um novo vetor \"x\" e reinicie!"); exit(1); } return c; } // fim norma_inf void exibe(double* x, double lambda, int dim, int k) { // exibe os dados computados int i; if (k == 0) { printf("n\t lambda(n)\t\t\t X(n)' \n"); printf("-----------------------------------------------------------------\n"); fprintf(fp, "n\t lambda(n)\t\t\t X(n)' \n"); fprintf(fp, "-----------------------------------------------------------------\n"); } printf("%d\t ", k + 1); fprintf(fp, "%d\t ", k + 1); printf("%lf\t [ ", lambda); fprintf(fp, "%lf\t [ ", lambda); for (i = 0; i < dim; i++) { printf("%lf ", x); fprintf(fp, "%lf ", x); } printf("]'\n"); fprintf(fp, "]'\n"); } // fim exibe void power(int dim, int N, double TOL, double** A, double* x) { // calcula o autovalor e o autovetor double* y, lambda, c1, * aux, erro; int i, j, k, FLAG; // alocacao dinamica de memoria y = cria_vetor(dim); aux = cria_vetor(dim); i = 0; j = 0; k = 0; lambda = 0; FLAG = 0; c1 = norma_inf(x, dim); for (i = 0; i < dim; i++) x = x / c1; while ((k < N) && (FLAG == 0)) { for (i = 0; i < dim; i++) { y = 0; for (j = 0; j < dim; j++) y += A[j] * x[j]; } c1 = norma_inf(y, dim); for (int l = 0; l < dim; l++) aux[l] = x[l] - y[l] / c1; erro = norma_inf(aux, dim); for (i = 0; i < dim; i++) x = y / c1; FLAG = 0; if (fabs(erro) < TOL) FLAG = 1; lambda = c1; exibe(x, lambda, dim, k); k++; } free(y); } // fim power int main() { double TOL; double** A, * x; int dim, N; system("clear"); printf(" ----------------------------------------------\n"); printf(" Calcula o autovalor dominante de uma matriz \n"); printf(" quadrada e o seu autovetor associado pelo \n"); printf(" metodo da potencia. \n"); printf(" ----------------------------------------------\n"); printf("\n Dimensao da matriz ? "); scanf_s("%d", &dim); // alocacao dinamica de memoria A = (double**)calloc(dim, sizeof(double)); // matriz de entrada for (int i = 0; i < dim; i++) A = (double*)calloc(dim, sizeof(double)); x = cria_vetor(dim); // vetor inicial dados(dim, &N, &TOL, A, x); power(dim, N, TOL, A, x); free(A); free(x); fclose(fp); return 0; }
×
×
  • Criar Novo...