Для поля, образованного одним точечным зарядом формула потенциала будет выглядеть следующим образом:
Если электрическое поле задается не одним, а рядом электрических зарядов, то в этом случае потенциал равен алгебраической сумме потенциалов, создаваемыми всеми электрическими зарядами в данной точке, то есть:
Разностью потенциалов называют алгебраическую разность потенциалов двух точек пространства.
Разность потенциалов между двумя точками также называют напряжением.
Работа по перемещению электрического заряда между двумя точками в электрическом поле пропорциональна разности потенциалов между двумя данными точками, а именно: разность потенциалов между двумя точками равна отношению работы поля по перемещению заряда из начальной точки в конечную, к величине этого заряда. Или:
Если разность потенциалов между двумя точкам, равна нулю, то эти точки лежат на одной линии, называемой эквипотенциалью на плоскости или эквипотенциальной поверхностью в пространстве.
Итак, эквипотенциальной поверхностью называют такую поверхность, в каждой точке которой потенциалы равны.
При движении электрического заряда по эквипотенциальной поверхности, работа кулоновских сил равна нулю. Вследствие этого эквипотенциальная поверхность в каждой своей точки перпендикулярна вектору напряженности в данной точке. Докажем это.
В самом деле, ΔA=FΔlcosα. Если ΔA=0, при F≠0 и l≠0, то cosα=0, следовательно, α=π/2. □
Кроме того, вектор напряженности направлен в сторону уменьшения потенциала. Особенно хорошо это видно на примере одиночного заряда.
Подобно силовым линиям, эквипотенциальные поверхности качественно характеризуют распределение поля в пространстве.
В дальнейших пунктах я хочу рассказать о возможностях программы и дать краткие описания алгоритмам, реализованным в программе. Описание алгоритмов носит, в основном, общий, ознакомительный характер, и не содержит углублений в область информатики.
Итак, нам известно, что в каждой точке линии напряженности вектор напряженности направлен по касательной к этой линии. То есть, фактически, нам надо знать направление вектора напряженности в данной точке пространства.
Направление вектора можно просчитать с помощью метода координат: соответствующие координаты вектора суммы равны сумме соответствующих координат векторов-«слагаемых». Таким образом, для направления вектора мы получаем двойку чисел (x; y), которые являются координатами радиус-вектора суммы.
Просчитав направление результирующего вектора напряженности, из данной точки строим линию, с таким же направлением, как и вектор напряженности. На данной линии от данной точки по направлению вектора напряженности откладываем расстояние h. Для большей точности надо сделать так, чтобы h→0, однако тогда построение займет достаточно много времени, поэтому необходимо найти такое h, чтобы отношение «качество-время» было бы оптимальным.
Отложив величину h, мы получаем следующую точку, с которой проделываем те же самые операции.
Необходимо также учитывать, что для положительных зарядов направление откладывания величины h и вектора напряженности совпадают, а для отрицательных зарядов эти направления противоположно направлены.
Для построения эквипотенциальных линий можно было бы пользоваться тем свойством, что эквипотенциальные линии перпендикулярны линиям напряженности, однако этот метод дает достаточно большую погрешность, которая возникает и накапливается из-за конкретного, отличного от 0 значения h (см. пункт «Моделирование линий напряженности»).
Поэтому плоскость можно разбить на какую-либо сетку, причем сторону квадрата сетки надо постараться взять как можно наименьшей. Для экрана такая сторона равняется одному пикселю.
Пусть нам дана точка, через которую следует построить эквипотенциальную линию, тогда мы вычисляем потенциал в четырех соседних клетках сетки и переходим в ту точку (клетку), для которой разность потенциалов с данной точкой наименьшая. Теперь и нас есть другая точка, повторяем те же операции, с одним лишь изменением: разность потенциалов должна быть наименьшей не с предыдущей точкой, а с первоначальной.
Таким образом мы продолжаем строить линию до тех пор, пока не вернемся в первоначальную точку.
Программа может применяться как демонстрация теоретического материала, изложенного на уроке физики. Кроме того, программа позволяет заниматься поверхностной исследовательской деятельностью.
Список возможностей программы (считается, что электрическое поле задано расстановкой зарядов):
1. Буховцев Б.Б., Климонтович Ю.Л., Мякишев Г.Я., «Физика. Учебное пособие для 9 класса», М: «Просвещение», 1975.
2. Дик Ю.И., Кабардин О.Ф. и другие «Физика. Учебное пособие для 10 класса», М: «Просвещение», 1993.
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ComCtrls, ExtCtrls, ImgList, Math, StdCtrls;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1, N2, N3, N4, N5, N6, N7, N8, N9, N10, N11, N12, N13, N14, N15, N16, N17, N18, N19, N20, N21, N23 : TMenuItem;
StatusBar1: TStatusBar;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Image1: TImage;
Memo1: TMemo;
procedure FormResize(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure N6Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N12Click(Sender: TObject);
procedure N13Click(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure N9Click(Sender: TObject);
procedure N10Click(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure N16Click(Sender: TObject);
procedure N19Click(Sender: TObject);
procedure N20Click(Sender: TObject);
procedure N14Click(Sender: TObject);
private
public
end;
Procedure DrawGrid;
Procedure RefreshSquare(X,Y:Byte);
Procedure Circle(X,Y,R:Real;W:Byte);
Procedure RefreshStatus(X,Y:Byte);
Procedure ElTrack(X,Y:Real;B,K:Integer);
Procedure ElTrackForMoving(X,Y:Real;K:Integer;Stop:Real);
Procedure ElRefresh;
Procedure Prepare;
Procedure Stop;
Procedure Redactor;
Procedure PaintLines;
Function CheckEkviBegin(X,Y:Integer):Boolean;
Function Potenc(X,Y:Integer):Real;
type Matrix=Array[0..63,0..47] of ShortInt;
type Position=Record
X:Integer;
Y:Integer;
end;
var
Form1: TForm1;
En:Array[0..9] of Position;
Z,EnNow:ShortInt;
Qc : Matrix;
Qrc: Array [1..3071,1..3] of SmallInt;
Last,LastEkv:Array of Array [1..2] of SmallInt;
Ekv: Array[-1600..1600,-1200..1200] of Boolean;
Nc:SmallInt;
EkX,EkY,A:Integer;
F : File of Matrix;
Xxl,CalcA,EkviExpl,LineExpl:Boolean;
Xm,Ym,LastSin:Real;
E0:Array of Position;
implementation
uses Option, Calc, About;
{$R *.DFM}
Procedure DrawGrid;
Var I:Integer;
Begin
Form1.Canvas.Pen.Color:=clWhite; I:=0;
While (I<=Form1.Width) and (I<1601) do begin
Form1.Canvas.MoveTo(I,0);
Form1.Canvas.LineTo(I,Form1.Height);
Inc(I,25);
end; I:=0;
While (I<=Form1.Height) and (I<1201) do begin
Form1.Canvas.MoveTo(0,I);
Form1.Canvas.LineTo(Form1.Width,I);
Inc(I,25);
end;
End;
Procedure RefreshSquare(X,Y:Byte);
Begin
Form1.Canvas.Pen.Color:=clBlack;
Form1.Canvas.Brush.Color:=clBlack; Circle(X*25+13,Y*25+13,12,0);
RefreshStatus(X,Y);
If Qc[X,Y]=0 then Exit;
Form1.Canvas.Pen.Color:=clWhite;
If Qc[X,Y]>0 then Form1.Canvas.Brush.Color:=clRed
else Form1.Canvas.Brush.Color:=clBlue;
Circle(X*25+13,Y*25+13,Abs(4*Qc[X,Y])-1,0);
End;
Procedure Circle(X,Y,R:Real;W:Byte);
Begin
If W=0 then Form1.Canvas.Ellipse(Round(X-R),Round(Y-R),Round(X+R),Round(Y+R));
If W=1 then Form1.Image1.Canvas.Ellipse(Round(X-R),Round(Y-R),Round(X+R),Round(Y+R));
End;
Procedure RefreshStatus(X,Y:Byte);
Var Q:Integer;
St:String;
Begin
Form1.StatusBar1.Panels.Items[0].Text:='';
Form1.StatusBar1.Panels.Items[1].Text:='';
Form1.StatusBar1.Panels.Items[2].Text:='';
If Qc[X,Y]=0 then Exit;
Q:=Abs(Qc[X,Y])-1;
Q:=Round(Exp(Q*Ln(2)));
If Qc[X,Y]<0 then Q:=-Q;
St:='X = '+IntToStr(X*25+13)+'('+IntToStr(X)+')'; Form1.StatusBar1.Panels.Items[0].Text:=St;
St:='Y = '+IntToStr(Y*25+13)+'('+IntToStr(Y)+')'; Form1.StatusBar1.Panels.Items[1].Text:=St;
St:='Q = '+IntToStr(Q)+'q'; Form1.StatusBar1.Panels.Items[2].Text:=St;
End;
Procedure PaintLines;
Var I,P:Integer;
B,E:LongWord;
Begin
B:=DateTimeToTimeStamp(Now).Time;
Form1.StatusBar1.Panels.Items[4].Text:='Рисование линий напряженности... Пожалуйста, подождите...';
Prepare;
ElRefresh;
Form1.Image1.Repaint;
Form1.Image1.Canvas.Pen.Color:=clSilver;
For I:=1 to Nc do If Qrc[I,3]<0 then begin
If Qrc[I,3]=-1 then For P:=1 to Z do ElTrack(Qrc[I,1]+3*Cos(((P-1)*360/Z)*Pi/180),Qrc[I,2]+3*Sin(((P-1)*360/Z)*Pi/180),I,1);
If Qrc[I,3]=-2 then For P:=1 to 2*Z do ElTrack(Qrc[I,1]+3*Cos(((P-1)*180/Z)*Pi/180),Qrc[I,2]+3*Sin(((P-1)*180/Z)*Pi/180),I,1);
If Qrc[I,3]=-4 then For P:=1 to 4*Z do ElTrack(Qrc[I,1]+3*Cos(((P-1)*90/Z)*Pi/180),Qrc[I,2]+3*Sin(((P-1)*90/Z)*Pi/180),I,1);
Form1.Image1.Repaint;
end;
For I:=1 to Nc do If Qrc[I,3]>0 then begin
If Qrc[I,3]=1 then For P:=1 to Z do ElTrack(Qrc[I,1]+3*Cos(((P-1)*360/Z)*Pi/180),Qrc[I,2]+3*Sin(((P-1)*360/Z)*Pi/180),I,-1);
If Qrc[I,3]=2 then For P:=1 to 2*Z do ElTrack(Qrc[I,1]+3*Cos(((P-1)*180/Z)*Pi/180),Qrc[I,2]+3*Sin(((P-1)*180/Z)*Pi/180),I,-1);
If Qrc[I,3]=4 then For P:=1 to 4*Z do ElTrack(Qrc[I,1]+3*Cos(((P-1)*90/Z)*Pi/180),Qrc[I,2]+3*Sin(((P-1)*90/Z)*Pi/180),I,-1);
Form1.Image1.Repaint;
end;
ElRefresh;
E:=DateTimeToTimeStamp(Now).Time;
Form1.StatusBar1.Panels.Items[4].Text:='Готово...';
Form1.StatusBar1.Panels.Items[3].Text:=FloatToStr((E-B)/1000)+' сек';
End;
Procedure Prepare;
Var I,P,Q:SmallInt;