20 | 09 | 2017
Учебные материалы
Для преподавателей
Работы студентов
Справочная и техническая литература
Статьи по темам

Задачі Знайти залежність сили взаємодії між двома провідниками

1 1 1 1 1 1 1 1 1 1 Рейтинг 0.00 (0 Голосов)

ПРИКЛАДИ РОЗРАХУНКУ ЗАДАЧ

10 I=1000:I2=1000:X11=1:X12=5:X21=1:X22=5

20 INPUT "НА СКІЛЬКИ ЧАСТИН РОЗБИТИ ПЕРШИЙ ПРОМІЖОК?";K1

30 INPUT "НА СКІЛЬКИ ЧАСТИН РОЗБИТИ ДРУГИЙ ПРОМІЖОК?";K2

40 DIM X1(K1+1),X2(K2+1),Y1(K+1),Y2(K+1),Z1(K+1),Z2(K+1)

50 N1=(X12-X11)/K1

60 X=X11

70 FOR I=1 TO K1+1

80 Y1(I)=SQR(4-(X-3)^2)+1

90 X1(I)=X:Z1(I)=0

100 X=X+N1

110 NEXT I

120 N2=(X22-X21)/K2

130 X=X21

140 FOR I=1 TO K2+1

150 Y2(I)=-SQR(4-(X-3)^2)

2.1 Приклад 1

На рисунку 2.1 зображено два провідники, центри яких лежать на однаковій віддалі від осі ординат. Віддалі між центрами провідників - d.

По першому провіднику довжиною l1,м протікає струм і1, по другому провіднику довжиною l2, м протікає струм і2. Напрямки струмів зображено на рисунку. Знайти залежність сили взаємодії між двома провідниками як функцію віддалі між центрами провідників F(d). Сила струму і1=і2=1000 А, відстань між провідниками d=1 м.

Розв’язок. Для даного випадку коефіцієнт геометрії рівний

,

.

Використовуючи формулу (1.14), визначаємо силу взаємодії між провідниками.

.

Розв’яжемо дану задачу за допомогою ЕОМ. Для її розв’язку складаємо програму, яка б визначала силу взаємодії між провідниками, в залежності від того, на скільки елементарних частин ми розіб’ємо дані провідники.

Розмістимо задані провідники в системі координат x, y,z.

Рисунок 2.2 - Розміщення двох паралельних провідників в системі координат х, у

Складаємо програму для розрахунку сили взаємодії між заданими провідниками мовою GW BASIC.

2.2 Програма мовою GW BASIС для розрахунку сили між двома провідниками

ELAP111.BAS

10 I1=1000:I2=1000

20 INPUT "НА СКІЛЬКИ ЧАСТИН РОЗБИТИ ПРОВІДНИКИ?";K

30 DIM X1(K+1),Y1(K+1),Z1(K+1)

40 DIM X2(K+1),Y2(K+1),Z2(K+1)

50 DIM A1(2),B1(2),C1(2),A2(2),B2(2),C(2)

60 PRINT "ВВЕДІТЬ КООРДИНАТИ ПЕРШОГО ПРОВІДНИКА"

70 FOR I=1 TO 2

80 PRINT "X("I")=";

90 INPUT A1(I)

100 PRINT "Y("I")=";

110 INPUT B1(I)

120 PRINT "Z("I")=";

130 INPUT C1(I)

140 NEXT I

150 PRINT "ВВЕДІТЬ КООРДИНАТИ ДРУГОГО ПРОВІДНИКА"

160 FOR I=1 TO 2

170 PRINT "X("I")=";

180 INPUT A2(I)

190 PRINT "Y("I")=";

200 INPUT B2(I)

210 PRINT "Z("I")=";

220 INPUT C2(I)

230 NEXT I

235 T1=0

240 FOR I=1 TO K+1

250 X1(I)=A1(1)+(A1(2)-A1(1))*T1

260 Y1(I)=B1(1)+(B1(2)-B1(1))*T1

270 Z1(I)=C1(1)+(C1(2)-C1(1))*T1

280 T1=T1+1/K

290 NEXT I

295 T2=0

300 FOR I=1 TO K+1

310 X2(I)=A2(1)+(A2(2)-A2(1))*T2

