Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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



Ответ
 
Опции темы
Старый 09.01.2017, 22:59   #1
Rabbit777
 
Регистрация: 09.01.2017
Сообщений: 6
Репутация: 20
По умолчанию 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, 23:27   #2
type_Oleg
Профессионал
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Адрес: Хазарский каганат
Сообщений: 2,197
Репутация: 1204
По умолчанию

Уравнение Кеплера?
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; 10.01.2017 в 00:36.
type_Oleg вне форума   Ответить с цитированием
Старый 10.01.2017, 23:36   #3
Rabbit777
 
Регистрация: 09.01.2017
Сообщений: 6
Репутация: 20
По умолчанию

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

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

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

Цитата:
Сообщение от 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 в 01:32.
type_Oleg вне форума   Ответить с цитированием
Старый 11.01.2017, 03:31   #5
type_Oleg
Профессионал
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Адрес: Хазарский каганат
Сообщений: 2,197
Репутация: 1204
По умолчанию

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

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

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

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

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

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

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

Цитата:
Сообщение от 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 вне форума   Ответить с цитированием
Старый 13.01.2017, 00:50   #8
Rabbit777
 
Регистрация: 09.01.2017
Сообщений: 6
Репутация: 20
По умолчанию

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

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

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

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; // &#241;&#236; - https://ru.wikipedia.org/wiki/&#207;&#238;&#241;&#242;&#238;&#255;&#237;&#237;&#224;&#255;_&#195;&#224;&#243;&#241;&#241;&#224;
  EPS=1e-6;              // &#239;&#238;&#227;&#240;&#229;&#248;&#237;&#238;&#241;&#242;&#252;, &#240;&#224;&#228;&#232;&#224;&#237;&#251;
implementation
uses Math;

{$R *.dfm}
function MeanMotion(a:Double):Double;  // &#241;&#240;&#229;&#228;&#237;&#229;&#229; &#228;&#226;&#232;&#230;&#229;&#237;&#232;&#229; , &#240;&#224;&#228;&#232;&#224;&#237;/&#241;&#243;&#242;&#234;&#232;
begin
 Result:=K_GAUSS/(a*Sqrt(a));
end;
function KeplerEqu(M,e:Double):Double; // &#243;&#240;&#224;&#226;&#237;&#229;&#237;&#232;&#229; &#202;&#229;&#239;&#235;&#229;&#240;&#224; 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;  // &#232;&#241;&#242;&#232;&#237;&#224;&#255; &#224;&#237;&#238;&#236;&#224;&#235;&#232;&#255;
begin
 Result:=2*ArcTan(Tan(Ex/2)*Sqrt((1+e)/(1-e)));
end;
function RadVect(a,e,Ex:Double):Double;  // &#240;&#224;&#228;&#232;&#243;&#241;-&#226;&#229;&#234;&#242;&#238;&#240;
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:='&#239;&#229;&#240;&#232;&#238;&#228; = '+FloatToStr(RoundTo(Period,-2))+' &#241;&#229;&#234;&#243;&#237;&#228;';
 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; 16.01.2017 в 00:21.
Rabbit777 вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решить квадратное уравнение в 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 17:17




00:10.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
таргетированный трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru