Sie sind auf Seite 1von 19

INSTITUTO POLITÉCNICO NACIONAL

ESCUELA SUPERIOR DE INGENIERÍA QUÍMICA E INDUSTRIAS EXTRACTIVAS

DEPARTAMENTO DE INGENIERÍA QUÍMICA PETROLERA

Unidad de aprendizaje:

“TALLER DE PROGRAMACIÓN”
PROFESOR: MIGUEL HESIQUIO GARDUÑO

Proyecto Final

EQUIPO:

2PV41
13/JUNIO/2018

1- Adicionar bloque de lectura de archivos al programa de mínimos


cuadrados.

1
ALGORITMOS

Se considera la mejor curva de ajuste aquella que minimiza la suma de las


desviaciones al cuadrado. Esta es la aproximación por el método de mínimos
cuadrados (MMC)

● Modelo líneal (Y=a+bX)


𝑛(∑𝑛𝑖=1 𝑋𝑖𝑌𝑖) − (∑𝑛𝑖=1 𝑋𝑖)(∑𝑛𝑖=1 𝑌𝑖)
𝑎=
𝑛(∑𝑛𝑖=1 𝑋𝑖 2 ) − (∑𝑛𝑖=1 𝑋𝑖)2

(∑𝑛𝑖=1 𝑋𝑖 2 )(∑𝑛𝑖=1 𝑌𝑖) − (∑𝑛𝑖=1 𝑋𝑖𝑌𝑖)(∑𝑛𝑖=1 𝑋𝑖)


𝑏=
𝑛(∑𝑛𝑖=1 𝑋𝑖 2 ) − (∑𝑛𝑖=1 𝑋𝑖)2

● Modelo exponencial (Y=aebx)


𝑌𝑖 ′ = 𝑙𝑜𝑔⁡(𝑌𝑖)

𝑛(∑𝑛𝑖=1 𝑋𝑖𝑌𝑖′) − (∑𝑛𝑖=1 𝑋𝑖)(∑𝑛𝑖=1 𝑌𝑖′)


𝑎𝑖 =
𝑛(∑𝑛𝑖=1 𝑋𝑖 2 ) − (∑𝑛𝑖=1 𝑋𝑖)2

𝑎 = 𝑒 𝑎𝑖

(∑𝑛𝑖=1 𝑋𝑖 2 )(∑𝑛𝑖=1 𝑌𝑖′) − (∑𝑛𝑖=1 𝑋𝑖𝑌𝑖′)(∑𝑛𝑖=1 𝑋𝑖)


𝑏=
𝑛(∑𝑛𝑖=1 𝑋𝑖 2 ) − (∑𝑛𝑖=1 𝑋𝑖)2

● Modelo potencial (Y=aXb)


𝑈𝑖 = 𝑙𝑛𝑋𝑖

𝑉𝑖 = 𝑙𝑛𝑌𝑖

𝑛(∑𝑛𝑖=1 𝑈𝑖𝑉𝑖) − ŪṼ
𝑏=
𝑛(∑𝑛𝑖=1 𝑈𝑖 2 ) − Ū2

𝐴 = Ṽ − 𝑏Ū

𝑎 = 𝑒𝐴

DIAGRAMA

2
I

n,x,y

Case
j=1 j=2 j=3
default

Subroutine Subroutine Subroutine


minimos minimos minimos

i←1 i←1 i←1


i<=n i<=n
i<=n
i←i+1 i←i+1 i←i+1

yc←a*x(i)+b yc←a*exp(b yc←a*(x(i)**b)


*x(i))

yc yc yc ¡Error!

F
3
CÒDIGO
!Inicio de programa
program ajuste

implicit none
real::sumx,sumxx,sumy,sumxy,xx,xy,yp,a,ai,b,yc
real,dimension(100)::x,y
integer::i,n,j
write(*,*)'***********¡Hola Usuario!***********'
!Introducción al programa
write(*,*)'Este programa realiza un análisis de regresión para el ajuste de diferentes
modelos’

write(*,*)'Ingrese número de datos xy a trabajar'


read(*,*)n
open(unit=1,file=datosequiz.dat,action=’read’)

!Selección de método
write(*,*)'¿Con qué modelo desea trabajar?'
write(*,*)'líneal (1), exponencial(2) o potencia(3) (Ingrese el número de la opción
deseada)'
read(*,*)j

select case (j)


case(1)

do i=1,n !contador para escribir resultado


read(1,*)x(i)
call minimos (x,y,n,a,b,)
yc=a+b*x(i)
write(*,*)'el valor de Y calculada es:',yc

end do

case(2)

do i=1,n !contador para escribir resultado


read(1,*)x(i)
call minimos (x,y,n,a,b,)
yc=a2i*exp(b2*x(i))
write(*,*)'el valor de Y calculada es:',yc

end do

4
case(3)

do i=1,n !contador para escribir resultado


read(1,*)x(i)
call minimos (x,y,n,a,b,)
yc=a3i*(x(i)**b3)
write(*,*)'el valor de Y calculada es:',yc