320 Y2(I)=B2(1)+(B2(2)-B2(1))*T2

330 Z2(I)=C2(1)+(C2(2)-C2(1))*T2

340 T2=T2+1/K

350 NEXT I

360 PX=0:PY=0:PZ=0

370 FOR I=1 TO K

380 SX=0:SY=0:SZ=0

390 FOR J=1 TO K

400 L1X=X1(J+1)-X1(J):L1Y=Y1(J+1)-Y1(J):L1Z=Z1(J+1)-Z1(J)

410 RX=X2(I)-X1(J):RY=Y2(I)-Y1(J):RZ=Z2(I)-Z1(J)

420 R=(SQR(RX^2+RY^2+RZ^2))^3

430 AX=(L1Y*RZ-L1Z*RY)*I1/R

440 AY=(L1Z*RX-L1X*RZ)*I1/R

450 AZ=(L1X*RY-L1Y*RX)*I1/R

460 SX=SX+AX:SY=SY+AY:SZ=SZ+AZ

470 NEXT J

480 L2X=X2(I+1)-X2(I):L2Y=Y2(I+1)-Y2(I):L2Z=Z2(I+1)-Z2(I)

490 FX=(L2Y*SZ-L2Z*SY)*I2

500 FY=(L2Z*SX-L2X*SZ)*I2

510 FZ=(L2X*SY-L2Y*SX)*I2

520 PX=PX+FX:PY=PY+FY:PZ=PZ+FZ

530 NEXT I

540 F=SQR(PX^2+PY^2+PZ^2)/(10^7)

550 PRINT "K=";K,"F=";F;"H"

560 END

Дану програму можна умовно розділити на такі частини :

- з 10 по 230 рядок - ввід даних;

-  з 240 по 350 рядок - розбиття заданих провідників на k елементарних провідників. Формування масивів координат точок елементарних провідників. Цю частину програми кожен студент пише самостійно, в залежності від форми і розташування провідника.

-  - з 360 по 560 - визначення коефіцієнту геометрії і розрахунок сили взаємодії між заданими провідниками.

Дана частина програми може бути використана при розрахунку сум взаємодії між провідниками будь-якої конфігурації і довільного розташування в просторі.

Результати розрахунку

К=1 F=10 H.

K=5 F=2,329093 H.

K=10 F=1,854724 H.

K=30 F=1,811859 H.

K=50 F=1,810644 H.

K=100 F=1,810141 H.

K=200 F=1,810015 H.

Як ми бачимо, чим на більшу кількість елементарних частин ми розбиваємо провідники, тим вища точність розрахунку. Порівнявши результати розрахунку, які отримали аналітичним шляхом, із результатами, які отримали за допомогою ЕОМ, побачимо, що похибка при розбитті провідників на К=200 частин складає біля 0.0015 відсотків, що задовольняє наші розрахунки. Отже можна зробити висновок, що дана програма, яка наведена вище значно спрощує і полегшує розрахунки та дає досить точні результати.

2.3 ПРИКЛАД 2

На рисунку 2.2 зображено два провідники, центри яких лежать на однаковій віддалі від осі ординат. Віддалі між центрами провідників - d.

По першому провіднику з радіусом R1 протікає струм і1, по другому з радіусом R2 - струм і2. Напрямки струмів зображено на рисунку. Знайти залежність сили взаємодії між двома провідниками F(d) в функції віддалі між центрами провідників.

Розв’язок. Опишемо задані провідники алгебричними рівняннями. Для цього розмістимо їх в системі координат Х, У,Z.

Рисунок 2.2 - Схема до задачі 2 в системі координат Х, У,Z

Геометрично перший провідник являє собою півколо радіусом R1=3 м, з центром у точці О1. Тоді

(х-3)2+(у-6)2=R12=4.

Звідси

.

Оскільки у нас тільки нижня частина кола, то для вводу в ЕОМ його рівняння матиме вигляд

,

Другий провідник - це також півколо радіусом R2=3 м, з центром у точці О2

(х-3)2+(у-1)2=R12=4,

,

.

Складаємо програму для розрахунку сили взаємодії між заданими провідниками. Програму складаємо на мові GW BASIC.

2.4 Програма на GW BASIС для розрахунку сили між двома провідниками

