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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2017, 21:59   #1
Rabbit777
 
Регистрация: 09.01.2017
Сообщений: 8
По умолчанию Delphi - Это уравнение возможно решить только численно.. Делфи

Доброго времени суток, товарищи! Очень сильно нуждаюсь в вашей помощи и поддержке.
Задача звучит так:
Известны и задаются изначально T, tay и e.
Необходимо найти множество значений Е на интервале времени t.

t изменяется в диапазоне от 0 до Т(период)

Е – угол

Исходное уравнение:

0=tay+(T/2П)*(E-e*sin(E))-t

Это уравнение возможно решить только численно.

Потом полученное множество значений Е используется для нахождения двух промежуточных, а затем двух искомых углов по значениям которых необходимо построить график зависимости друг от друга, но мне хотя бы для начала разобраться с решением уравнения для различных моментов времени.

Ниже мои тщетные попытки что-то накодить:

Код HTML:
var
a,b,d,e,g,y,i,xk,xk1:double;
k:integer;
function F(x:double): double;
begin
F:=a+(b/6.28)*(x-e*sin(x))-i;
end;
function F1(x:double): double;
begin
F1:=(b/6.28)*(1-e*cos(x));
end;
begin
a:=strtofloat(edit1.text);
b:=strtofloat(edit2.text);
i:=0;
d:=strtofloat(edit4.text);
e:=strtofloat(edit5.text);
g:=strtofloat(edit6.text);
while i=>b do
begin
y:=F(xk);
while abs(y)<=0.0001 do
begin
xk1:=xk-F(xk)/F1(xk);
xk:=xk1;
y:=F(xk1);
end;
i:=i+10;
end;
edit7.text:=floattostr(xk1);
end;

end.
Rabbit777 вне форума Ответить с цитированием
Старый 09.01.2017, 22:27   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Уравнение Кеплера?
M=E-e*sin(E)

Делал как-то . Вот :
Код:
function KeplerEqu(M,e,eps:Double):Double;
var E1,E2:Double;
begin
 E2:=M;
 repeat
  E1:=E2;
  E2:=M+e*Sin(E1);
 until Abs(E1-E2)<eps;
 Result:=E2;
end;
где - M - средняя аномалия = tau * 2пи /T . (где tau - время от перигелия )
e - эксцентриситет
eps - погрешность ( у вас 0.0001)

А для больших e (e>0.8)лучше :
Код:
function KeplerEqu2(M,e,eps:Double):Double;
var E1,E2:Double;
    n:Integer;
const MAX_KOL=500;
begin
 n:=0;
 E2:=M;
 repeat
  E1:=E2;
  E2:=E1+(M+e*Sin(E1)-E1)/(1-e*Cos(E1));
  Inc(n);
 until (Abs(E1-E2)<eps)or(n>MAX_KOL);
 if n>MAX_KOL then Result:=KeplerEqu(M,e,eps) else Result:=E2; 
end;
PS Результат - эксцентрическая аномалия E.

Последний раз редактировалось type_Oleg; 09.01.2017 в 23:36.
type_Oleg вне форума Ответить с цитированием
Старый 10.01.2017, 22:36   #3
Rabbit777
 
Регистрация: 09.01.2017
Сообщений: 8
По умолчанию

Да это действительно уравнение Кеплера. Спасибо огромное)
Есть возможность ответить ещё на пару вопросов?))

1. Что необходимо добавить в ваш код чтобы можно было задавать М, е, eps?
А ещё лучше, если можно было бы задавать период Т или даже а-большую полуось
2. Ваш код работает для t=0. Как сделать и возможно ли это вообще, чтобы результатом был массив чисел в интервале времени t от 0 до T(что я собственно и пытался безуспешно сделать)? Конечной целью программы является построение трассы полёта КА.

Ещё раз огромное спасибо))
Rabbit777 вне форума Ответить с цитированием
Старый 10.01.2017, 23:56   #4
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Цитата:
Сообщение от Rabbit777 Посмотреть сообщение
1. Что необходимо добавить в ваш код чтобы можно было задавать М, е, eps?
..
2. Ваш код работает для t=0. Как сделать и возможно ли это вообще, чтобы результатом был массив чисел в интервале времени t от 0 до T(что я собственно и пытался безуспешно сделать)? Конечной целью программы является построение трассы полёта КА.
1. Что-то вроде:
Код:
 M:=StrToFloat(Edit99.text);
 T:=StrToFloat(Edit100.text);
// и т.д.
И конечно описать новые переменные в var.
Только имейте в виду, что в Паскале E и e - это будет одно и то же имя.

Цитата:
Сообщение от Rabbit777 Посмотреть сообщение
задавать период Т или даже а-большую полуось
Что-то одно. Ибо период T однозначно определяется большой полуосью и массой центрального тела.


