2010년 7월 29일 목요일

구 표면 위의 벡터 필드 그리기

먼저 1 C(쿨롱)과 -1 C의 전하가 각기 (0,0,-1)과 (0,0,1)의 위치에 있을 때, 이들이 생성하는 전기장을 구해보자. 이들 두 전하가 만드는 포텐셜을 구하고, 이 포텐셜의 음의 기울기를 구하면 전기장을 알 수 있다.
φ[x, y, z] == 1/(4 π Subscript[ε, 0])
(1/Norm[{x, y, z} - {0, 0, -1}] - 
  1/Norm[{x, y, z} - {0, 0, 1}])
% // Simplify[#, x_ \[Element] Reals] &
% // Map[-HoldForm@Grad[#, Cartesian[x, y, z]] &, #] & // 
  ReplaceAll[#, -HoldForm@
       Grad[φ[x, y, z], Cartesian[x, y, z]] -> 
     OverVector[Ε]] & // ReleaseHold
eq1 = %;


편의를 위해, 공통 계수를 없애면 아래와 같은 벡터 필드 방정식을 얻을 수 있다.
4 π Subscript[ε, 0] eq1[[2]]
eq2 = %;

이 수식을 VectorPlot3D 함수를 이용해서 필드를 그리면, 직육면체 영역 안에서 전기장을 나타내는 벡터들을 보여준다.
eq2
% // VectorPlot3D[#, {x, -1, 1}, {y, -1, 1}, {z, -1, 1},
   VectorScale -> {Automatic, Automatic, None},
   VectorColorFunction -> "Rainbow"] &

이제 원점에서 1의 거리에 있는 전기장만을 그리려면, 즉 반지름이 1인 원의 표면 위에 있는 벡터만을 그리려면 어떻게 해야 할까? ‘델타함수의 그래프 그리기’에서 한 것처럼 기본 Plot 계열의 함수가 처리해 주지 못할 때엔 ListPlot 계열의 함수를 이용하는 방법을 생각해본다.
Table[{r, θ, ф}, {r, 1, 1}, {θ, 0, π, π/
    10}, {ф, 0, 2 π, π/10}] // Flatten[#, 2] &;
% // Map[CoordinatesToCartesian[#, Spherical] &, #] &;
% // Map[{#, (4 π Subscript[ε, 0]
          eq1[[2]] /. {x -> #[[1]], y -> #[[2]],
         z -> #[[3]]})} &, #] &;
% // ListVectorFieldPlot3D[#, Axes -> True,
   AxesLabel -> {"x", "y", "z"}, VectorHeads -> True,
   ScaleFunction -> (0.2 &)] &
이 복잡한 명령어들이 하는 일은 다음과 같다. 우선, 첫 번째 줄에서 구 좌표계를 이용해서 구 표면 위의 일정한 좌표를 얻는다. 두 번째 줄에선 우리가 가진 식이 직교 좌표계의 식이므로 구 좌표계의 좌표를 직교 좌표계의 좌표로 바꾼다. 세 번째 줄에선 좌표를 식에 대입해서 그래프를 그릴 자료를 생성한다. 네 번째 줄에서는 ListVectorFieldPlot3D를 이용해서 전기장의 그래프를 그린다.



버전 7.0에선 ListVectorFieldPlot3D보다 ListVectorPlot3D를 사용하길 권하지만, ListVectorPlot3D에 아직 문제가 있는 듯이 보인다.

댓글 없음:

댓글 쓰기