Está en la página 1de 20

Programas en C de Métodos Numéricos.

Solución de Sistemas de Ecuaciones Lineales.

Métodos Directos

1. Método de Gauss Simple:


#include <stdio.h>
#include <stdlib.h>

int main()
{
float A[100][100],//Matriz de coeficientes
b[100],//Vector de resultados
s[100],
x[100];

floatpiv,aux;
intn,f,c,d;

printf("SOLUCION DE SISTEMAS DE ECUACIONES CON n INCOGNITAS EN n ECUACIONES\n");


printf("METODO DE GAUSS\n\n");
printf("Ingresa el valor de n:");
scanf("%d",&n);

printf("\nIngresa los valores de la matriz de coeficientes:\n");


for(f=0;f<n;f++)
for(c=0;c<n;c++)
{
printf("A[%d][%d]=",f+1,c+1);
scanf("%f",&A[f][c]);
}

printf("\nIngresa los valores del vector de resultados:\n");


for(c=0;c<n;c++)
{
printf("b[%d]=",c+1);
scanf("%f",&b[c]);
}

//Triangulacion de la matriz
for (d=0;d<n;d++)
{
piv=A[d][d];
for (c=0;c<n;c++)
s[c]=A[d][c]/piv;
aux=b[d]/piv;
for (f=(d+1);f<n;f++)
{
piv=A[f][d];
for (c=d;c<n;c++)
A[f][c]=A[f][c]-piv*s[c];
b[f]=b[f]-piv*aux;
}
}

//Impresion de la matriz triangulada


printf("\nLos valores de la matriz triangulada son:\n");
for(f=0;f<n;f++)
{
for(c=0;c<n;c++)
printf("%.4f ",A[f][c]);
printf(" | %.4f\n",b[f]);
}
//Calculo de los resultados
for (f=n-1;f>=0;f--)
{
aux=0;
for (c=0;c<n;c++)
if (c!=f)
aux=aux+A[f][c]*x[c];
x[f]=(b[f]-aux)/A[f][f];
}

//Impresion de resultados

printf("\nLos resultados del sistema son:\n");

for(f=0;f<n;f++)
printf("%.4f ",x[f]);
printf("\n");
getchar( );
return 0;

2.- Programa para calcular la matriz inversa.

//Programa para caclular la matriz inversa.


#include <stdio.h>
#include <stdlib.h>

int main(){
system("color f1");
int i,j,k,s;
float ml[100][100],coef,aux[100],elemento;
printf("\n****Bienvenido al Generador de Matrices Inversas****\n");
printf("***Por favor introduzca la dimension de la matriz***\n");
scanf("%i",&k);
for (i=0;i<k;i++)
{
for (j=0;j<k;j++)
{
printf("Ingrese el valor de [%i][%i]:",i,j);
scanf("%f",&ml[i][j]);

}
}
for (i=0;i<k;i++)
for(j=k;j<2*k;j++)
{
if(i==(j-k))
ml[i][j]=1;
else
ml[i][j]=0;
}
//Iteraciones
for (s=0;s<k;s++)
{
elemento=ml[s][s];
for (j=0;j<2*k;j++)
ml[s][j]=ml[s][j]/elemento;
for(i=0;i<k;i++)
{
if (i==s)
printf("\n");
else
{
coef= ml[i][s];
for (j=0;j<2*k;j++)
aux[j]=ml[s][j]*(coef*-1);
for (j=0;j<2*k;j++)
ml[i][j]=ml[i][j]+aux[j];
}
}
}
//Imprimir la matriz inversa
printf("\n\tLa matriz inversa es:\n");
for (i=0;i<k;i++)
{
for(j=k;j<2*k;j++)
printf(" [%f]\n ",ml[i][j]);
if (j==k)
printf("\n");
}

getchar();
return 0;
}

3. Método de Gauss-Jordan.

#include <stdlib.h>

int main()

float A[100][100],//Matriz de coeficientes

b[100];//Vector de resultados

floatpiv,aux;

intn,f,c,d;

printf("SOLUCION DE SISTEMAS DE ECUACIONES CON n INCOGNITAS EN n ECUACIONES\n");

printf("METODO DE GAUSS-JORDAN\n\n");

printf("Ingresa el valor de n:");


scanf("%d",&n);

printf("\nIngresa los valores de la matriz de coeficientes:\n");

for(f=0;f<n;f++)

for(c=0;c<n;c++)

printf("A[%d][%d]=",f+1,c+1);

scanf("%f",&A[f][c]);

printf("\nIngresa los valores del vector de resultados:\n");

for(c=0;c<n;c++)

printf("b[%d]=",c+1);

scanf("%f",&b[c]);

//Aplicacion del metodo

for (d=0;d<n;d++)

piv=A[d][d];

for (c=0;c<n;c++)

A[d][c]=A[d][c]/piv;

b[d]=b[d]/piv;

for (f=0;f<n;f++)

if (f!=d)

aux=A[f][d];

for (c=0;c<n;c++)

A[f][c]=A[f][c]-(aux*A[d][c]);

b[f]=b[f]-(aux*b[d]);

}
//Impresion de la matriz triangulada

