Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2012, 15:19   #1
КРИЖ
Пользователь
 
Регистрация: 08.03.2011
Сообщений: 44
По умолчанию Переадаптация кода из Visual Basic в Turbo Pascal

Программа моделирует движение заряженной частицы в магнитном поле. На VB нормально работает, но в паскаль не получилось перенести, получается какая-то ересь, считает не все, что надо (выводит лишь 1 из 3 нужных значений в цикле), и непонятно, правильно ли. + к тому обрезает знаки после запятой(оставляет только 3, остальные зануляет). Вот код на VB(выводит значения в Microsoft Excel):
Код:
Sub макрос2()



Dim ВX(1000), ВY(1000), ВZ(1000), rx(1000), ry(1000), rz(1000), VX(1000), VY(1000), Vz(1000)
rx(0) = -0.001

ry(0) = 0
rz(0) = 0
T = 0.00000005
mu = 4 * 0.000000314
q = 1.6E-19

m = 1.67E-27

it = 100
radius = 0.5
rx(1) = rx(0) + VX(0) * T
ry(1) = ry(0) + VY(0) * T
rz(1) = rz(0) + Vz(0) * T

VX(0) = 100
VY(0) = 100
Vz(0) = 0





For j = 1 To 998
For h = 1 To 50
For i = 1 To 99

X1 = -radius + i / 50 * radius
y1 = h / 500

z1 = (radius ^ 2 - X1 ^ 2) ^ 0.5
X2 = -radius + (i + 1) / 50 * radius
y2 = h / 10000
z2 = (radius ^ 2 - X2 ^ 2) ^ 0.5
dlx = X2 - X1
dly = y2 - y1
dlz = z2 - z1
rx1 = rx(j) - X1
ry1 = ry(j) - y1
rz1 = rz(j) - z1
rg = (rx1 ^ 2 + ry1 ^ 2 + rz1 ^ 2) ^ 0.5


ВX(j) = mu * it / 4 / 3.14 / rg ^ 2 * (dly * rz1 - dlz * ry1) + ВX(j)
ВY(j) = mu * it / 4 / 3.14 / rg ^ 2 * (dlz * rx1 - dlx * rz1) + ВY(j)
ВZ(j) = mu * it / 4 / 3.14 / rg ^ 2 * (dlx * ry1 - dly * rx1) + ВZ(j)

Next i

Next h

VX(j + 1) = fx / m * T + VX(j)
VY(j + 1) = fy / m * T + VY(j)
Vz(j + 1) = fz / m * T + Vz(j)
fx = q * (VY(j - 1) * ВZ(j) - Vz(j - 1) * ВY(j))
fy = q * (Vz(j - 1) * ВX(j) - VX(j - 1) * ВZ(j))
fz = q * (VX(j - 1) * ВY(j) - VY(j - 1) * ВX(j))


rx(j + 2) = fx * T ^ 2 / m + 2 * rx(j + 1) - rx(j)
ry(j + 2) = fy * T ^ 2 / m + 2 * ry(j + 1) - ry(j)
rz(j + 2) = fz * T ^ 2 / m + 2 * rz(j + 1) - rz(j)





Next j
l = 1

         For nn = 1 To 1000
            o = Chr(l + 64) + Trim(Str(nn))
            Range(o).Select
            ActiveCell.FormulaR1C1 = rx(nn - 1)
        Next
l = 2

         For nn = 1 To 1000
            o = Chr(l + 64) + Trim(Str(nn))
            Range(o).Select
            ActiveCell.FormulaR1C1 = ry(nn - 1)
        Next
      l = 3

         For nn = 1 To 1000
            o = Chr(l + 64) + Trim(Str(nn))
            Range(o).Select
            ActiveCell.FormulaR1C1 = rz(nn - 1)
        Next



      End Sub