ELAP112.BAS.

160 X2(I)=X:Z2(I)=0

170 X=X+N2

180 NEXT I

190 PX=0:PY=0:PZ=0

200 FOR I=1 TO K

210 SX=0:SY=0:SZ=0

220 FOR J=1 TO K

230 SX=0:SY=0:SZ=0

250 FOR J=1 TO K

260 L1X=X1(J+1)-X1(J):L1Y=Y1(J+1)-Y1(J):L1Z=Z1(J+1)-Z1(J)

270 RX=X2(I)-X1(J):RY=Y2(I)-Y1(J):RZ=Z2(I)-Z1(J)

280 R=(SQR(RX^2+RY^2+RZ^2))^3

290 AX=(L1Y*RZ-L1Z*RY)*I1/R

300 AY=(L1Z*RX-L1X*RZ)*I1/R

310 AZ=(L1X*RY-L1Y*RX)*I1/R

320 SX=SX+AX:SY=SY+AY:SZ=SZ+AZ

330 NEXT J

340 L2X=X2(I+1)-X2(I):L2Y=Y2(I+1)-Y2(I):L2Z=Z2(I+1)-Z2(I)

350 FX=(L2Y*SZ-L2Z*SY)*I2

360 FY=(L2Z*SX-L2X*SZ)*I2

370 FZ=(L2X*SY-L2Y*SX)*I2

380 PX=PX+FX:PY=PY+FY:PZ=PZ+FZ

390 NEXT I

400 F=SQR(PX^2+PY^2+PZ^2)/(10^7)

410 PRINT "K=";K,"F=";F;"H"

420 END

Дану програму можна умовно розділити на такі частини :

- з 10 по 110 рядок - ввід даних;

- з 120 по 300 рядок - розбиття заданих провідників на k елементарних провідників. Формування масивів координат точок елементарних провідників.

- з 310 по 420 - визначення коефіцієнту геометрії і розрахунок сили взаємодії між заданими провідниками.

Результати розрахунку

К1=1 К2=1 F=0,1496877 H.

K1=2 К2=2 F=1,1046811 H.

K1=3 К2=3 F=0,6581253 H.

K1=4 К2=4 F=0,6007193 H.

K1=5 К2=5 F=0,5844756 H.

К1=10 К2=10 F=0,5800542 Н.

K1=50 К2=50 F=0,5824772 H.

K1=100 К2=100 F=0,5826688 H.

Порівнявши результати розрахунку, які отримали аналітичним шляхом, із результатами, які отримали за допомогою ЕОМ побачимо, що похибка складає біля 0.0015 відсотків, що задовольняє наші розрахунки. Отже можна зробити висновок, що дана програма, яка наведена вище, значно спрощує і полегшує розрахунки та дає досить точні результати.

2.5 Програма мовою DELPHY для розрахунку сили взаємодії між двома провідниками Eforce

Eforce - програма для розрахунку сил, що діють на два провідники довільної форми в просторі.

В разі якщо провідники мають лінійну конфігурацію розбиття на координати робиться програмою автоматично відповідно до вказаної точності та кількості спроб. Тобто програма робить декілька спроб розрахунку сили, з кожним разом збільшуючи кількість ділянок на які розбиваються провідники. Розрахунок припиняється після досягнення заданої точності - різниця між розрахованою силою та попереднім результатом повинна бути менша одиниці поділеної на величину задану користувачем програми. Щоб уникнути зациклення програми, у випадку? якщо потрібної точності досягнути не вдається, задається максимальна кількість спроб - розрахунок буде припинено при досягненні цієї цифри.

Якщо провідники мають нелінійну конфігурацію, то точки необхідно задавати вручну. Для цього необхідно створити файл в якому послідовно ввести координати точок розділюючи їх крапкою з комою. Після цього, за допомогою кнопки "Відкрити" викликати стандартний діалог для відкриття файлу і вказати в ньому файл з координатами.

Рисунок 2.3 - Програма Eforce

Приклад вихiдних даних:

Вмiст файлу

Пояснення

1000;1000;

Перший рядок - струми, що протiкають в першому i другому провiднику

5;1;2;6;1;0;

5;1,3;2,1;6;1,3;0,23;