printf("\nLos valores de la matriz reducida son:\n");

for(f=0;f<n;f++)

for(c=0;c<n;c++)

printf("%.4f ",A[f][c]);

printf(" | %.4f\n",b[f]);

//Impresion de resultados

printf("\nLos resultados del sistema son:\n");

for(f=0;f<n;f++)

printf("%.4f ",b[f]);

printf("\n");

system("pause");

Métodos Factorizables:

4. Factorización LU

#include <stdio.h>

#include <stdlib.h>

int main()

float A[100][100],//Matriz de coeficientes

U[100][100],

L[100][100],

b[100],//Vector de resultados

s[100];

floatpiv,aux;
intn,f,c,d,i;

printf("SOLUCION DE SISTEMAS DE ECUACIONES CON n INCOGNITAS EN n ECUACIONES\n");

printf("METODO DE FACTORIZACION LU\n\n");

printf("Ingresa el valor de n:");

scanf("%d",&n);

printf("\nIngresa los valores de la matriz de coeficientes:\n");

for(f=0;f<n;f++)

for(c=0;c<n;c++)

printf("A[%d][%d]=",f+1,c+1);

scanf("%f",&A[f][c]);

U[f][c]=A[f][c];

printf("\nIngresa los valores del vector de resultados:\n");

for(c=0;c<n;c++)

printf("b[%d]=",c+1);

scanf("%f",&b[c]);

//Obtencion de la Matriz U y la Matriz L

for (f=0;f<n;f++)

for (c=0;c<n;c++)

L[f][c]=0;

for (d=0;d<n;d++)

piv=U[d][d];

L[d][d]=1;

for (c=0;c<n;c++)
s[c]=U[d][c]/piv;

for (i=d+1;i<n;i++)

L[i][d]=U[i][d]/U[d][d];

for (f=(d+1);f<n;f++)

piv=U[f][d];

for (c=d;c<n;c++)

U[f][c]=U[f][c]-piv*s[c];

//Impresion de la matriz triangulada U

printf("\nLos valores de la matriz U son:\n");

for(f=0;f<n;f++)

for(c=0;c<n;c++)

printf("%.4f ",U[f][c]);

printf("\n");

//Impresion de la matriz triangulada L

printf("\nLos valores de la matriz L son:\n");

for(f=0;f<n;f++)

for(c=0;c<n;c++)

printf("%.4f ",L[f][c]);

printf("\n");

}
//Determinacion de L*s=b mediante el metodo de gauss jordan

for (d=0;d<n;d++)

piv=L[d][d];

for (c=0;c<n;c++)

L[d][c]=L[d][c]/piv;

b[d]=b[d]/piv;

for (f=0;f<n;f++)

if (f!=d)

aux=L[f][d];

for (c=0;c<n;c++)

L[f][c]=L[f][c]-(aux*L[d][c]);

b[f]=b[f]-(aux*b[d]);

//Determinacion de U*x=s mediante el metodo de gauss jordan

for (d=0;d<n;d++)

piv=U[d][d];

for (c=0;c<n;c++)

U[d][c]=U[d][c]/piv;

b[d]=b[d]/piv;

for (f=0;f<n;f++)

if (f!=d)

aux=U[f][d];

for (c=0;c<n;c++)

U[f][c]=U[f][c]-(aux*U[d][c]);

b[f]=b[f]-(aux*b[d]);

}
}

//Impresion de resultados

printf("\nLos resultados del sistema son:\n");

for(f=0;f<n;f++)

