用GeoGebra探究试探电荷在两个电荷产生的非匀强电场中的运动轨迹
定义电荷q1,q2,试探电荷的质量m以及q,电场力常量k,试探电荷的初始速度v0x、v0y和初始位移x0,y0以及q1,q2的位置座标A,B。
定义电势:
V(x,y)=k(q1/sqrt((x-x(A))^2+(y-y(A))^2)+q2/sqrt((x-x(B))^2+(y-y(B))^2))

定义电场强度:
E_x(x,y)=-Derivative(V,x)
E_y(x,y)=-Derivative(V,y)##由于在二维平面探究,所以不考虑k=(0,0,1)方向上的电场。##

ax(x,y)=qE_x/m
ay(x,y)=qE_y/m
dt=0.01##定义时间微分dt##
N=150##定义迭代次数N##
L1=IterationList[{(ax(Element(M,3)),ay(Element(M,3))),Element(M,1)dt+Element(M,2),Element(M,3)+Element(M,2)dt},M,{{(ax(x0,y0),ay(x0,y0)),(v0x,v0y),(x0,y0)}},N]##迭代a=(ax(r),ay(r)),v=v+a•dt,r=r+v•dt,迭代指令类似于各编程语言中的for循环。其中Element(M,1),Element(M,2)和Element(M,3)分別代表加速度a,速度v和位移r,三者都是矢量表达形式##
SetConditionToShowObject[L1,false]##隐去L1,不然我们得到的则是a,v,r所形成的点/矢量的集合,我们要求的是r的集合即电荷的轨迹点的集合,所以要想办把r的点集合提取出來##
L2=Sequence[Element(Element(L1,j),3),j,1,N]##提取r的集合即试探电荷的轨迹点##
SetPointSize[L2,2]##美观一下##
L3=Sequence[Sequence[Vector((i,j),(i,j)+scale*UnitVector[(E_x(i,j),E_y(i,j))]),i,-3,3,0.25],j,-3,3,0.25]##描繪出电场矢量场##
SetLineStyle[L3,1]##美观一下##

探究轨迹方法不唯一,以上只是其中一种,还可以使用脚本法,以及NSolveODE指令方法,个人推荐用脚本法。但上面所描述的几种方法,本质都是Euler methods,不过当用NSolveODE指令方法以及IterationList迭代方法时都容易卡顿,不过脚本法则不会出现这种情况。同样NSolveODE指令方法结果会比迭代法和脚本法更精确,根据个人爱好选择。同样,如果要探究三维空间里试探电荷在两个点电荷产生的电场中的运动轨迹,电势改为V(x,y,z)=V(x,y)=k(q1/sqrt((x-x(A))^2+(y-y(A))^2+(z-z(A))^2)+q2/sqrt((x-x(B))^2+(y-y(B))^2+(z-z(A))^2))
初始位移和初始速度添加上z0和v0z,电场强度再定义E_z=-Derivative(V,z),总之加了一个纬度。
以下两张图是脚本法制作,之前的所有量定义不变,但没有IterationList指令,而是做了一点调整,dv=a*dt,dr=v*dt。定义了滑动条t,其中滑动条t中的更新脚本如下:
{
SetValue[a,q/m*(E_x(r),E_y(r),E_z(r))];
SetValue[v,v+dv];
SetValue[r,r+dr];
}
Start以及Reset按钮里面的脚本详见其他UP主的做法。


这是第二次发了,但还是有可能有些不到位,还请各位见谅,万分感谢!