Pr‡ctica 1: Resoluci—n de Sistemas

Esta primera pr‡ctica ha consistido en el reconocimiento del lenguaje de programaci—n Fortran, as’ como su aprendizaje.

Este lenguaje, Fortran, ser‡ el lenguaje de programaci—n que utilizaremos para implementar los algoritmos que se describen en las pr‡cticas de esta asignatura. As’ ser‡ necesario el aprendizaje de este entorno de programaci—n.

TambiŽn vamos a usar en estas pr‡cticas una herramienta de apoyo gr‡fico, el entorno GnuPlot. Este programa servir‡ para representar gr‡ficamente resultados de algoritmos dados en ficheros de datos, de representaci—n de funciones,... . Por ello ser‡ una herramienta muy utilizada en estas pr‡cticas, y de gran interŽs.

Para introducir el lenguaje de programaci—n Fortran el profesor ha suministrado dos ficheros con el c—digo fuente del programa implementando el algoritmo de resoluci—n de sistemas de ecuaciones lineales de Gauss. Un fichero contendr‡ una subrutina que implementar‡ el algoritmo de Gauss y el otro fichero contendr‡ el programa principal donde ser‡n introducidos los datos iniciales del sistema y desde donde se compilar‡ y se crear‡ el fichero ejecutable correspondiente al programa del mŽtodo de Gauss.

Sobre este problema y sobre el fichero ejecutable podemos observar varias cuestiones de interŽs. En el programa principal introduciremos aleatoriamente un valor . Inicialmente tendr‡ un valor 100. Al compilar y ejecutar el programa observamos que el tiempo de ejecuci—n es inapreciable y que nos da como resultado un vector que ser‡ el resultado del sistema. El tama–o de este vector ser‡ 100, es decir . El valor que contiene este vector segœn las condiciones iniciales introducidas es 1.00000000000000.

De este modo observamos que usando un valor  m‡s elevado, como 1000, el tiempo de ejecuci—n es mucho mayor. Esto es debido al nœmero de operaciones que se realizan en cada iteraci—n del algoritmo. Con el  tan elevado realizamos muchas operaciones. As’, la cantidad de operaciones por segundo que realiza el ordenador es muy grande y tiene un coste elevado de tiempo.

Incluso con un algoritmo de este tipo, sabiendo el nœmero de iteraciones que realiza, podr’amos averiguar cuantas operaciones por segundo realiza el ordenador.

Prin1.for:

       program gauss  

 

       implicit real*8 (a-h,o-z)

       dimension c[allocatable] (:,:),x[allocatable] (:)

 

       n=1000

 

          

       allocate(c(n,n+1))

       allocate(x(n))

       do i=1,n

           do j=1,n+1

            c(i,j)=0.0d+00

           enddo

       enddo

 

       do i=2,n-1

           c(i,i)=7.0d+00

           c(i,i+1)=-4.0d+00

           c(i,i-1)=2.0d+00 

           c(i,n+1)=5.0d+00

       enddo

 

       c(1,1)=8.0d+00

       c(1,2)=-4.0d+00

       c(1,n+1)=4.0d+00

       c(n,n-1)=2.0d+00

       c(n,n)=7.0d+00

       c(n,n+1)=9.0d+00

 

       call gausspr(n,c,x)

             

       print*, 'el vector solucion es:'

       do i=1,n        

            print*,x(i)

       end do

 

       deallocate(c)

       deallocate(x)

 

       stop

       end

       include 'gausspr.for'

          

 

Gausspr.for:

       subroutine gausspr(ng,c,x)

 

       implicit real*8 (a-h,o-z)

       real*8 s[allocatable](:),nrow[allocatable](:)

       dimension c(ng,ng+1),x(ng)

       allocate(s(ng),nrow(ng))

 

       e1=0.1d-20

              

              

              

       ichg=0

 

       do i=1,ng

            nrow(i)=i

       end do

 

       do i=1,ng

            s(i)=dabs(c(i,1))

            do j=1,ng

               if(dabs(c(i,j)).gt.s(i)) s(i)=dabs(c(i,j))

            end do

            if(s(i).lt.e1) then

                  print*, 'el sistema no tiene solucion unica'

                  stop

            end if 

       end do

 

 

       nn=ng-1

       

       do i=1,nn

 

            imax=nrow(i)

            amax=dabs(c(imax,i))/s(imax)

            imax=i

            jj=i+1

             

            do ip=jj,ng

                jp=nrow(ip)

                if(dabs(c(jp,i))/s(jp).gt.amax) then

                       amax=dabs(c(jp,i))/s(jp)   

                       imax=ip

                end if

            end do

 

            if(amax.lt.e1) then

                   print*, 'el sistema no tiene solucion unica'

                   stop

            end if 

 

 

            if(nrow(i).ne.nrow(imax)) then

                      ichg=ichg+1

                      ncopy=nrow(i)

                      nrow(i)=nrow(imax)

                      nrow(imax)=ncopy

            end if

 

 

            ik=nrow(i)

            do j=jj,ng

               j1=nrow(j)

               xm=c(j1,i)/c(ik,i)

               do k=jj,ng+1

                  c(j1,k)=c(j1,k)-xm*c(ik,k)

               end do

               c(j1,i)=xm

            end do

       end do

 

       n1=nrow(ng)

       if(dabs(c(n1,ng)).lt.e1) then

                  print*, 'el sistema no tiene solucion unica'

                  stop

       end if

 

       c(n1,ng+1)=c(n1,ng+1)/c(n1,ng)

 

       do k=1,nn

            i=nn-k+1

            jj=i+1

            n2=nrow(i)

            sum=c(n2,ng+1)

            do kk=jj,ng

                ll=nrow(kk)

                sum=sum-c(n2,kk)*c(ll,ng+1)

            end do

            c(n2,ng+1)=sum/c(n2,i)

       end do

       

       do i=1,ng        

            x(i)=c(nrow(i),ng+1)

       end do

       deallocate(nrow)

       deallocate(s)

 

       return

       end

          

 

 

 



Alojamiento con 500GB de espacio y 5000GB de ancho de banda por 4 euros al mes
Cómo contratar servicios de hosting con Dreamhost
Descuento, promocode para dreamhost de $50