5;1,6;2,2;6;1,6;0,46;

5;2;2,3;6;2;0,7;

5;2,5;2,4;6;2,4;0,93;

5;2,6;2,5;6;2,8;1,16;

5;3;2,6;6;3;1,4;

5;3,3;2,7;6;3,5;1,63;

5;3,6;2,8;6;3,8;1,87;

5;4;2,9;6;4;2,1;

Наступнi рядки - координати точок

x1, y1, z1, x2, y2, z2.

x1, y1, z1 – координати першого провiдника

x2, y2, z2 – другого.

Окрім координат провідників, для розрахунку сил необхідно ввести наступні дані:

Точність - точність, яку буде прагнути досягнути програма при розрахунку.

Струм І1, струм І2 - струми, що протікають через провідники.

Макс. к-сть спроб - максимальна кількість спроб розрахунку сили, при досягненні цієї межі розрахунок буде припинено, незалежно від досягненої точності.

Після завершення вводу даних можна продовжити розрахунок натиснувши кнопку "Розрахувати силу".

Рисунок 2.4 - Результати розрахунку

Після завершення розрахунку програма виводить на екран таблицю, що містить дані про залежність коефіцієнту геометрії К та сили F від кількості відрізків, на які були розбиті провідники. Результати розрахунку можна зберегти в файл і роздрукувати використовуючи програму Microsoft Excell.

Рисунок 2.5 - Координати відрізків

Окрім результатів розрахунку ви можете побачити координати відрізків на які було розбито провідники.

2.5.1 - Вихідний код програми

unit main;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls,

Forms, Dialogs, Grids, StdCtrls, Buttons, ExtCtrls,

ComCtrls, Spin;

type

TXYZ= array [1..3] of currency;

TForm1 = class(TForm)

Pages: TPageControl;

Tab1: TTabSheet;

Tab2: TTabSheet;

Tab3: TTabSheet;

SG1: TStringGrid;

SGNum: TStringGrid;

SGRes: TStringGrid;

SBCalc: TSpeedButton;

EdE: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

EdI1: TEdit;

Edi2: TEdit;

SpinC: TSpinEdit;

Label4: TLabel;

RB1: TRadioButton;

RB2: TRadioButton;

SBOpen: TSpeedButton;

OpenDlg: TOpenDialog;

SpeedButton1: TSpeedButton;

SaveDlg: TSaveDialog;

MemoRes: TMemo;

procedure FormCreate(Sender: TObject);

procedure SBCalcClick(Sender: TObject);

procedure RB1Click(Sender: TObject);

Function NextVal:String;

procedure SBOpenClick(Sender: TObject);

procedure SpeedButton1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

DataStr:String;

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

Function TForm1.NextVal:String;

begin

NextVal:=Copy(DataStr,1,Pos(';',DataStr)-1);

DataStr:=Copy(DataStr, Pos(';',DataStr)+1,length(DataStr));

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

SG1.Cells[0,0]:='';

SG1.Cells[0,1]:='Точка A';SG1.Cells[0,2]:='Точка B';SG1.Cells[0,3]:='Точка C';SG1.Cells[0,4]:='Точка D';

SG1.Cells[1,0]:='X';SG1.Cells[2,0]:='Y';

SG1.Cells[3,0]:='Z';SG1.Cells[1,1]:='5';

SG1.Cells[1,2]:='5';SG1.Cells[1,3]:='6';

SG1.Cells[1,4]:='6';SG1.Cells[2,1]:='1';

SG1.Cells[2,2]:='11';SG1.Cells[2,3]:='1';

SG1.Cells[2,4]:='11';SG1.Cells[3,1]:='0';

SG1.Cells[3,2]:='0';SG1.Cells[3,3]:='0';

SG1.Cells[3,4]:='0';

SGRes. Cells[1,0]:='X1';SGRes. Cells[2,0]:='Y1';

SGRes. Cells[3,0]:='Z1';SGRes. Cells[4,0]:='X2';

SGRes. Cells[5,0]:='Y2';SGRes. Cells[6,0]:='Z2';

SGNum. Cells[0,0]:='Num';SGNum. Cells[1,0]:='K';

SGNum. Cells[2,0]:='F, H';

end;

procedure TForm1.SBCalcClick(Sender: TObject);

