예제 #1
0
        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();
        }
예제 #2
0
        // функция которая считает возмущения
        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);
        }
예제 #3
0
        // Основной!!!
        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);
        }