Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Semestre: 2015-2
Prof. Alejandro Reyes Coronado
Ayud. Carlos Alberto Maciel Escudero
Ayud. Christian Esparza López
Solución al Proyecto 1
Solución Proyecto 1
Solución
1 ∂ 2 φ
∂φ 2 3
φ (xo ± δ, yo ) = φ (xo , yo ) ± δ+ δ + O δ
∂x x=xo 2 ∂x2 x=xo
1 ∂ 2 φ
∂φ
δ2 + O δ3
φ (xo , yo ± δ, zo ) = φ (xo , yo ) ± δ+ 2
∂y y=yo 2 ∂y
y=yo
Una vez entendido la idea del método, podemos utilizar este resultado para resolver el pro-
blema del proyecto. De forma que, el programa en Fortran 90 debe calcular el promedio del
potencial en cada punto conocidos los potencial vecinos. Con la intención de resolver lo anterior,
programé un algoritmo que genera una matriz donde se guardan los valores iniciales del po-
tencial, estableciendo un valor aleatorio a aquellos puntos que no tienen asociado un potencial,
es decir, los puntos que se encuentran fuera de los contornos de los cuadrados. Después, éste
invoca una subrutina, denominada relajación, que calcula una nueva matriz con el promedio
de los cuatro primeros vecinos y compara la matriz inicial con la nueva. Si la magnitud de la
diferencia de las matrices es mayor o igual a prec entonces vuelve a calcular una nueva matriz
con los promedios y la compara ahora con la matriz anterior; esto lo realiza hasta alcanzar
una matriz que prácticamente no muestre cambio alguna con su predecesora. Finalmente, con
la matriz de potencial eléctrico (digamos la certera), el programa invoca la subrutina campo
que calcula el campo electrostático a partir de derivar el potencial. Tanto el potencial como el
campo se guardan en archivos .dat respectivamente.
Observaciones:
1. Para calcular la norma de una matriz utilicé el producto interior definido en el espacio de
Hilbert de las matrı́ces de n × n con coeficientes en los reales, dado por: hA, Ai = tr (At A). El
cual pueden verificar que es bilineal, definido positivamente y simétrico.
2. La derivada numérica que utilicé para calcular el campo eléctrico es una derivada de tres
puntos, la cual necesita el punto anterior, el posterior y el punto en cuestión para calcular
la derivada. Para mayor detalle de esto pueden revisar el libro: Richard Burden, ”Análisis
numérico”.
3. Al ejecutar el programa les pedirá en consola que indiquen el refinamiento, esto es para que
indiquen que tan fina quieren hacer la malla, es decir, cuántos puntos quieren que tenga.
2
Código Fortran
!---------------------------------------------------------------------------!
!------------------------------------Main-----------------------------------!
!---------------------------------------------------------------------------!
!-------------------------Declaración de la matriz--------------------------
program laplace
IMPLICIT NONE
real(16), allocatable :: V(:,:),Ex(:,:),Ey(:,:)
integer :: i,j,k,n,m
real(16) :: prec,Vo,inicial
open(1,file="potencial.dat",status="REPLACE")
open(2,file="campo.dat",status="REPLACE")
3
!--------Escritura del potencial y el campo en un archivo .dat---------------
do i=1,n
do j=1,n
write(1,10) i,j,V(i,j)
end do
end do
10 format("",2I6.0,F20.12)
do i=1,n
do j=1,n
write(2,20) i,j,Ex(i,j)/10.,Ey(i,j)/10.
end do
end do
20 format("",2I6.0,2F20.12)
end program
!---------------------------------------------------------------------------!
!------------------Subrutina Método de Relajación---------------------------!
!---------------------------------------------------------------------------!
subroutine relajacion(V,n,m,prec)
IMPLICIT NONE
integer, intent(in) :: n,m
real(16), dimension(n,n), intent(inout) :: V
real(16), intent(in) :: prec
integer :: i,j
real(16) :: dif
real(16), dimension(n,n) :: V_ant
dif=1.
do while (dif>=prec)
V_ant=V
do i=2,n-1
do j=2,n-1
if (i==4*m .AND. j>=4*m .AND. j<=7*m) then
V(i,j)=100.
else if (i==7*m .AND. j>=4*m .AND. j<=7*m) then
V(i,j)=100.
else if (j==4*m .AND. i>=4*m .AND. i<=7*m) then
V(i,j)=100.
else if (j==7*m .AND. i>=4*m .AND. i<=7*m) then
V(i,j)=100.
else if (i==1 .OR. i==10*m .OR. j==1 .OR. j==10*m) then
V(i,j)=0.
else
V(i,j)=(V(i-1,j)+V(i+1,j)+V(i,j-1)+V(i,j+1))/4.
end if
4
end do
end do
call magnitud(V-V_ant,n,dif)
print*, dif
end do
end subroutine
!---------------------------------------------------------------------------!
!--------------Subrutina que calcula el campo eléctrico---------------------!
!---------------------------------------------------------------------------!
subroutine campo(V,n,Ex,Ey)
IMPLICIT NONE
integer, intent(in) :: n
real(16), dimension(n,n), intent(in) :: V
real(16), dimension(n,n), intent(out) :: Ex,Ey
integer :: i,j,h
h=1
do i=2,n-1
do j=2,n-1
Ex(i,j)=-(V(i+1,j)-V(i-1,j))/(2*h)
Ey(i,j)=-(V(i,j+1)-V(i,j-1))/(2*h)
end do
end do
end subroutine
!---------------------------------------------------------------------------!
!----------Subrutina que calcula la magnitud de una matriz------------------!
!---------------------------------------------------------------------------!
subroutine magnitud(A,dimA,dif)
IMPLICIT NONE
integer, intent(in) :: dimA
real(16), dimension(dimA,dimA), intent(in) :: A
real(16), intent(out) :: dif
real(16), dimension(dimA,dimA) :: B
integer :: i
dif=0.
B=matmul(transpose(A),A)
do i=1,dimA
dif=dif+B(i,i)
end do
end subroutine
Para graficar el potencial electrostático, las curvas equipotenciales y los vectores de campo
eléctrico pueden utilizar gnuplot, a continuación les dejo el código para graficar cada una.
5
Código Gnuplot
Potencial Electrostático
Curvas equipotenciales
6
Yo decidı́ utilizar Origin para graficar cada uno de los anteriores, a continuación les muestro
mis resultados:
Para realizar esta gráfica sólo agreguen los datos del archivo potencial.dat, luego seleccionen
la última columna, click derecho, Properties y en Plot Designation cambien a Z. Por último
seleccionen las tres columnas vayan a Plot, 3D XYZ, 3D Scatter.
7
Para graficar las curvas de nivel agreguen los datos del archivo potencial.dat, luego selec-
cionen la última columna, click derecho, Properties y en Plot Designation cambien a Z. Por
último seleccionen las tres columnas vayan a Plot, Contour, XYX Contour.
Para graficar el campo vectorial agreguen los datos del archivo campo.dat, luego seleccionen
la penúltima columna, click derecho, Properties y en Plot Designation cambien a X. Por último
seleccionen las cuatro columnas vayan a Plot, Specialized, Vector XYXY.