printf("%.4f ",b[f]);

printf("\n");

5. Factorización de Cholesky.

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

int main()

float A[100][100],

L[100][100],

InvL[100][100],

InvLT[100][100],

z[100],

b[100],

x[100],

s,

pivote,

aux;

intn,i,j,k,f,c,d;

printf("SOLUCION DE SISTEMAS DE ECUACIONES CON n INCOGNITAS EN n ECUACIONES\n");

printf("METODO DE FACTORIZACION QQT O CHOLESKY\n\n");

printf("Ingresa el valor de n:");

scanf("%d",&n);

printf("\nIngresa los valores de la matriz de coeficientes:\n");


for(f=0;f<n;f++)

for(c=0;c<n;c++)

printf("A[%d][%d]=",f+1,c+1);

scanf("%f",&A[f][c]);

printf("\nIngresa los valores de la matriz de resultados:\n");

for(c=0;c<n;c++)

printf("b[%d]=",c+1);

scanf("%f",&b[c]);

//Determinacion de la Matriz L

L[0][0]=sqrt(A[0][0]);

i=1;

while(i<n)

L[i][0]=A[0][i]/L[0][0];

L[i][i]=0;

i++;

i=1;

while(i<n)

s=0;

k=0;

while(k<(i))

s=s+pow(L[i][k],2);

k++;

}
L[i][i]=sqrt(A[i][i]-s);

if (i==(n-1))

break;

else

j=i+1;

while(j<n)

s=0;

k=0;

while(k<(i))

s=s+L[i][k]*L[j][k];

k++;

L[j][i]=(A[i][j]-s)/L[i][i];

L[i][j]=0;

j++;

i++;

printf("\nLos valores de la matriz Q son:\n");

for(f=0;f<n;f++)

for(c=0;c<n;c++)

printf("%.4f ",L[f][c]);

printf("\n");

//Determib¿nacion de la matriz z mediante la inversa de L

for(f=0;f<n;f++)

for(c=0;c<n;c++)

if(c==f)
InvL[f][c]=1;

else

InvL[f][c]=0;

for(d=0;d<n;d++)

pivote=A[d][d];

for(c=0;c<n;c++)

A[d][c]=A[d][c]/pivote;

InvL[d][c]=InvL[d][c]/pivote;

for(f=0;f<n;f++)

if (f==d)

f++;

aux=A[f][d];

for(c=0;c<n;c++)

A[f][c]=A[f][c]-(aux*A[d][c]);

InvL[f][c]=InvL[f][c]-(aux*InvL[d][c]);

for (f=0;f<n;f++)

for (c=0;c<n;c++)

z[f]=0;

for (d=0;d<n;d++)

z[f]=z[f]+InvL[f][d]*b[d];
}

//Transpuesta de L

for (f=0;f<n;f++)

for (c=0;c<n;c++)

InvLT[f][c]=InvL[c][f];

//Inversa de la transpuesta de L

for (f=0;f<n;f++)

for (c=0;c<n;c++)

x[f]=0;

for (d=0;d<n;d++)

x[f]=x[f]+InvLT[f][d]*b[d];

printf("\nLos resultados del sistema son:\n");

for(f=0;f<n;f++)

printf("%.4f ",x[f]);

printf("\n");

return(0);

}
Métodos Iterativos:

6. Método de Jacobi:

#include<stdio.h>

#include <stdlib.h>

#include <math.h>

int main(void)

float A[100][100],

Am[100][100],

b[100],

bm[100],

xo[100],

X[100],

E,

aux;

inti,j,k,n,flag=0,iter;

printf("SOLUCION DE SISTEMAS DE ECUACIONES CON n INCOGNITAS EN n ECUACIONES\n");

printf("METODO DE JACOBI\n\n");

printf("Ingresa el valor de n:");

scanf("%d",&n);

printf("Ingresa el valor del error:");

scanf("%f",&E);

printf("\nIngresa los valores de la matriz de coeficientes:\n");

for(i=0;i<n;i++)

for(j=0;j<n;j++)

printf("A[%d][%d]=",i+1,j+1);

scanf("%f",&A[i][j]);

printf("\nIngresa los valores del vector de resultados:\n");


for(i=0;i<n;i++)

printf("b[%d]=",i+1);

scanf("%f",&b[i]);

