Ir para conteúdo
Fórum Script Brasil
  • 0

Autovalor e autovetor de uma matriz


Thiago Heidrich

Pergunta

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;
}

20190605_023955.jpg

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...