var

X1,X2,Y1,Y2,Z1,Z2:TXYZ;

i, j,z:byte;

increm:single;

px, py, pz, sx, sy, sz:currency;

cr1,cr2:real;

lx, ly, lz, rx, ry, rz, ax, ay, az, l2x, l2y, l2z:real;

I1,I2,K, R,F, prevF:currency;

Diff:Single;

Division:Word;

Counter:byte;

Const MD=10000000;

begin

Diff:=1/StrToFloat(EdE. Text);

I1:=StrToFloat(EdI1.text);

I2:=StrToFloat(EdI2.text);

If RB2.Checked then Division:=SGRes. RowCount-2

Else Division:=SpinC. Value;

prevF:=0;

F:=prevF+Diff*2;

Counter:=0;

Application. Minimize;

SGNum. RowCount:=12;

{Coordinates}

X1[1]:=StrToFloat(SG1.Cells[1,1]);

X1[2]:=StrToFloat(SG1.Cells[1,2]);

X2[1]:=StrToFloat(SG1.Cells[1,3]);

X2[2]:=StrToFloat(SG1.Cells[1,4]);

Y1[1]:=StrToFloat(SG1.Cells[2,1]);

Y1[2]:=StrToFloat(SG1.Cells[2,2]);

Y2[1]:=StrToFloat(SG1.Cells[2,3]);

Y2[2]:=StrToFloat(SG1.Cells[2,4]);

Z1[1]:=StrToFloat(SG1.Cells[3,1]);

Z1[2]:=StrToFloat(SG1.Cells[3,2]);

Z2[1]:=StrToFloat(SG1.Cells[3,3]);

Z2[2]:=StrToFloat(SG1.Cells[3,4]);

{Calculate}

While ((Counter<=SpinC. Value) and

(abs(F-prevF)>Diff)) do begin

if counter=0 then prevF:=0

else PrevF:=F;

Counter:=Counter+1;

{235}

SGRes. RowCount:=Division+2;

If RB1.Checked then begin

increm:=0;

For i:=1 to Division+1 do

begin

SGRes. Cells[0,i]:=IntToStr(i);

{Line 1}

X1[3]:=X1[1]+(X1[2]-X1[1])*increm;

Y1[3]:=Y1[1]+(Y1[2]-Y1[1])*increm;

Z1[3]:=Z1[1]+(Z1[2]-Z1[1])*increm; GRes. Cells[1,i]:=FloatToStr(X1[3]);

SGRes. Cells[2,i]:=FloatToStr(Y1[3]);

SGRes. Cells[3,i]:=FloatToStr(Z1[3]);

{Line 2}

X2[3]:=X2[1]+(X2[2]-X2[1])*increm;

Y2[3]:=Y2[1]+(Y2[2]-Y2[1])*increm;

Z2[3]:=Z2[1]+(Z2[2]-Z2[1])*increm;

GRes. Cells[4,i]:=FloatToStr(X2[3]);

SGRes. Cells[5,i]:=FloatToStr(Y2[3]);

SGRes. Cells[6,i]:=FloatToStr(Z2[3]);

{incrementing point coordinates}

increm:=increm+1/division;

end;

end;

{360}px:=0;py:=0;pz:=0;

for i:=1 to Division do

begin

sx:=0;sy:=0;sz:=0;

{390} for j:=1 to division do

begin

{Line 1 X}

cr1:=StrToFloat(SGRes. Cells[1,j+1]);

cr2:=StrToFloat(SGRes. Cells[1,j]);lx:=cr1-cr2;

{Line 1 Y}

cr1:=StrToFloat(SGRes. Cells[2,j+1]);

cr2:=StrToFloat(SGRes. Cells[2,j]);ly:=cr1-cr2;

{Line 1 Z}

cr1:=StrToFloat(SGRes. Cells[3,j+1]);

cr2:=StrToFloat(SGRes. Cells[3,j]);lz:=cr1-cr2;

{Line 2 X}

cr1:=StrToFloat(SGRes. Cells[4,i]);

cr2:=StrToFloat(SGRes. Cells[1,j]);rx:=cr1-cr2;

{Line 2 Y}

cr1:=StrToFloat(SGRes. Cells[5,i]);

