electromagnetismo i -...
TRANSCRIPT
Electromagnetismo I
Semestre: 2015-2
Prof. Alejandro Reyes Coronado
Ayud. Carlos Alberto Maciel Escudero
Ayud. Christian Esparza Lopez
Solucion al Proyecto 1
Solucion por Carlos Maciel Escudero
Solucion Proyecto 1
Genera un programa de computo que calcule numericamente la solucion a la ecuacion deLaplace en dos dimensiones para un conjunto discreto de puntos. Los puntos de la fronteraexterior se encuentran a un potencial φ = 0, mientras que los puntos de la frontera internaestan a un potencial igual a φ = 100.
Solucion
Para resolver el problema se programo el Metodo de Relajacionel en Fortran 90. El metodoestablece que en el punto (xo, yo) el potencial φ (xo, yo) se encuentra determinado por el valorque toma este ultimo en sus vecinos simetricos, como se muestra en la figura.
La idea para demostrar lo anterior es expandir en Taylor cada uno de los potenciales vecinos:
φ (xo ± δ, yo) = φ (xo, yo)±∂φ
∂x
∣∣∣∣x=xo
δ +1
2
∂2φ
∂x2
∣∣∣∣x=xo
δ2 +O(δ3)
φ (xo, yo ± δ, zo) = φ (xo, yo)±∂φ
∂y
∣∣∣∣y=yo
δ +1
2
∂2φ
∂y2
∣∣∣∣y=yo
δ2 +O(δ3)
Entonces a segundo orden resulta que
φ (xo ± δ, yo) + φ (xo, yo ± δ) = 4φ (xo, yo) + ∇2φ∣∣(x=xo,y=yo)
δ2
Como el potencial electrostatico satisface la ecuacion de Laplace,
φ (xo, yo) =φ (xo + δ, yo) + φ (xo − δ, yo) + φ (xo, yo + δ) + φ (xo, yo − δ)
4
lo cual prueba el argumento anterior.
Una vez entendido la idea del metodo, podemos utilizar este resultado para resolver el pro-blema del proyecto. De forma que, el programa en Fortran 90 debe calcular el promedio delpotencial en cada punto conocidos los potencial vecinos. Con la intencion de resolver lo anterior,programe 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. Despues, esteinvoca una subrutina, denominada relajacion, que calcula una nueva matriz con el promediode los cuatro primeros vecinos y compara la matriz inicial con la nueva. Si la magnitud de ladiferencia de las matrices es mayor o igual a prec entonces vuelve a calcular una nueva matrizcon los promedios y la compara ahora con la matriz anterior; esto lo realiza hasta alcanzaruna matriz que practicamente no muestre cambio alguna con su predecesora. Finalmente, conla matriz de potencial electrico (digamos la certera), el programa invoca la subrutina campoque calcula el campo electrostatico a partir de derivar el potencial. Tanto el potencial como elcampo se guardan en archivos .dat respectivamente.
Observaciones:
1. Para calcular la norma de una matriz utilice el producto interior definido en el espacio deHilbert de las matrıces de n× n con coeficientes en los reales, dado por: 〈A,A〉 = tr (AtA). Elcual pueden verificar que es bilineal, definido positivamente y simetrico.2. La derivada numerica que utilice para calcular el campo electrico es una derivada de trespuntos, la cual necesita el punto anterior, el posterior y el punto en cuestion para calcularla derivada. Para mayor detalle de esto pueden revisar el libro: Richard Burden, ”Analisisnumerico”.3. Al ejecutar el programa les pedira en consola que indiquen el refinamiento, esto es para queindiquen que tan fina quieren hacer la malla, es decir, cuantos puntos quieren que tenga.
2
Codigo Fortran
!---------------------------------------------------------------------------!
!------------------------------------Main-----------------------------------!
!---------------------------------------------------------------------------!
!-------------------------Declaracion 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")
!-------------Llenado de la matriz y las condiciones iniciales---------------
write(*,*) ">>Indica el refinamiento:"
read*, n
inicial=30.
m=n/10
allocate (V(n,n),Ex(n,n),Ey(n,n))
do i=1,n
do j=1,n
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)=inicial
end if
end do
end do
!---------Invoca la subrutina que calcula el metodo de relajacion------------
prec=1E-5
call relajacion(V,n,m,prec)
!----------Invoca la subrutina que calcula el campo electrico----------------
call campo(V,n,Ex,Ey)
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 Metodo de Relajacion---------------------------!
!---------------------------------------------------------------------------!
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 electrico---------------------!
!---------------------------------------------------------------------------!
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 electrostatico, las curvas equipotenciales y los vectores de campoelectrico pueden utilizar gnuplot, a continuacion les dejo el codigo para graficar cada una.
5
Codigo Gnuplot
Potencial Electrostatico
splot "potencial.dat" using 1:2:3
set xlabel "X"
set ylabel "Y"
set zlabel "V(X,Y)"
set xrange [0:100]
set yrange [0:100]
set zrange [0:100]
set title "Potencial Electrostatico"
unset key
replot
set term png
set out "potencial.png"
replot
Curvas equipotenciales
plot "potencial.dat" using 1:2:3:4 with vector head
set xlabel "X"
set ylabel "Y"
set xrange [0:100]
set yrange [0:100]
set title "Curvas Equipotenciales"
unset surface
set contour base
unset key
replot
set term png
set out "equipotenciales.png"
replot
Vectores de Campo Electrostatico
plot "campo.dat" using 1:2:3:4 with vector head
set xlabel "X"
set ylabel "Y"
set xrange [0:100]
set yrange [0:100]
set title "Lıneas de Campo Electrico"
unset key
replot
set term png
set out "campo.png"
replot
6
Yo decidı utilizar Origin para graficar cada uno de los anteriores, a continuacion les muestromis resultados:
Para realizar esta grafica solo agreguen los datos del archivo potencial.dat, luego seleccionenla ultima columna, click derecho, Properties y en Plot Designation cambien a Z. Por ultimoseleccionen 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 ultima columna, click derecho, Properties y en Plot Designation cambien a Z. Porultimo seleccionen las tres columnas vayan a Plot, Contour, XYX Contour.
Para graficar el campo vectorial agreguen los datos del archivo campo.dat, luego seleccionenla penultima columna, click derecho, Properties y en Plot Designation cambien a X. Por ultimoseleccionen las cuatro columnas vayan a Plot, Specialized, Vector XYXY.
8