static void Main(string[] args) { DEreader DE405 = new DEreader(405, "C: \\Users\\Amanda\\Desktop\\16002200.405"); //бинарный файл Coordinates input = new Coordinates(); double t0, tn; // начальные данные double jdate = 2457700.5; //Дата //// ввод информации System.Console.WriteLine("Введите t0, а затем tn"); bool success = Double.TryParse(System.Console.ReadLine(), out t0); bool success2 = Double.TryParse(System.Console.ReadLine(), out tn); if (!success || !success2) { Console.WriteLine("Не верный ввод данных!"); return; } /// считываем координаты из файла using (StreamReader fs = new StreamReader((new FileStream(filePath, FileMode.Open)))) { input.pos._1 = double.Parse(fs.ReadLine(), CultureInfo.InvariantCulture); input.pos._2 = double.Parse(fs.ReadLine(), CultureInfo.InvariantCulture); input.pos._3 = double.Parse(fs.ReadLine(), CultureInfo.InvariantCulture); input.v._1 = double.Parse(fs.ReadLine(), CultureInfo.InvariantCulture); input.v._2 = double.Parse(fs.ReadLine(), CultureInfo.InvariantCulture); input.v._3 = double.Parse(fs.ReadLine(), CultureInfo.InvariantCulture); Console.WriteLine(input.pos._1); Console.WriteLine(input.pos._2); Console.WriteLine(input.pos._3); Console.WriteLine(input.v._1); Console.WriteLine(input.v._2); Console.WriteLine(input.v._3); } input = calc(input, t0, tn, DE405, jdate); //запускаем программу на счет // выводим результат using (StreamWriter sw = new StreamWriter(new FileStream(output, FileMode.Create))) { sw.WriteLine("x=" + input.pos._1); sw.WriteLine("y=" + input.pos._2); sw.WriteLine("z=" + input.pos._3); sw.WriteLine("Vx=" + input.v._1); sw.WriteLine("Vy=" + input.v._2); sw.WriteLine("Vz=" + input.v._3); } Console.ReadLine(); }
// функция которая считает возмущения public static double Vozmysheniya(double t, int nom, Vector3 массив_координат_астеройда, DEreader DE405, double jdate) { int index = 0; //Планета bool geleo = true; //гелео=тру бари=фолс jdate = jdate + t; //Дата double[] poz = new double[3]; //массив куда счит (коор=3) (коор+скор=6) double[] Mas = new double[10]; //массив где хранятся массы планет double del3; double r3; double G = 2.959122082855911025E-4; double EarthDivMoon = 0.813005600000000044E+02; Mas[0] = 0.491254745145081187E-10; Mas[1] = 0.724345248616270270E-09; Mas[2] = 0.899701134671249882E-09 * (1 - 1 / (EarthDivMoon + 1)); // Earth Mas[3] = 0.954953510577925806E-10; Mas[4] = 0.282534590952422643E-06; Mas[5] = 0.845971518568065874E-07; Mas[6] = 0.129202491678196939E-07; Mas[7] = 0.152435890078427628E-07; Mas[8] = 0.218869976542596968E-11; Mas[9] = 0.899701134671249882E-09 / (EarthDivMoon + 1); double sum = 0; while (index < 10) { DE405.DEreaderGetPlanetPoz(false, jdate, index, geleo, poz); r3 = Math.Pow(poz[0] * poz[0] + poz[1] * poz[1] + poz[2] * poz[2], 0.5); r3 = r3 * r3 * r3; del3 = Math.Pow((массив_координат_астеройда.values[0] - poz[0]) * (массив_координат_астеройда.values[0] - poz[0]) + (массив_координат_астеройда.values[1] - poz[1]) * (массив_координат_астеройда.values[1] - poz[1]) + (массив_координат_астеройда.values[2] - poz[2]) * (массив_координат_астеройда.values[2] - poz[2]), 0.5); del3 = del3 * del3 * del3; sum += Mas[index] * ((poz[nom] - массив_координат_астеройда.values[nom]) / del3 - poz[nom] / r3); index++; } sum = sum * G; return(sum); }
// Основной!!! static Coordinates calc(Coordinates input, double t0, double tn, DEreader DE405, double jdate) { double t = t0; double halfH = H / 2; Coordinates output = input.Clone(); Coordinates k = new Coordinates(), k2 = new Coordinates(), k3 = new Coordinates(), k4 = new Coordinates(); Coordinates H2; double qqq = 0; double R = Math.Sqrt(Math.Pow(output.pos._1, 2) + Math.Pow(output.pos._2, 2) + Math.Pow(output.pos._3, 2)); ///// начало цикла System.IO.StreamWriter textFile = new System.IO.StreamWriter(@"C:\\shag.txt"); System.IO.StreamWriter File = new System.IO.StreamWriter(@"C:\\radius.txt"); System.IO.StreamWriter text = new System.IO.StreamWriter(@"C:\\t.txt"); while (t < tn) { if (t + H > tn) { H = tn - t; } ; halfH = H / 2.0; k.pos._1 = Koordinata(output.v._1); ///Координаты k.pos._2 = Koordinata(output.v._2); k.pos._3 = Koordinata(output.v._3); k.v._1 = Skorost(output.pos._1, R) + Vozmysheniya(t, 0, output.pos, DE405, jdate); /// Скорости k.v._2 = Skorost(output.pos._2, R) + Vozmysheniya(t, 1, output.pos, DE405, jdate); k.v._3 = Skorost(output.pos._3, R) + Vozmysheniya(t, 2, output.pos, DE405, jdate); R = calcR(output, k, halfH); ////// k2.pos._1 = Koordinata(output.v._1 + k.v._1 * halfH); k2.pos._2 = Koordinata(output.v._2 + k.v._2 * halfH); k2.pos._3 = Koordinata(output.v._3 + k.v._3 * halfH); k2.v._1 = Skorost(output.pos._1 + k.pos._1 * halfH, R) + Vozmysheniya(t, 0, k.pos, DE405, jdate); k2.v._2 = Skorost(output.pos._2 + k.pos._2 * halfH, R) + Vozmysheniya(t, 1, k.pos, DE405, jdate); k2.v._3 = Skorost(output.pos._3 + k.pos._3 * halfH, R) + Vozmysheniya(t, 2, k.pos, DE405, jdate); R = calcR(output, k2, halfH); /////// k3.pos._1 = Koordinata(output.v._1 + k2.v._1 * halfH); k3.pos._2 = Koordinata(output.v._2 + k2.v._2 * halfH); k3.pos._3 = Koordinata(output.v._3 + k2.v._3 * halfH); k3.v._1 = Skorost(output.pos._1 + k2.pos._1 * halfH, R) + Vozmysheniya(t, 0, k2.pos, DE405, jdate); k3.v._2 = Skorost(output.pos._2 + k2.pos._2 * halfH, R) + Vozmysheniya(t, 1, k2.pos, DE405, jdate); k3.v._3 = Skorost(output.pos._3 + k2.pos._3 * halfH, R) + Vozmysheniya(t, 2, k2.pos, DE405, jdate); R = calcR(output, k3, H); ///////// k4.pos._1 = Koordinata(output.v._1 + k3.v._1 * H); k4.pos._2 = Koordinata(output.v._2 + k3.v._2 * H); k4.pos._3 = Koordinata(output.v._3 + k3.v._3 * H); k4.v._1 = Skorost(output.pos._1 + k3.pos._1 * H, R) + Vozmysheniya(t, 0, k3.pos, DE405, jdate); k4.v._2 = Skorost(output.pos._2 + k3.pos._2 * H, R) + Vozmysheniya(t, 1, k3.pos, DE405, jdate); k4.v._3 = Skorost(output.pos._3 + k3.pos._3 * H, R) + Vozmysheniya(t, 2, k3.pos, DE405, jdate); /// Перещет скоростей и координат output.pos._1 = recalculation(output.pos._1, k.pos._1, k2.pos._1, k3.pos._1, k4.pos._1, H / 6.0); output.pos._2 = recalculation(output.pos._2, k.pos._2, k2.pos._2, k3.pos._2, k4.pos._2, H / 6.0); output.pos._3 = recalculation(output.pos._3, k.pos._3, k2.pos._3, k3.pos._3, k4.pos._3, H / 6.0); output.v._1 = recalculation(output.v._1, k.v._1, k2.v._1, k3.v._1, k4.v._1, H / 6.0); output.v._2 = recalculation(output.v._2, k.v._2, k2.v._2, k3.v._2, k4.v._2, H / 6.0); output.v._3 = recalculation(output.v._3, k.v._3, k2.v._3, k3.v._3, k4.v._3, H / 6.0); R = Math.Sqrt(Math.Pow(output.pos._1, 2) + Math.Pow(output.pos._2, 2) + Math.Pow(output.pos._3, 2)); t = t + H; // сдвигаемся по времени // пересчет шага H double K1 = Math.Pow(k.pos._1 / 6.0 + k2.pos._1 * 2 / 6.0 - 4 * k3.pos._1 / 6.0 + k4.pos._1 / 6.0, 2); double K2 = Math.Pow(k.pos._2 / 6.0 + k2.pos._2 * 2 / 6.0 - 4 * k3.pos._2 / 6.0 + k4.pos._2 / 6.0, 2); double K3 = Math.Pow(k.pos._3 / 6.0 + k2.pos._3 * 2 / 6.0 - 4 * k3.pos._3 / 6.0 + k4.pos._3 / 6.0, 2); double Ecal = Math.Abs(H * Math.Pow(K1 + K2 + K3, 0.5)); H = H * Math.Pow(EpsPresset / Ecal, 1 / 3.0); qqq++; System.Console.WriteLine(H); // отслеживаем шаги textFile.WriteLine(H); //вывод шага File.WriteLine(R); //вывод гелиоцентрического расстояния text.WriteLine(t); // вывод времени } System.Console.WriteLine(t); //конечный момент времени System.Console.WriteLine(qqq); //колличество шагов textFile.Close(); File.Close(); text.Close(); return(output); }