end do

case default
write(*,*)'Seleccione una opción de modelo valida'

end select

pause
end program ajuste

!Subrutina
subroutine minimos (x,y,n,a,b,)

real::sumx, sumy, sumy2, sumxx, ,sumxy,xx,xy,xy2,yp,a,b,a2,a2i,b2,a3,a3i,b3


real::u,v,uu,uv,pu,pv,sumu,sumv,sumuu,sumuv
real,dimension(100)::x,y
integer::i,n

!Neutro aditivo
sumx=0
sumy=0
sumy2=0
sumxx=0
sumxy=0
sumxy2=0
sumu=0
sumv=0
sumuu=0
sumuv=0

!Método Líneal
open(unit=1,file=datosequiz.dat,action=’read’)
open(unit=2,file=datosye.dat,action=’read’)

do i=1,n

5
read(1,*)x(i)
read(2,*)y(i)

sumx=sumx+x(i)
sumy=sumy+y(i)
xx=x(i)**2
sumxx=sumxx+xx
xy=x(i)*y(i)
sumxy=sumxy+xy
!Solo para exponencial
yp=log(y(i))
sumy2=sumy+yp
xy2=x(i)*yp
sumxy2=sumxy+xy2
!Potencial
u=ln(x(i))
sumu=sumu+u
v=ln(y(i))
pu=sumu./n
pv=sumv./n
uu=u**2
sumuu=sumuu+uu
uv=u*v
sumuv=sumuv+uv
end do

