作者:王一哲
日期:2019/12/1
前言
這是一個選修物理上第6章靜電學的題目,但是題目只會問圓心處或是圓心上一段距離處的電場,因為這些位置才能利用對稱性計算電場量值,如果想計算其它位置的電場該怎麼辦?由於我們在 VPython 教學〈
靜電力及簡諧〉程式 19-3 已經寫過類似的東西,應該可以從這支程式開始修改。
用 VPython 計算空間中各處的電場
GlowScript 版本
from vpython import *
"""
1. 參數設定, 設定變數及初始值
"""
Q, R, N = 2E-11, 1, 100
q, r = Q/N, 0.01*R
L = 4.1*R
ke = 8.988E9
num = 100
"""
2. 產生帶電球體類別, 回傳帶電球體產生的電場
"""
class Ball:
def __init__(self, pos, radius, color, charge):
self.pos = pos
self.radius = radius
self.color = color
self.charge = charge
self.ball = sphere(pos=self.pos, radius=self.radius, charge=self.charge, color=self.color)
def electric(self, pos2):
return ke*self.charge / mag2(pos2-self.pos) * norm(pos2-self.pos)
"""
3. 畫面設定
"""
scene = canvas(title="Electric Field (Circle)", width=600, height=600, x=0, y=0,
background=color.black, center=vec(0, 0, 0), range=L)
balls = [Ball(pos=vec(R*cos(i*2*pi/N), R*sin(i*2*pi/N), 0), radius=r, color=color.white, charge=q) for i in range(N)]
locations = []
'''
for i in range(num+1):
locations.append(vec(L/num*i - L/2, 0, 0))
'''
for i in range(num+1):
for j in range(num+1):
locations.append(vec(L/num*i - L/2, L/num*j - L/2, 0))
'''
for i in range(num+1):
for j in range(num+1):
for k in range(num+1):
locations.append(vec(L/num*i - L/2, L/num*j - L/2, L/num*k - L/2))
'''
fields = [arrow(pos=location, axis=vec(0, 0, 0), color=color.green) for location in locations]
with open("ElectricFieldCircleData.csv", "w", encoding="UTF-8") as file:
file.write("x, y, E, Ex, Ey\n")
fmax = 0
for field in fields:
for ball in balls:
field.axis += ball.electric(field.pos)
with open("ElectricFieldCircleData.csv", "a", encoding="UTF-8") as file:
file.write(str(field.pos.x) + "," + str(field.pos.y) + "," + str(field.axis.mag) + "," + str(field.axis.x) + "," + str(field.axis.y) + "\n")
if(field.axis.mag >= fmax): fmax = field.axis.mag
for field in fields:
field.color = vec(field.axis.mag/fmax, 1 - field.axis.mag/fmax, 0)