cr2:=StrToFloat(SGRes. Cells[2,j]);ry:=cr1-cr2;

{Line 2 Z}

cr1:=StrToFloat(SGRes. Cells[6,i]);

cr2:=StrToFloat(SGRes. Cells[3,j]);rz:=cr1-cr2;

R:=sqrt((sqr(rx)+sqr(ry)+sqr(rz)));

R:=R*R*R;

{R:=R+1/(sqr(MD/10));

{430}

ax:=(ly*rz-lz*ry)/R;

ay:=(lz*rx-lx*rz)/R;

az:=(lx*ry-ly*rx)/R;

sx:=sx+ax;sy:=sy+ay;sz:=sz+az;

end;

{480}

{Line 2 X}

cr1:=StrToFloat(SGRes. Cells[4,i+1]);

cr2:=StrToFloat(SGRes. Cells[4,i]);l2x:=cr1-cr2;

{Line 2 Y}

cr1:=StrToFloat(SGRes. Cells[5,i+1]);

cr2:=StrToFloat(SGRes. Cells[5,i]);l2y:=cr1-cr2;

{Line 2 Z}

cr1:=StrToFloat(SGRes. Cells[6,i+1]);

cr2:=StrToFloat(SGRes. Cells[6,i]);l2z:=cr1-cr2;

ax:=(l2y*sz-l2z*sy);

ay:=(l2z*sx-l2x*sz);

az:=(l2x*sy-l2y*sx);

px:=px+ax;py:=py+ay;pz:=pz+az;

end;

K:=Sqrt(px*px+py*py+pz*pz);

F:=I1*I2*K/(2*3.1415*MD);

SGNum. Cells[0,Counter]:=IntToStr(Division);

SGNum. Cells[1,Counter]:=FloatToStr(K);

SGNum. Cells[2,Counter]:=FloatToStr(F);

{end of calculating}

If RB1.Checked then Division:=Division+10;

If RB2.Checked then

begin

Application. Restore;

Pages. ActivePage:=Tab3;

SGNum. RowCount:=Counter+1;

Exit;

end;

{While}

end;

Pages. ActivePage:=Tab3;

SGNum. RowCount:=Counter+1;

Application. Restore;

end;

procedure TForm1.RB1Click(Sender: TObject);

begin

If RB1.Checked then

begin

SG1.Enabled:=true;

SBOpen. Enabled:=False;

end

Else

begin

SG1.Enabled:=false;

SBOpen. Enabled:=true;

end;

end;

procedure TForm1.SBOpenClick(Sender: TObject);

var

X:TXYZ;

InFile:textFile;

k, q:byte;

increm:real;

division:word;

begin

If OpenDlg. Execute then

begin

k:=1;

AssignFile(InFile, OpenDlg. FileName);

Reset(InFile);

While not EOF(InFile) do

begin

SGRes. RowCount:=k+1;

ReadLn(inFile, DataStr);

SGRes. Cells[0,k]:=IntToStr(k);

For q:=1 to 7 do SGRes. Cells[q, k]:=NextVal;

k:=k+1;

end;

division:=k;

CloseFile(InFile);

SGRes. RowCount:=SGRes. RowCount+1;

increm:=0;

For k:=1 to SGRes. RowCount-2 do increm:=increm+1/division;

For q:=1 to 6 do

begin

X[2]:=StrToFloat(SGRes. Cells[q, SGRes. RowCount-2]);

X[1]:=StrToFloat(SGRes. Cells[q,1]);

X[3]:=X[1]+(X[2]-X[1])*increm;

SGRes. Cells[q, SGRes. RowCount-1]:=FloatToStr(X[3]);

end;

end;

end;

procedure TForm1.SpeedButton1Click(Sender: TObject);

var

i, j:byte;

CS:String;

begin

If SaveDlg. Execute then

begin

For j:=0 to SGNum. RowCount-1 do

begin

CS:='';

For i:=0 to SGNum. ColCount-1 do

begin

CS:=CS+SGNum. Cells[i, j]+';';

end;

MemoRes. Lines. Add(CS);

end;

MemoRes. Lines. SaveToFile(SaveDlg. FileName);

end;

end;

end.

 


Добавить комментарий


Защитный код
Обновить