φ[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에 아직 문제가 있는 듯이 보인다.