a=(sumy*sumxx-sumxy*sumx)/(n*sumxx-(sumx**2)
b=(n*sumxy-sumx*sumy)/(n*sumxx-(sumx**2)

a2=(sumy2*sumxx-sumxy2*sumx)/(n*sumxx-(sumx**2)
a2i=exp(a2)
b2=(n*sumxy2-sumx*sumy2)/(n*sumxx-(sumx**2)

b3=((1/n)*sumuv-pu.*pv)
a3=pv-(b*pu)
a3i=exp(a3)

end subroutine minimos

6
CÒDIGO EN FORTRAN

7
BLOC DE NOTA CON VALORES

8
EJEMPLO

En un estudio sobre la resistencia a bajas temperaturas del bacilo de la fiebre


tifoidea, se expusieron cultivos del bacilo durante diferentes periodos de tiempo a -
5 grados °C. Los siguientes datos representan:
X = tiempo de exposición (en semanas).
Y = porcentaje de bacilos supervivientes.

Nuestro objetivo es predecir el valor de Y conocido el valor de X.

n= 8

2- Lectura de datos, ingresar ‘x’ y ‘y’ para calcular integrar por método de
trapecio.
DIAGRAMA

9
I

X,fx,a,b,fa,fb,delta DECLARA VARIABLES


x,integral,suma

Fa(a**2)/2
Fb(b**2)/2 Calculo de funciones

Deltax(b-a)/ne
CALCULO DE deltax

Suma0
NEUTRO ADITIVO

n0 1<=n

nn+1

SI ERROR=0 NO

Fx=(x**2)/2

Sumasuma+Fx

Fx,suma

(suma+(fa+fb)/2)*deltax CALCULO INTEGRAL

integral

CÒDIGO

10
!-----------------------INTEGRAL---MÉTODO----TRAPECIO-----------
!-------CÓDIGO----2PV41----------------------------------------------------
!------------------------------------------------------------------------------------
! INTEGRAL
! MÉTODO DE TRAPECIO
!------------------------------------------------------------------------------------
!---------------------INICIO PROGRAMA-----------------------------------
program intetra
implicit none
integer,parameter::LU=10!Unidad I/0deldisco
!--------------------DECLARAR VARIABLES------------------------------
integer::i,ne
real::x,fx,a,b,fa,fb,deltax,integral,suma
integer::ierror!Parametro de error
write(*,*)'Bienvenidos, el programa calculará la integral definida de una función simple'
write(*,*)'Por favor, ingrese el valor inicial(a), y el valor final (b)'
read(*,*)a,b
write(*,*)'¿Cuántos datos desea ingresar?
read(*,*)ne
!-----------------CALCULO DE FUNCIONES----------------------------
fa=(a**2)/2
fb=(b**2)/2
!---------------CALCULO DE DELTA X-----------------------------------
deltax=(b-a)/ne
write(*,*)'Delta x es igual a', deltax
!------------------Neutro aditivo--------------------------------------------
suma=0
!------------------APERTURA DEL ARVHIVO-------------------------
open(UNIT =LU,FILE='integraldatos.txt')

!---------------------LECTURA DE VALORES-------------------------
DO
read(LU,*,IOSTAT=ierror)x
if(ierror/=0)exit
n=n+1
fx=(x**2)/2
suma=suma+fx
write(*,*)'Fx=', fx
end do
write(*,*)'La suma es=', suma
integral=(suma+(fa+fb)/2)*deltax

!----------------------IMPRESIÓN DE RESULTADOS----------------
write(*,*)'el resultado de la integral es=', integral
!---------------------FINALIZAR PROGRAMA-------------------------
end program intetra

CÒDIGO EN FORTRAN

11
BLOC DE NOTA CON VALORES

CAPTURA DE PANTALLA

12
3- Lectura de datos “x” y “y”, con su derivación numérica.

13
CÒDIGO
program der

implicit none
INTEGER::i,n,ie,kl
REAL::x1,x2,y1,y2,m
real dimension(60),x0,y0
WRITE(*,*)"PROGRAMA DERIVADAS NUMERICAS"
WRITE(*,*)"DERIVADA CENTRADA=1,ADELANTE=2,ATRAS=3"
READ(*,*)n
OPEN(unit=10,file='datos.txt')
OPEN(unit=11,file='daty.txt')
do i=1,5
read(10,*,IOSTAT=ie)x0
print*,x0
end do
do i=1,5
read(11,*,IOSTAT=kl)y0
print*,y0
end do
if (n==1) then
WRITE(*,*)"INGRESE EL LOS VALORES DE X2,Y2"
READ(*,*)x2,y2
m=(x2-x0)/(y2-y0)
WRITE(*,*)"el valor de m es",m
end if
if(n==2) then
WRITE(*,*)"INGRESE EL LOS VALORES DE X1,Y1,X2,Y2"
READ(*,*)x1,y1,x2,y2
m=(x2-x1)/(y2-y1)
WRITE(*,*)"el valor de m es",m
end if
if(n==3) then
WRITE(*,*)"INGRESE EL LOS VALORES DE X1,Y1"
READ(*,*)x1,y1
m=(x1-x0)/(y1-y0)
WRITE(*,*)"el valor de m es",m
end if
CLOSE(10)
CLOSE(11)
end program der

CÒDIGO EN FORTRAN

14
4- Factorial como subrutina y agregar el cálculo de serie de potencias.

15
CÒDIGO
program principal_prueba
implicit none
integer j,ifact
write(*,*)'Programa para calcular factorial'
write(*,*)'Ingresa el numero que deseas obtener factorial'
read *,j
! ifact es una función externa y j es el argumento actual
write (*,*)'El factorial de',j," es",ifact(j)
end program principal_prueba
function ifact(k)
implicit none
integer k,ifact,i
! Cálculo del factorial de k
! k es el argumento fingido
ifact=1
do i=2,k
ifact=ifact*i
end do
! el resultado devuelto es el valor almacenado en la variable ifact
return
end function ifact

SUBROUTINE factorial (k, resultado)


INTEGER, INTENT(IN):: k
INTEGER, INTENT(OUT):: resultado
INTEGER :: temp
IF (k>=1) THEN
CALL ifact (k-1, temp)
resultado=k*temp
ELSE
resultado=1
ENDIF
END SUBROUTINE factorial

CÒDIGO EN FORTRAN

16
5- Punto fijo, 2 variables.

17
CÒDIGO
program punto_fijo
!este programa sirve para calcular la T de burbuja
implicit none
!variables a utilizar
real::gama1,gama2,Lng1,Lng2,T,P,x1,x2,Pcal,Tcal,Error,Tsup,To
real::s
integer::i,n,m
real,dimension(5)::a,b,c,LogPo,Po
write(*,*)'Este programa sirve para calcular la T de burbuja'
write(*,*)'ingresa el valor de la presion del sistema en mmHg'
read(*,*)P
write(*,*)'Ingresa la fraccion mol del primer componente'
read(*,*)x1
x2=1-x1
write(*,*)'El valor de las constantes de Antoine para cada compuesto'
do i=1,2,1
! valores de las constantes de Antonie para cada compuesto
write(*,*)'Ingresa los valores para la ecuacion de Antoine'
write(*,*)'a'
read(*,*)a(i)
write(*,*)'b'
read(*,*)b(i)
write(*,*)'c'
read(*,*)c(i)
end do
s=2
do while (s==2)
!iteracion para calcular la T
write(*,*)'Suponer un valor de temperatura en øC'
read(*,*)T
do i=1,2,1
LogPo(i)=(a(i)-(b(i)/(c(i)+T)))
Po(i)=(10**(LogPo(i)))
end do
Lng1=((0.287+(2*(0.257-0.287)*x1))*(x2**2))
lng2=((0.257+(2*(0.287-0.257)*x2))*(x1**2))
gama1=exp(Lng1)
gama2=exp(Lng2)

Pcal=(Po(1)*x1*gama1)+(Po(2)*x2*gama2)
Error=((P-Pcal)/P)*100
write(*,*)'El error es=',Error

18
write(*,*)'P sistema',P
write(*,*)'Pcal',Pcal

end do
write(*,*)'La temperatura es=',T
pause
end program punto_fijo

CÒDIGO EN FORTRAN

19

Das könnte Ihnen auch gefallen