ПРИКЛАДИ РОЗРАХУНКУ ЗАДАЧ
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.