You are on page 1of 7

program principal

use llama_ajuste
!external ajuste
real,dimension(100)::x,y
real::b,m,predy,var1,var2,var3
real,dimension(4)::coef
integer::n,esc
print*,"ingrese cantidad de datos"
read*,n
print*,"ingrese datos a X e Y"
do i=1,n
read*,x(i),y(i)
end do
print*,"seleccione el tipo de ecuacion"
print*,"1-ecuacion lineal"
print*,"2-ecuacion potencial"
print*,"3-ecuacion exponencial"
print*,"4-ecuacion parabolica"
print*,"5-ecuacion cubica"
read*,esc

select case(esc)
case (1)
print*
call lineal(n,x,y,b,m)
print*,"coeficinetes de regresion"
print*,"b= ", b
print*,"m= ", m
print 10,b,m
10 format(1x,"la recta de regresiom",2x,"y=",f8.2,2x,"+",f16.9," x(i)"//)
!determinacion de los valores predecidos
print 11
11 format(4x,"i",8x,"x",8x,"y",12x,"y_predy")
do i=1,n
predy=b+m*x(i)
print 12,i,x(i),y(i),predy
end do
12 format(1x,i4,2x,f8.2,2x,f8.2,4x,f12.4)

case (2)
print*
call potencial(n,x,y,b,m,b2)
Print*,"Coeficientes de regresion"
Print*,"b= ",b
Print*,"m= ",m
print*,"B2= ",b2
Print 13, b2,m
13 format(1x,"La recta de regresion",2x,"Y=",f8.2,2x,"x",2x," X(I)",2x,"^",f16.9,//)
!determinacion de los valores predecidos
print 14
14 format(4x,"I",8x,"X",8x,"Y",12x,"Y_predy")
Do i=1,n
predy=b2*(x(i)**b)
print 15,i,x(i),y(i),predy
end do
15 format(1x,i4,2x,f8.2,2x,f8.2,4x,f12.4)

case (3)
print*
call exponencial (n,x,y,b,m,b2,b3)
Print*,"Coeficientes de regresion"
Print*,"b= ",b
Print*,"m= ",m
print*,"b2= ",b2
print*,"b3= ",b3
Print 16, b2,b3
16 format(1x,"La recta de regresion",2x,"Y=",f8.2,2x,"x",2x,f16.9,"^","X(I)"//)
!determinacion de los valores predecidos
print 17
17 format(4x,"I",8x,"X",8x,"Y",12x,"Y_predy")
Do i=1,n
predy=b2*((b3)**x(i))
print 18,i,x(i),y(i),predy
end do
18 format(1x,i4,2x,f8.2,2x,f8.2,4x,f12.4)

case (4)
print*
call parabolica (n,x,y,var1,var2,var3)
print*,"coeficientes para la funcion parabolica"
print*,"coeficiente 1 =",var1
print*,"coeficiente 2 =",var2
print*,"coeficiente 3 =",var3
print*
print*,"la ecuacion de la parabola minima cuadratica"
print*
Print 20,var1,var2,var3
20 format (1x,"ecuacion parabolica",2x,"Y=",f7.2,1x,"+",1x,f7.2,"(x)",1x,"+",1x,f7.2,"(x^2)"//)

case (5)
print*
call gauss(n,x,y,coef)
print*,"coeficinetes de la ecuacion"
do i=1,4
print*, coef(i)
end do
print 30,coef(1),coef(2),coef(3),coef(4)
30 format(1x,"ecuacion
cubica",2x,"y","=",f10.5,2x,"+",f10.5,"(x)","+",f10.5,"(x^2)","+",f10.5,"(x^3)"//)

end select
end program principal
module llama_ajuste
contains

subroutine lineal(n,x,y,b,m)
integer,intent(in)::n
real,dimension(n),intent(in)::x,y
real,intent(out)::b,m
real::sx,sy,sxx,syy,sxy
sx=0.
sy=0.
sxy=0.
sxx=0.
syy=0.
do i=1,n
sx=sx+x(i)
sy=sy+y(i)
sxx=sxx+x(i)*x(i)
syy=syy+y(i)*y(i)
sxy=sxy+x(i)*y(i)
end do
m=(n*sxy-sx*sy)/(n*sxx-sx**2)
b=(sxx*sy-sx*sxy)/(n*sxx-sx**2)
return
end subroutine lineal

subroutine potencial(n,x,y,b,m,b2)
integer,intent(in)::n
real,dimension(n),intent(in)::x,y
real,intent(out)::b,m
real::sx,sy,sxx,syy,sxy
sx=0.
sy=0.
sxy=0.
sxx=0.
syy=0.
Do i=1,n
sx=sx+log10(x(i))
sy=sy+log10(y(i))
sxx=sxx+log10(x(i))*log10(x(i))
syy=syy+log10(y(i))*log10(y(i))
sxy=sxy+log10(x(i))*log10(y(i))
End Do
m=(n*sxy-sx*sy)/(n*sxx-sx**2)
b=(sxx*sy-sx*sxy)/(n*sxx-sx**2)
b2=10**b
return
end subroutine potencial

subroutine exponencial(n,x,y,b,m,b2,b3)
integer,intent(in)::n
real,dimension(n),intent(in)::x,y
real,intent(out)::b,m
real::sx,sy,sxx,syy,sxy
sx=0.
sy=0.
sxy=0.
sxx=0.
syy=0.
Do i=1,n
sx=sx+(x(i))
sy=sy+log10(y(i))
sxx=sxx+(x(i))*(x(i))
syy=syy+log10(y(i))*log10(y(i))
sxy=sxy+(x(i))*log10(y(i))
End Do
m=(n*sxy-sx*sy)/(n*sxx-sx**2)
b=(sxx*sy-sx*sxy)/(n*sxx-sx**2)
b2=10**b
b3=10**m

return
end subroutine exponencial

subroutine parabolica (n,x,y,var1,var2,var3)


integer,intent(in)::n
real,dimension(n),intent(in)::x,y
real,intent(out)::var1,var2,var3
real:: sx,sy,sxx,sxxx,sxxy,sxy,sxxxx
real,dimension(3)::b
real,dimension(3,3)::a,a1,a2,a3
integer::i
real::denom
sx=0.
sy=0.
sxy=0.
sxx=0.
sxxx=0.
sxxy=0.
sxxxx=0.
Do i=1,n
sx=sx+x(i)
sy=sy+y(i)
sxx=sxx+x(i)*x(i)
sxxx=sxxx+x(i)*x(i)*x(i)
sxxy=sxxy+x(i)*x(i)*y(i)
sxxxx=sxxxx+x(i)*x(i)*x(i)*x(i)
sxy=sxy+x(i)*y(i)
End Do

a(1,1)=n
a(1,2)=sx
a(1,3)=sxx
a(2,1)=sx
a(2,2)=sxx
a(2,3)=sxxx
a(3,1)=sxx
a(3,2)=sxxx
a(3,3)=sxxxx

b(1)=sy
b(2)=sxy
b(3)=sxxy

denom=det(a)
a1=a
a2=a
a3=a

do i=1,3
a1(i,1)=b(i)
a2(i,2)=b(i)
a3(i,3)=b(i)
end do

var1=det(a1)/denom
var2=det(a2)/denom
var3=det(a3)/denom
return
end subroutine parabolica

function det(a)
real,dimension(3,3)::a
det=a(1,1)*(a(2,2)*a(3,3)-a(2,3)*a(3,2)) -a(1,2)*(a(2,1)*a(3,3)-a(2,3)*a(3,1))+ &
& a(1,3)*(a(2,1)*a(3,2)-a(2,2)*a(3,1))
return
end function det

subroutine gauss (n,x,y,coef)


integer,intent(in)::n
real,dimension(n),intent(in)::x,y
real,dimension(4),intent(out)::coef
real:: sx,sy,sxx,sxxx,sxxy,sxy,sxxxx,sxxxxxx,sxxxxx,sxxxy
real,dimension(4)::b
real,dimension(4,4)::a
integer::i

sx=0.
sxx=0.
sxxx=0.
sy=0.
sxxxx=0.
sxy=0.
sxxxxx=0.
sxxy=0.
sxxxxxx=0.
sxxxy=0.

Do i=1,n
sx=sx+x(i)
sxx=sxx+x(i)*x(i)
sxxx=sxxx+x(i)*x(i)*x(i)
sy=sy+y(i)
sxxxx=sxxxx+x(i)*x(i)*x(i)*x(i)
sxy=sxy+x(i)*y(i)
sxxxxx=sxxxxx+x(i)*x(i)*x(i)*x(i)*x(i)
sxxy=sxxy+x(i)*x(i)*y(i)
sxxxxxx=sxxxxxx+x(i)*x(i)*x(i)*x(i)*x(i)*x(i)
sxxxy=sxxxy+x(i)*x(i)*x(i)*y(i)

End Do

a(1,1)=n
a(1,2)=sx
a(1,3)=sxx
a(1,4)=sxxx
a(2,1)=sx
a(2,2)=sxx
a(2,3)=sxxx
a(2,4)=sxxxx
a(3,1)=sxx
a(3,2)=sxxx
a(3,3)=sxxxx
a(3,4)=sxxxxx
a(4,1)=sxxx
a(4,2)=sxxxx
a(4,3)=sxxxxx
a(4,4)=sxxxxxx

b(1)=sy
b(2)=sxy
b(3)=sxxy
b(4)=sxxxy

!eliminacion hacia adelante


do k=1,3
do i=k+1,4
factor=a(i,k)/a(k,k)
do j=k+1,4
a(i,j)=a(i,j)-factor*a(k,j)
end do
b(i)=b(i)-factor*b(k)
end do
end do
!Sustitucion hacia atras
coef(4)=b(4)/a(4,4);
do i=3,1,-1
sum=b(i);
do j=i+1,4
sum=sum-a(i,j)*coef(j);
end do
coef(i)=sum/a(i,i);
end do

return
end subroutine gauss

end module llama_ajuste

Program practica_3
use grafica_ajuste
real,dimension(100)::x,y
real::b2,a2,a1,b1,predy
integer::n

Print*,"Ingrese cantidad de datos"


read*,n
Print*,"Ingrese datos a X e Y"
Do i=1,n
read*,x(i),y(i)
End Do

call eliptica(n,x,y,a1,b1,b2,a2)
Print*,"Coeficientes de regresion"
Print*,"a= ",a2
Print*,"B= ",b2
Print 10,a1,b1
10 format(1x,"La recta de regresion",2x,"Y=",f8.2,2x,"+",f16.9,"X(I)",//)
print 11
11 format(4x,"I",8x,"X",8x,"Y",12x,"Y_predy")
Do i=1,n
predy=(b2)-log(x(i))*a2
print 12,i,x(i),y(i),predy
end do
12 format(1x,i4,2x,f8.2,2x,f8.2,4x,f12.4)
End Program practica_3

You might also like