hola bueno como dice el titulo este es el determinante, la tanspuesta y la inversa de una matriz n*n.
como sabran por cuestiones de memoria de la pc algunos resultados no son escritos en decimal sino se dejan como una fracción breve explicación de lo que es el determinante de una matriz:
El codigo es de varios que consegui en internet y unas modificciones que le hice para que pudiera funcionar:
#include <stdio.h>
#define N 100
int sgn (int x) {
if (x%2==0) return(1);
return(-1);
}
int read_dim (int *dim) {
int nl;
char aux;
printf("\nIntroduzca dimension matriz cuadrada (<100): ");
nl=scanf("%d", &(*dim));
if (nl!=1) {
scanf("%c", &aux);
while (aux!='\n')
scanf("%c", &aux);
}
if ( (*dim>=100) || (*dim<=0) )
return(0);
return(1);
}
void read_matrix (float matrix[N][N], int dim) {
int i, j;
printf("\nIntroduzca elementos matriz...\n");
for (i=1; i<=dim; i++) {
printf("Elementos fila %d: ", i);
for (j=0; j<dim; j++)
scanf("%f", &matrix[i-1][j]);
}
}
void matrix_adj (float matrix[N][N], float matrix_aux[N][N], int dim, int m, int n) {
int i, j, p, q;
for (j=0, q=0; j<dim; j++)
if (j!=n) {
for (i=0, p=0; i<dim; i++)
if (i!=m) {
matrix_aux[p][q]=matrix[i][j];
p++;
}
q++;
}
}
float det_matrix_adj (float matrix[N][N], int dim, int m, int n);
float det_matrix_N (float matrix[N][N], int dim) {
int i, j, dim_aux;
float det;
for (i=0, j=0, det=0, dim_aux=dim; i<dim; i++)
det+=(sgn(i+j)*matrix[i][j])*(det_matrix_adj(matrix,dim_aux,i,j));
return(det);
}
float det_matrix_adj (float matrix[N][N], int dim, int m, int n) {
float matrix_aux[N][N];
if (dim==1) return(1);
matrix_adj(matrix,matrix_aux,dim,m,n);
return det_matrix_N(matrix_aux,dim-1);
}
void llenar_aux(float aux[N][N], float matrix[N][N], int dim, int m, int n){
int i,j,fila=0,columna=0;
for(i=0;i<dim;i++){
if(i!=m){
for(j=0;j<dim;j++){
if(j != n){
aux[fila][columna]=matrix[i][j];
columna++;
if(columna==(dim-1)){
fila++;
columna=0;
}
}
}
}
}
}
void calcular_trans(float matrix[N][N], float transpuesta[N][N], int dim){
int i,j;
for(i=0;i<dim;i++){
for(j=0;j<dim;j++){
transpuesta[i][j]=matrix[j][i];
}
}
}
void imprimir(float inv[N][N], int dim, int det){
int i,j;
printf("la inversa de la matiz es: \n\n");
for(i=0;i<dim;i++){
for(j=0;j<dim;j++){
printf("%.2f/%d ", inv[i][j],det);
}
printf("\n");
}
printf("\n");
}
void imprimir_adj(float inv[N][N], int dim){
int i,j;
printf("la adjunta de la matiz es: \n\n");
for(i=0;i<dim;i++){
for(j=0;j<dim;j++){
printf("%.2f ", inv[i][j]);
}
printf("\n");
}
printf("\n");
}
void imprimir_trans(float transpuesta[N][N], int dim){
int i,j;
printf("la tanspuesta de la matiz es: \n\n");
for(i=0;i<dim;i++){
for(j=0;j<dim;j++){
printf("%.2f ", transpuesta[i][j]);
}
printf("\n");
}
printf("\n");
}
int main(){
int fila,columna, dim, det;
float matrix[N][N], inv[N][N],aux[N][N],transpuesta[N][N];
while (!read_dim(&dim))
printf("Dimension no valida (<100).");
read_matrix(matrix,dim);
printf("\nDeterminante = %.2f\n\n", det_matrix_N(matrix,dim));
det=(det_matrix_N(matrix,dim));
if(det==0){
printf("no posee matriz inversa: \n");
}else{
for(fila=0;fila<dim;fila++){
for(columna=0;columna<dim;columna++){
llenar_aux(aux,matrix,dim,fila,columna);
inv[fila][columna]=((sgn(fila+columna)*(det_matrix_N(aux,dim-1))));
}
}
imprimir_adj(inv,dim);
imprimir(inv,dim,det);
calcular_trans(matrix,transpuesta,dim);
imprimir_trans(transpuesta,dim);
}
return 0;
}
No hay comentarios:
Publicar un comentario