2. Я сам только что обратил внимание, что у вас есть tau и t . Что они значат?
Потому что используют одно время - время от прохождения перигелия ( или перицентра в общем случае). По нему вычисляют среднюю аномалию M , и т.д.

Хорошо расписано в книге Монтенбрук О., Пфлегер Т. Астрономия на персональном компьютере . Только надо издание 1993 г, там на Паскале, в более новом - на Си.
Еще есть Даффет-Смит П. Практическая астрономия с калькулятором ,
Меёс Ж. Астрономические формулы для калькуляторов

Кстати, вы не используете еще 3 элемента орбиты i, ω, Ω .
То есть, вам надо только случай с нулевым наклонением орбиты i=0 ?

И еще вопросы:
- вокруг чего все вращается ? Вокруг Солнца ? То есть надо ли менять массу центрального тела, или она постоянна?
- движение только по эллипсу, или может быть параблическое/гиперболичское?
- в каком виде должен быть результат - сферические координаты ( геоцентрическая долгота , радиус-вектор), или прямоугольные (X,Y)

Последний раз редактировалось type_Oleg; 11.01.2017 в 00:32.
type_Oleg вне форума Ответить с цитированием
Старый 11.01.2017, 02:31   #5
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Вот, держите, дорабатывайте как надо.
Сделал простой вариант:
- движение в одной плоскости . Наклонение i =0, долгота перигелия = 0
- центральное тело - Солнце. Поэтому const K_GAUSS
- выходные координаты - сферические эклиптические гелиоцентрические
- только эллиптические орбиты (0<e<1), или круговые (e=0)
- расчет на 1 период. Число шагов можно задать, начало ( дней от перигелия) - тоже.
Вложения
Тип файла: rar arDel.rar (171.4 Кб, 10 просмотров)
type_Oleg вне форума Ответить с цитированием
Старый 11.01.2017, 22:30   #6
Rabbit777
 
Регистрация: 09.01.2017
Сообщений: 8
По умолчанию

Нам давали уравнение Кеплера в таком виде: t-tau=(T/2pi)*(E-e*sin(E))

Другие 3 элемента, которые вы назвали, будут использоваться дальше. Я ничего не понимаю в программировании да и со временем у меня не очень, поэтому и двигаюсь медленно, шаг за шагом.

Нужны случаи с разными i.

ИСЗ вращается вокруг Земли, масса постоянна.

Для начала хотя бы по эллипсу, чтобы понять, а так в конечном итоге хотелось бы и для гиперболического и параболического движения рассчитывать.

Результатом в конце концов должны стать геоцентрические широты и долготы всех точек за промежуток времени и график, который отображал бы вид трассы полёта (как выглядела бы трасса строй мы её на карте мира).
Rabbit777 вне форума Ответить с цитированием
Старый 12.01.2017, 00:13   #7
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Цитата:
Сообщение от Rabbit777 Посмотреть сообщение
t-tau=(T/2pi)*(E-e*sin(E))
Если тау - это момент перигея,то можно и так. Потому что M=2пи*(t-tau)/T

Цитата:
Сообщение от Rabbit777 Посмотреть сообщение
ИСЗ вращается вокруг Земли, масса постоянна.
Тогда надо будет поменять значение K_GAUSS, потому что у вас масса Земли, у меня - Солнца. И у меня единицы - расстояние а.е., время - сутки, а у вас - наверное минуты и километры, или еще что.

В остальном - принципиальной разницы нет. Только координаты будут называться не гелиоцентрические, а геоцентрические. И не эклиптические, а экваториальные.


Цитата:
Сообщение от Rabbit777 Посмотреть сообщение
Нужны случаи с разными i
Тогда надо будет вычислять не только долготу lon, но и широту lat. Вот вам процедура для этого.
Код:
procedure VWNodeItoLonLat(v,w,Node,i:Double;var l_lon,b_lat:Double);
var u:Double; 
begin
 u:=w+v;
 l_lon:=Node+ArcTan2(Cos(i)*Sin(u),Cos(u));
 b_lat:=ArcSin(Sin(u)*Sin(i));
end;
v - истинная аномалия,
w - аргумент перигея,
Node - долгота восходящего узла
i - наклонение.
Все в радианах конечно.

Потом надо будет учесть вращение Земли и перевести небесные координаты в земные, чтобы найти гринвичские координаты подспутниковой точки (чтоб трассу построить). Для этого вычисляется звездное время, делается поворот.
type_Oleg вне форума Ответить с цитированием
Старый 12.01.2017, 23:50   #8
Rabbit777
 
Регистрация: 09.01.2017
Сообщений: 8
По умолчанию