Выводимые значения достаточно малы(значения в массивах ry,rz порядка -5...-10 степени, rx от -3 до 0)
Мой вариант кода на паскале:
Код:
Program qwerty;
uses crt;
var bx,by,bz,rx,ry,rz,vx,vy,vz:array [0..1000] of real;
t,mu,q,m,it,radius: real;
j,h,i:integer;
x1,y1,z1,x2,y2,z2,dlx,dly,dlz,rx1,ry1,rz1,rg,fx,fy,fz: real;

begin

rx[0]:=-0.001;
ry[0]:=0;
rz[0]:=0;
t:=0.00000005;
mu:=4*0.000000314;
q:=1.6*exp(-19*ln(10));
m:=1.7*exp(-27*ln(10));
it:=100;
radius:=0.5;
rx[1]:=rx[0]+vx[0]*t;
ry[1]:=ry[0]+vy[0]*t;
rz[1]:=rz[0]+vz[0]*t;
For j:=1 to 998 do
begin
For h:=1 to 50 do
begin
For i:=1 to 99 do
Begin
x1:=-radius+i/50*radius;
y1:=h/500;
z1:=sqrt(sqr(radius)-sqr(x1));
x2:=-radius+(1+i)/50*radius;
y2:=h/10000   ;
z2:=sqrt(sqr(radius)-sqr(x2));
dlx:=x2-x1;
dly:=y2-y1;
dlz:=z2-z1;
rx1:=rx[j]-x1;
ry1:=ry[j]-y1;
rz1:=rz[j]-z1;
rg:=sqrt(sqr(rx1)+sqr(ry1)+sqr(rz1));
bx[j]:=mu*it/4/3.14/sqr(rg)*(dly*rz1-dlz*ry1)+bx[j];
by[j]:=mu*it/4/3.14/sqr(rg)*(dlz*rx1-dlx*rz1)+by[j];
bz[j]:=mu*it/4/3.14/sqr(rg)*(dlx*ry1-dly*rx1)+bz[j];
end;
end;
vx[j+1]:=fx/m*t+vx[j];
vy[j+1]:=fy/m*t+vy[j];
vz[j+1]:=fz/m*t+vz[j];
fx:=q*(vy[j-1]*bz[j]-vz[j-1]*by[j]);
fy:=q*(vz[j-1]*bx[j]-vx[j-1]*bz[j]);
fz:=q*(vx[j-1]*by[j]-vy[j-1]*bx[j]);
rx[j+2]:=fx*sqr(t)/m+2*rx[j+1]-rx[j];
ry[j+2]:=fy*sqr(t)/m+2*ry[j+1]-ry[j];
rz[j+2]:=fz*sqr(t)/m+2*rz[j+1]-rz[j];

writeln(rx[j]:3:9,'   ',ry[j]:3:9,'    ',rz[j]:3:9,'  ');

end;

readln;
end.
Хотелось бы узнать, как можно отредактировать код в паскале, чтобы все работало.

Последний раз редактировалось КРИЖ; 22.01.2012 в 15:30.
КРИЖ вне форума Ответить с цитированием
Старый 22.01.2012, 19:17   #2
was3110
Форумчанин
 
Аватар для was3110
 
Регистрация: 25.04.2010
Сообщений: 254
По умолчанию

Также как переводят с одного языка на другой...
Могу помочь... если очень нужно...
помогать студентам - моя вторая профессия
was3110 вне форума Ответить с цитированием
Старый 22.01.2012, 20:45   #3
КРИЖ
Пользователь
 
Регистрация: 08.03.2011
Сообщений: 44
По умолчанию

Все нормально программа работает так как надо забыл указать начальную скорость для частицы)
КРИЖ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Немного кода из Pascal в Visual Basic кто поможет? offmonreal Помощь студентам 2 22.10.2011 16:59
Перевод кода из Turbo Pascal на Fortran abit-2010 Помощь студентам 0 07.07.2011 02:39
Ошибка в переводе кода с Turbo Pascal на Fortran abit-2010 Помощь студентам 0 05.07.2011 22:55
Turbo Pascal Объяснение кода hills Паскаль, Turbo Pascal, PascalABC.NET 0 14.04.2009 16:18