Код:
type vec=array[1..2] of real;
var r,p:vec;
m,t,dt,tf:real;
i:integer;
input,output:text;
function f(r:vec):vec;
var i:integer;
begin
for i:=1 to 2 do
if r[i]=0 then f[i]:=0 else f[i]:=-m/r[i];
end;
begin
assign(input,'input.dat');
assign(output,'output.dat');
reset(input);
rewrite(output);
for i:=1 to 2 do
read(input,r[i]);
for i:=1 to 2 do
read(input,p[i]);
readln(input,m,tf);
t:=0;dt:=0.1;
while t<=tf do
begin
for i:=1 to 2 do p[i]:=p[i]+f(r)[i]*dt;
//writeln(output,f(r)[1]:0:5,' ',f(r)[2]:0:5);
for i:=1 to 2 do r[i]:=r[i]+p[i];
t:=t+dt;
writeln(output,r[1]:0:0,' ',r[i]:0:0);
end;
close(input);
close(output);
end.
Правильно я думаю или нет?
Правильно.
Какие формулы посмотреть, что бы организовать итерационный процесс?
Можно самую простую, известную из школьного курса физики.
И так для каждой координаты.
это буде функция, возвращающая значение напряженности поля в точке,
- проеэкция импульса на данную ось,
- масса частицы.
Тогда можно реализовать такой алгоритм.
Код:
read(x, p); // считали начальную координату и импульс
dt:=0.1; // задали шаг времени
t:=0; // и счётчик времени
while t<100 do
begin
x:=x+p/m*dt+e(x)/2 *dt*dt; // сдвинули точку
p:=p+m*e(x); // импульс точки тоже изменился
t:=t+dt; // увеличили время
writteln(x); // ну и выдали результат
end;
-- 21.07.2011, 11:44 --В принципе можно и более обще подойти к решению.
Напишем выражение для энергии частицы в поле одной частицы, для простоты
,
- это будет параметр поля, который вообще говоря равен
. Скорость
, и
, а в полярных координатах
. Так ка сила, не зависит от угла, то
и тогда
это дифференциальное уравнение. Преобразуем его
Сможете численно его решить - получите зависимость расстояния от центра поля до точки. Если поле задают несколько закреплённых точек, то дифур куда сложнее
, где
радиус вектор n-ной точки, И обощая на случай непрерывного распределения
, и интегрирование идёт по всей области, где