Download as pdf or txt
Download as pdf or txt
You are on page 1of 11

/*PROGRAMA DE AJUSTE DE MINIMOS CUADRADOS E INVERSION DE MATRICES*/

/***********POR:LUIS ENRIQUE ROMERO CERVANTES*************/


#include<stdio.h>
#include<math.h>
#include<conio.h>
#define FMAX 100
#define CMAX 100

int main(){
int i, j, k, dat, pol, m, l;
double X[FMAX],Y[FMAX],SUMx[FMAX],SUMxy[FMAX],sumx,sumxy,A[FMAX][CMAX], B[FMAX], div;
double AI[FMAX][CMAX],I[FMAX][CMAX],C[FMAX][CMAX],suma,x[FMAX];
printf("\n\tPrograma de curvas de ajuste:\n");
printf("\t Dame el numero de datos: ");
scanf("%d",&dat);
printf("\n\tCual es el grado del polinomio: ");
scanf("%d",&pol);
for (i=0;i<dat;i++){
printf("\n X[%d]: ",i+1);
scanf("%lf",&X[i]);
}
for (i=0;i<dat;i++){
printf("\n Y[%d]: ",i+1);
scanf("%lf",&Y[i]);
}
/*calculo de la suma de las variables*/
for(i=0;i<=(2*pol);i++){
sumx=0;
sumxy=0;
for(j=0;j<dat;j++){
sumx=sumx+pow(X[j],i);
if(i>=pol){
sumxy=sumxy+(pow(X[j],(i-(pol)))*Y[j]);
}
}
SUMx[i]=sumx;
if(i>=pol){
SUMxy[i-pol]=sumxy;
}
else{
SUMxy[i]=0;
}
}
/*UNION DE MATRICES*/
for(i=0;i<=pol;i++){
k=0;
for(j=i;j<=i+(pol+1);j++){
if(k==pol+1){
A[i][k]=SUMxy[i];
}
else{
A[i][k]=SUMx[j];
}
k++;
}
}
for(i=0;i<pol+1;i++){
printf(" |\t ");
for(j=0;j<=pol+1;j++){
printf("%0.4lf \t",A[i][j]);
}
printf("\t|\n");
}
/*inversion de matrices*/
/*GUARDAMOS LA MATRIZ RESULTADO*/
for(i=0;i<4;i++){
B[i]=A[i][4];
}
/*MATRIZ IDENTIDAD*/
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(i==j){
I[i][j]=1;
}
else{
I[i][j]=0;
}
}
}
/*UNION DE MATRICES*/
for(i=0;i<4;i++){
for(j=0;j<=7;j++){
if(j<4){
C[i][j]=A[i][j];
}
else{
C[i][j]=I[i][j-4];
}
}
}
for(i=0;i<4;i++){
printf(" | ");
for(j=0;j<8;j++){
printf(" %0.2lf ",C[i][j]);
}
printf("|\t\n");
}
/*******************GAUSS-JORDAN****************/
printf("Se procede a calcular el sistema de ecuaciones...\n");
m=pol+1;
l=m;
for(j=0;j<m;j++){
for(i=0;i<=m-1;i++){
if(i>j){
/*proceder a encontrar al menor j>=k tal que Ai,j/= de 0*/
div=C[i][j]/C[j][j];
for(k=0;k<=m+3;k++){
/*y ejecutamos la resta de la division para eliminar el valor*/
C[i][k]=C[i][k]-div*C[j][k];
}
}
}
}
while(m>=2){
for(i=m-2;i>=0;i--){
for(j=m-1;j<=m-1;j++){
div=C[i][j]/C[j][j];
for(k=j;k<=l+3;k++){
C[i][k]=C[i][k]-div*C[j][k];
}
}
}
m=m-1;
}
for(i=0;i<4;i++){
for(j=3;j<8;j++){
I[i][j]=C[i][j]/C[i][i];
}
}
/*IMPRESION DE MATRICES RESULTANTES (OPCIONAL)*/
for(i=0;i<4;i++){
printf(" | ");
for(j=0;j<8;j++){
printf(" %0.4lf ",I[i][j]);
}
printf("|\t\n");
}
for(i=0;i<4;i++){
printf("| %0.4lf |\n",B[i]);
}
for(i=0;i<4;i++){
for(j=0;j<4;j++){
AI[i][j]=I[i][j+4];
}
}
for(i=0;i<4;i++){
for(j=0;j<4;j++){
printf(" %lf ",AI[i][j]);
}
printf("\n");
}
/***************FINLAIZA LA ELIMINACION***************/
//
for(i=0;i<4;i++){
suma=0;
for(j=0;j<4;j++){
suma=suma+(AI[i][j]*B[j]);
}
x[i]=suma;
}
for(i=0;i<4;i++){
printf("X(%d) : %0.4lf \n",(i+1),x[i]);
}
// salir:
return (0);}

You might also like