
- •Содержание
- •1 Цель работы
- •3 Методика построения набора графиков
- •4 Практическое задание
- •1 Цель работы
- •2 Построение графика функции, заданной в параметрической форме
- •3 Практическое задание
- •1 Цель работы
- •2 Метод конечных разностей при расчете траекторий движения
- •3 Алгоритм расчета траектории движения точки
- •4 Программа построения траекторий полета снаряда
- •5 Практическое задание
- •6 Траектории движения в центральном поле
- •7 Практическое задание
- •1 Цель работы
- •2 Интерполяция дискретных данных полиномом
- •3 Аппроксимация методом наименьших квадратов
- •4 Алгоритм аппроксимации мнк
- •5 Практическое задание
5 Практическое задание
5.1 Рассчитать разностным моделированием и затем для контроля по аналитической зависимости траекторию полета снаряда без учета сопротивления воздуха. Построить полученные траектории. Начальная скорость снаряда V0=1000 м/с, угол=450. Аналитическая зависимость имеет вид
X = V0 t cos(), Y = V0 t sin() – gt2 / 2.
5.2 Рассчитать разностным моделированием и затем для контроля по аналитической зависимости траектории полета снаряда с учетом сопротивления воздуха, пропорциональным скорости снаряда. Построить траектории полета снаряда. Начальная скорость V0=3000 м/с, угол=300, коэффициент сопротивления воздуха k=0. 01 с–1. Аналитическая зависимость имеет вид
X=V0 cos() (1– e–k t )/ k, Y=(V0 sin() +g/ k) (1– e–k t )/ k –g t/ k.
5.3 Рассчитать разностным моделированием и построить набор траекторий полета снаряда с учетом сопротивления воздуха, пропорциональным кубу скорости снаряда. Коэффициент сопротивления воздуха 10–6, уголменяется в диапазоне 10 ... 900с шагом 200.
6 Траектории движения в центральном поле
Точность получаемой методом конечных разностей траектории определяется величиной выбираемого временного шага, на котором скорости и ускорения принимаются неизменными. Для расчета больших траекторий при этом приходится оптимизировать использование массивов для хранения координат траектории ( можно и полностью отказаться от использования массивов, но с потерей универсальности используемых подпрограмм). Ниже приведен пример расчета траектории движения спутника в поле тяготения планеты.
procedure GRAF_Z( n, left,up,right,down: integer;
rz: real);
{ процедура построения траектории спутника по массиву X,Y[1..n]
декартовых координат в области экрана left,right,up,down }
var
Xg,Yg, Xg0,Yg0, k,r: integer;
kX,kY, Ymin,Ymax,Xmin,Xmax: real;
begin
{ нахождение экстремумов }
Ymin:=Y[1]; Ymax:=Y[1]; Xmin:=X[1]; Xmax:=X[1];
for k:=2 to n do begin
if Ymin>Y[k] then Ymin:=Y[k];
if Xmin>X[k] then Xmin:=X[k];
if Ymax<Y[k] then Ymax:=Y[k];
if Xmax<X[k] then Xmax:=X[k] end;
{ коэффициенты масштабирования по горизонтали и вертикали }
kX:=(right-left)/(Xmax-Xmin);
kY:=( down- up )/(Ymax-Ymin);
{ пересчет коэффициентов масштабирования правой или нижней границы области вывода графиков для получения неискаженной формы кривой }
if kX<kY then begin kY:=kX;
down:= up +round( (Ymax-Ymin)*kY) end
else begin kX:=kY;
{ построение контура небесного тела }
Xg0:=left-round( Xmin*kX);
Yg0:=down+round( Ymin*kY);
r:=round( rz*kX); { радиус планеты }
setcolor(11); setfillStyle(11,7);
FillEllipse( Xg0,Yg0,r,r);
OuttextXY(Xg0-15,Yg0-4,'планета');
setcolor(14);
{ точки графика }
for k:=1 to n do begin
Xg:=left +round( kX*(X[k] -Xmin));
Yg:=down -round( kY*(Y[k] -Ymin));
if k=1 then moveto( Xg,Yg)
else lineto( Xg,Yg) { строим график } end end;
Программа расчета траектории методом конечных разностей
с вызовом процедуры построения траектории спутника
uses Crt,Graph;
FUNCTION FA(X,l: real): real; var k,r:real;
{ составляющая ускорения (по первому параметру)
спутника в поле тяготения планеты (м/с2)}
begin k:=4.E+14; { коэффициент для Земли }
r:=sqrt(X*X+l*l); { расстояние до центра планеты }FA:=-k*X/(r*r*r) end;
FUNCTION WAY(dx,dy: real): real;
{ величины смещения по разностям координат двух положений }
begin WAY:=sqrt(dx*dx+dy*dy) end;
const N=5000;
var X,Y: array[1..N] of real; { массивы координат траектории }
Gd,Gm,i,M: integer; rz: real;
{$I graf_z.pas} { подключение файла с процедурой вывода графика}
PROCEDURE SPUTNIK( H,V,alfa: real);
{ Расчет массивов координат X,Y траектории спутника в поле тяготения планеты (Земли) с начальной скоростью V (м/с) и углом к горизонту alfa (град.). Начальное положение спутника – на высоте H от поверхности }
var vx1,vy1,ax1,ay1,vx2,vy2,ax2,ay2, dt,r, way_max: real;
begin
rz:=6.37E6; { радиус Земли (м) }
way_max:=100*rz; { ограничение длины рассчитываемой траектории }
dt:=10*way_max/V/N; { начальное приближение
для временного интервала }
X[1]:=0; Y[1]:=H+rz; { первая точка траектории }
alfa:=alfa*pi/180; { перевод угла в радианы }
REPEAT { итерации для корректировки временного интервала dt }
vx1:=V*cos( alfa); { составляющие начальной скорости }
vy1:=V*sin( alfa);
ax1:=FA(X[1],Y[1]); { составляющие ускорения в начальной точке }
ay1:=FA(Y[1],X[1]);
i:=1; r:=0; { счетчики точек и длины пройденного пути }
REPEAT inc(i); { переход к последующей точке траектории }
{ скорости } vx2:=vx1 +ax1*dt; vy2:=vy1 +ay1*dt;
{ координаты } X[i]:=X[i-1] +0.5*( vx1+vx2)*dt;
Y[i]:=Y[i-1] +0.5*( vy1+vy2)*dt;
{ ускорения } ax2:=FA( X[i],Y[i]); ay2:=FA( Y[i],X[i]);
{ уточнение } vx2:=vx1 +0.5*( ax1+ax2)*dt;
{ скорости } vy2:=vy1 +0.5*( ay1+ay2)*dt;
{ уточнение } X[i]:=X[i-1] +0.5*( vx1+vx2)*dt;
{ координат } Y[i]:=Y[i-1] +0.5*( vy1+vy2)*dt;
{ переназначение (с уточнением ускорений) для текущих величин }
ax1:=FA( X[i],Y[i]); vx1:=vx2;
ay1:=FA( Y[i],X[i]); vy1:=vy2;
r:=r+WAY( X[i]-X[i-1], Y[i]-Y[i-1]);{ пройденное расстояние }
{ Расчет траектории прерывается при прохождении заданного расстояния way_max, либо при выборе всех элементов массивов для координат (i=N),
либо при падении на планету ( расстояние до центра менее радиуса ) }
UNTIL (r>=way_max) or(i=N) or (WAY( X[i],Y[i])<=rz);
{ временной интервал dt при необходимости корректируется так, чтобы траектория была полностью отслежена при рациональном использовании
массивов для координат }
{ нужно использовать не менее 80% массивов }
if( i<0.8*N) then dt:=dt*i/N;
{ если без падения на поверхность планеты была не полностью пройдена траектория , то увеличиваем временной интервал }
if( WAY( X[i],Y[i])>rz) and (r< way_max) then dt:=dt*1.2;
UNTIL (i>=0.8*N)and
((r>=way_max)or( WAY( X[i],Y[i])<=rz));
M:=i { количество точек траектории для построения графика } end;
begin {------------ ОСНОВНАЯ ПРОГРАММА ---------------}
{ Расчет траектории при начальном положении спутника на высоте 3000 км от поверхности планеты при скорости 9 км/с под углом 300 }
SPUTNIK( 3.E6,9000,30);
Gd:=0; Initgraph(Gd,Gm,'c:\tp7\bgi');
GRAF_Z( M, 10,10,GetMaxX-10,GetmaxY-10, rz);
ReadKey; CloseGraph end.