Смекни!
smekni.com

Исследование и моделирование с помощью компьютера электрических полей (стр. 2 из 4)

Для поля, образованного одним точечным зарядом формула потенциала будет выглядеть следующим образом:

Если электрическое поле задается не одним, а рядом электрических зарядов, то в этом случае потенциал равен алгебраической сумме потенциалов, создаваемыми всеми электрическими зарядами в данной точке, то есть:

Разность потенциалов

Разностью потенциалов называют алгебраическую разность потенциалов двух точек пространства.

Разность потенциалов между двумя точками также называют напряжением.

Работа по перемещению электрического заряда между двумя точками в электрическом поле пропорциональна разности потенциалов между двумя данными точками, а именно: разность потенциалов между двумя точками равна отношению работы поля по перемещению заряда из начальной точки в конечную, к величине этого заряда. Или:

Эквипотенциальные поверхности

Если разность потенциалов между двумя точкам, равна нулю, то эти точки лежат на одной линии, называемой эквипотенциалью на плоскости или эквипотенциальной поверхностью в пространстве.

Итак, эквипотенциальной поверхностью называют такую поверхность, в каждой точке которой потенциалы равны.

При движении электрического заряда по эквипотенциальной поверхности, работа кулоновских сил равна нулю. Вследствие этого эквипотенциальная поверхность в каждой своей точки перпендикулярна вектору напряженности в данной точке. Докажем это.

В самом деле, ΔA=FΔlcosα. Если ΔA=0, при F≠0 и l≠0, то cosα=0, следовательно, α=π/2. □

Кроме того, вектор напряженности направлен в сторону уменьшения потенциала. Особенно хорошо это видно на примере одиночного заряда.

Подобно силовым линиям, эквипотенциальные поверхности качественно характеризуют распределение поля в пространстве.

Компьютерное моделирование

В дальнейших пунктах я хочу рассказать о возможностях программы и дать краткие описания алгоритмам, реализованным в программе. Описание алгоритмов носит, в основном, общий, ознакомительный характер, и не содержит углублений в область информатики.

Моделирование силовых линий

Итак, нам известно, что в каждой точке линии напряженности вектор напряженности направлен по касательной к этой линии. То есть, фактически, нам надо знать направление вектора напряженности в данной точке пространства.

Направление вектора можно просчитать с помощью метода координат: соответствующие координаты вектора суммы равны сумме соответствующих координат векторов-«слагаемых». Таким образом, для направления вектора мы получаем двойку чисел (x; y), которые являются координатами радиус-вектора суммы.

Просчитав направление результирующего вектора напряженности, из данной точки строим линию, с таким же направлением, как и вектор напряженности. На данной линии от данной точки по направлению вектора напряженности откладываем расстояние h. Для большей точности надо сделать так, чтобы h→0, однако тогда построение займет достаточно много времени, поэтому необходимо найти такое h, чтобы отношение «качество-время» было бы оптимальным.

Отложив величину h, мы получаем следующую точку, с которой проделываем те же самые операции.

Необходимо также учитывать, что для положительных зарядов направление откладывания величины h и вектора напряженности совпадают, а для отрицательных зарядов эти направления противоположно направлены.

Моделирование эквипотенциальных линий

Для построения эквипотенциальных линий можно было бы пользоваться тем свойством, что эквипотенциальные линии перпендикулярны линиям напряженности, однако этот метод дает достаточно большую погрешность, которая возникает и накапливается из-за конкретного, отличного от 0 значения h (см. пункт «Моделирование линий напряженности»).

Поэтому плоскость можно разбить на какую-либо сетку, причем сторону квадрата сетки надо постараться взять как можно наименьшей. Для экрана такая сторона равняется одному пикселю.

Пусть нам дана точка, через которую следует построить эквипотенциальную линию, тогда мы вычисляем потенциал в четырех соседних клетках сетки и переходим в ту точку (клетку), для которой разность потенциалов с данной точкой наименьшая. Теперь и нас есть другая точка, повторяем те же операции, с одним лишь изменением: разность потенциалов должна быть наименьшей не с предыдущей точкой, а с первоначальной.

Таким образом мы продолжаем строить линию до тех пор, пока не вернемся в первоначальную точку.

Возможности программы

Программа может применяться как демонстрация теоретического материала, изложенного на уроке физики. Кроме того, программа позволяет заниматься поверхностной исследовательской деятельностью.

Список возможностей программы (считается, что электрическое поле задано расстановкой зарядов):

  1. По данному электрическому полю рисовать общий план линий напряженности
  2. По данному электрическому полю исследовать линии напряженности (т.е. строить через заданную точку линию напряженности).
  3. По данному электрическому полю исследовать эквипотенциальные линии (т.е. строить через данную точку эквипотенциальную линию).
  4. По данному электрическому полю вычислять напряженность и потенциал в заданной точке поля.
  5. По данному электрическому полю вычислять параметры электрического поля в заданной точке.

Список используемой литературы

1. Буховцев Б.Б., Климонтович Ю.Л., Мякишев Г.Я., «Физика. Учебное пособие для 9 класса», М: «Просвещение», 1975.

2. Дик Ю.И., Кабардин О.Ф. и другие «Физика. Учебное пособие для 10 класса», М: «Просвещение», 1993.

Приложение

Листинг программы

Модуль Main.pas


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;