Jump to content
Fórum Script Brasil
  • 0

Autovalor e autovetor de uma matriz


Question

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 to post
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      148692
    • Total Posts
      644525
×
×
  • Create New...