Este é um código em C para multiplicar matrizes, achando a matriz inversa. Você pode notar que eu comentei todo o código, então fica mais fácil de entender, e posso garantir que funciona.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
int i, j, l = 0, c = 0, k = 0;
printf("\n Digite o numero de variaveis: \n");//Define o tamanho da matriz A
scanf("%i",&l);
c = l;//coluna recebe o valor da linha ex: 3x3
float A[l][c], ident[l][c], pivo = 0, p = 0, m = 0;
//Definindo a Matriz Identidade
for(i = 0; i < l; i++)
{
for(j = 0; j < c; j++)
{
if(i == j)
{
ident[i][j] = 1;
}
else
{
ident[i][j] = 0;
}
}
}
//Inserindo valores na matriz A
printf("\n Digite os valores para os coficientes da Matriz A: \n");
for (i = 0; i < l; i++)
{
for (j = 0; j < c; j++){
printf("\n Digite o valor do termo a(%i,%i):",i+1,j+1);
scanf("%f",&A[i][j]);
}
}
printf("\n Matriz A: \n");
//Mostrando a Matriz
for(i = 0; i < l; i++)
{
for (j = 0; j < c; j++)
{
printf ("%.2f",A[i][j]);
if(j < c - 1) printf("\t");
else printf("\n");
}
}
//Calculando a Matriz Inversa
for(j = 0; j < c; j++)
{
pivo = A[j][j];
p = pivo/pivo;
for(k = j; k < c; k++)
{
A[j][k] = (A[j][k])/(pivo);
ident[j][k] = (ident[j][k])/(pivo);
}
for(i = 0; i < l; i++)
{
if(i != j)
{
m = A[i][j]/p;
for(k = 0; k < c; k++)
{
A[i][k] = (A[i][k]) - (m * A[j][k]);
ident[i][k] = (ident[i][k]) - (m * ident[j][k]);
}
}
}
}
//Resultado das Matrizes Identidade e Inversa
printf("\n Matriz Identidade A: \n");
for(i = 0; i < l; i++)
{
for (j = 0; j < c; j++)
{
printf ("%.2f",A[i][j]);
if(j < c - 1) printf("\t");
else printf("\n");
}
}
printf("\n Matriz Inversa: \n");
for(i = 0; i < l; i++)
{
for (j = 0; j < c; j++)
{
printf ("%.2f",ident[i][j]);
if(j < c - 1) printf("\t");
else printf("\n");
}
}
getch();
}
Na linha 53 (onde voce calcula a matriz inversa), nao daria problema caso A[j][j] fosse "0"?
ResponderExcluirBem respondendo a todos os comentários de uma só vez.
ExcluirConsultei meus antigos professores, uma vez que a dúvida me ficou na cabeça, e chegamos a conclusão que para no computador não daria errado, mas ficaria uma indeterminação muito grande e a nível de conhecimento agente resolveu mudar a linha e colocar desta forma:
onde está pivo e p, pode ser substituído por 1, com isso não há nem a necessidade dos dois aparecerem, até por que um número dividido por 1 sempre vai dar o próprio número.
" ...
pivo = 1; // ou nem declara ele
p = pivo/pivo; // daria 1 então nem precisa aparecer
for(k = j; k < c; k++)
{
A[j][k] = (A[j][k])/(pivo); // dividido por 1 o pivo nem precisa aparecer
ident[j][k] = (ident[j][k])/(pivo); // dividido por 1 o pivo nem precisa aparecer
}
for(i = 0; i < l; i++) { if(i != j)
{
m = A[i][j]/p; // dividido por 1 o p nem precisa aparecer
....
"
Espero que entendam, esse código foi criado para fins didáticos, pode ser que apareça alguma inconsistência como a que foi mostrada acima, e obrigada por me mostrar, onde sempre podemos consertar.
Ah e como meu professor sempre falava, "copiar código é como dar um tiro no pé", pois cada um tem seu estilo de programar.
Nós alimentamos esse blog com códigos para fins didáticos, por que sei como é difícil pensar nisso com a pressão do curso, mas sempre modifiquem, estudem o código como nosso amigo Gustavo fez.
Att.
eu dei crtl+c crtl+v aqui, mas a matriz obtida não corresponde com a inversa da matriz que eu digitei
ResponderExcluireu substituiria os seguintes comandos
ResponderExcluirif(i == j)
{
ident[i][j] = 1;
}
else
{
ident[i][j] = 0;
}
por ident[i][j] = (i==j);