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.
#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
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;
}
Pergunta
Thiago Heidrich
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;
}
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
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.