Я не знаю как вас благодарить за оказаную вами помощь!
Вы написали мне целую программу (которую я скорее всего выдам за свою). Теперь остались последние штрихи для её завершения, а у меня не получается ничего исправить. Мне очень неловко просить, но всё таки, не сочтите за труд, всё сказанное вами объединить.
Я не настаиваю. Если по какой-либо причине вы откажитесь я всё пойму.
Rabbit777 вне форума Ответить с цитированием
Старый 13.01.2017, 00:28   #9
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Нет, это мне не интересно.
Вот небесная механика - это интересно. А делать все за кого-то - это нет.
Так что изучайте Паскаль. А если не получается - значит не туда поступили.
type_Oleg вне форума Ответить с цитированием
Старый 15.01.2017, 22:37   #10
Rabbit777
 
Регистрация: 09.01.2017
Сообщений: 8
По умолчанию

Ну что ты начинаешь, нормально же общались)) Я просто не могу вставить в код последнюю написанную вами процедуру. Выходит редкосная дичь:
Код:
unit uRabbit777;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    Label1: TLabel;
    GroupBox1: TGroupBox;
    Edit1: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Edit2: TEdit;
    Label4: TLabel;
    GroupBox2: TGroupBox;
    Edit3: TEdit;
    Label5: TLabel;
    Edit4: TEdit;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Edit5: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
const
  K_GAUSS=0.01720209895; // ñì - https://ru.wikipedia.org/wiki/Ïîñòîÿííàÿ_Ãàóññà
  EPS=1e-6;              // ïîãðåøíîñòü, ðàäèàíû
implementation
uses Math;

{$R *.dfm}
function MeanMotion(a:Double):Double;  // ñðåäíåå äâèæåíèå , ðàäèàí/ñóòêè
begin
 Result:=K_GAUSS/(a*Sqrt(a));
end;
function KeplerEqu(M,e:Double):Double; // óðàâíåíèå Êåïëåðà M-->E
var E1,E2:Double;
begin
 E2:=M;
 repeat
  E1:=E2;
  E2:=M+e*Sin(E1);
 until Abs(E1-E2)<EPS;
 Result:=E2;
end;
function TrueAnomV(Ex,e:Double):Double;  // èñòèíàÿ àíîìàëèÿ
begin
 Result:=2*ArcTan(Tan(Ex/2)*Sqrt((1+e)/(1-e)));
end;
function RadVect(a,e,Ex:Double):Double;  // ðàäèóñ-âåêòîð
begin
 Result:=a*(1-e*Cos(Ex));
end;
//
procedure TForm1.Button1Click(Sender: TObject);
var a,e,t0,n,i,u,w,Node,l_lon,b_lat,Period,t,M,ExAn,v,r,Lon:Double;
    k,z:Integer;
begin
 Label7.Caption:='';
 Memo1.Lines.Clear;
 Memo2.Lines.Clear;
 a:=StrToFloatDef(Edit1.Text,0);
 e:=StrToFloatDef(Edit2.Text,0);
 i:=StrToFloatDef(Edit2.Text,0);
 if (a<0)or(e<0)or(e>=1) then Exit;
 n:=MeanMotion(a);
 Period:=2*PI/n;
 Label7.Caption:='ïåðèîä = '+FloatToStr(RoundTo(Period,-2))+' ñåêóíä';
 t0:=StrToFloatDef(Edit3.Text,0);
 k:=StrToIntDef(Edit4.Text,0);
 for z:=0 to k do
  begin
   t:=t0+z*Period/k;
   M:=t*n;
   if M<0 then M:=M+2*PI;
   if M>2*PI then M:=M-2*PI;
   ExAn:=KeplerEqu(M,e);
   u:=w+v;
 l_lon:=Node+ArcTan2(Cos(i)*Sin(u),Cos(u));
 b_lat:=ArcSin(Sin(u)*Sin(i));
   Memo1.Lines.Add(FloatToStr(l_lon));
   Memo2.Lines.Add(FloatToStr(b_lat));
  end;
end;

end.

Последний раз редактировалось Rabbit777; 15.01.2017 в 23:21.
Rabbit777 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решить квадратное уравнение в Delphi snejnbumer Помощь студентам 8 19.09.2014 21:51
Плагины на C++ для программы на delphi. Это возможно? Человек_Борща Общие вопросы по программированию, компьютерный форум 58 26.12.2011 15:06
подключение к Excel из delphi через ODBC.возможно ли это без глюков? betirsolt БД в Delphi 0 13.06.2010 01:05
Автосохранение исходников в Delphi. Это возможно? Kottik Софт 16 20.09.2009 17:36
Пожалуйста,помогите решить в Delphi уравнение... ALENA555 Помощь студентам 2 28.03.2009 16:17