printf("\nIngresa los valores del vector de inicio:\n");

for(i=0;i<n;i++)

printf("Xo[%d]=",i+1);

scanf("%f",&xo[i]);

for (i=0;i<n;i++)

if(A[i][i]==0)

printf ("\n\nHay un cero en la diagonal principal. No es posible aplicar el metodo.");

fflush(stdin);

getchar();

exit(1);

//Matriz modificada

for (i=0;i<n;i++)

aux=A[i][i];

for (j=0;j<n;j++)

if(i==j)

Am[i][j]=0;

else

Am[i][j]=A[i][j]/(0-aux);

//Vector de Resultados.

for (i=0;i<n;i++)
bm[i]=b[i]/A[i][i];

//Iteraciones

iter= 1;

printf("\n\nValores en cada Iteraccion:\n",iter);

do

//Multiplicacion

for(i=0;i<n;i++)

for (j=0;j<n;j++)

X[i]=0;

for (k=0;k<n;k++)

X[i]=X[i]+Am[i][k]*xo[k];

//Suma

for (i=0;i<n;i++)

X[i]=X[i]+bm[i];

//Verificacion del error

for (i=0;i<n;i++)

if(fabs(X[i]-xo[i])<E)

flag=1;

printf("\n%d",iter);

for(i=0;i<n;i++)

printf(" X[%d]=%.4f",i+1,X[i]);

//Intercambio

for (i=0;i<n;i++)

xo[i]=X[i];

iter++;
}

while (flag==0);

printf ("\n\nEl resultado del sistema es:");

for(i=0;i<n;i++)

printf("\nX[%d]=%.4f",i+1,X[i]);

return 0;

7.Método de Gauss-Seidel.

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

int main(void)

float A[100][100],

Am[100][100],

b[100],

bm[100],

xo[100],

X[100],

err[100],

E,

aux;

inti,j,k,n,l,flag=0,iter;

printf("SOLUCION DE SISTEMAS DE ECUACIONES CON n INCOGNITAS EN n ECUACIONES\n");

printf("METODO DE GAUSS SEIDEL\n\n");

printf("Ingresa el valor de n:");

scanf("%d",&n);

printf("Ingresa el valor del error:");

scanf("%f",&E);

printf("\nIngresa los valores de la matriz de coeficientes:\n");


for(i=0;i<n;i++)

for(j=0;j<n;j++)

printf("A[%d][%d]=",i+1,j+1);

scanf("%f",&A[i][j]);

printf("\nIngresa los valores del vector de resultados:\n");

for(i=0;i<n;i++)

printf("b[%d]=",i+1);

scanf("%f",&b[i]);

printf("\nIngresa los valores del vector de inicio:\n");

for(i=0;i<n;i++)

printf("Xo[%d]=",i+1);

scanf("%f",&xo[i]);

for (i=0;i<n;i++)

if(A[i][i]==0)

printf ("\n\nHay un cero en la diagonal principal. No es posible aplicar el metodo.");

fflush(stdin);

getchar();

exit(1);

//Matriz modificada

for (i=0;i<n;i++)

aux=A[i][i];

for (j=0;j<n;j++)
if(i==j)

Am[i][j]=0;

else

Am[i][j]=A[i][j]/(0-aux);

//Vector de Resultados.

for (i=0;i<n;i++)

bm[i]=b[i]/A[i][i];

//Iteraciones

iter= 1;

printf("\n\nValores en cada Iteraccion:\n",iter);

do

for (i=0;i<n;i++)

err[i]=xo[i];

//Multiplicacion y suma

for(i=0;i<n;i++)

X[i]=0;

for (k=0;k<n;k++)

X[i]=X[i]+Am[i][k]*xo[k];

X[i]=X[i]+bm[i];

xo[i]=X[i];

//Verificacion del error

for (i=0;i<n;i++)

if(fabs(X[i]-err[i])<E)

flag=1;
printf("\n%d",iter);

for(i=0;i<n;i++)

printf(" X[%d]=%.4f",i+1,X[i]);

//Intercambio

for (i=0;i<n;i++)

xo[i]=X[i];

iter++;

if (iter==10) flag=1;

while (flag==0);

printf ("\n\nEl resultado del sistema es:");

for(i=0;i<n;i++)

printf("\nX[%d]=%.4f",i+1,X[i]);

return 0;

También podría gustarte