示例#1
0
        double Delta_t(double Height, double MachNumber, double Length, double K_s, WeatherParameters WeatherParameters)
        {
            double a = 20.046796 * Math.Sqrt(Atmosphere.ParametersAtHeight(Height, WeatherParameters.Temperature).Temperature);

            return(K_t(Height, MachNumber) * 3.42 / a * MachNumber / Math.Pow(Math.Pow(MachNumber, 2) - 1, 3.0 / 8) *
                   Math.Pow(Math.Max(h_e(Height, MachNumber), Height), 1.0 / 4) * Math.Pow(Length, 3.0 / 4) * K_s);
        }
示例#2
0
        double Delta_p(double Height, double MachNumber, double Length, double K_s, WeatherParameters WeatherParameters)
        {
            double _M_e = M_e(MachNumber);
            double d    = d_x(Height, MachNumber);
            double _H_e = Math.Max(d, Height);

            if (_M_e < M_c(MachNumber))
            {
                return(0);
            }
            else
            {
                return(Math.Max(2 * K_p(Height, MachNumber) * Math.Sqrt(1.0135E5 * Atmosphere.ParametersAtHeight(Height, WeatherParameters.Temperature).Pressure) *
                                Math.Pow(Math.Pow(MachNumber, 2) - 1, 1.0 / 8) * Math.Pow(Length / _H_e, 3.0 / 4) * K_s * Delta_atm(Height, d, WeatherParameters), 0));
            }
        }
示例#3
0
 public StaticSoundLevel GetStaticSoundLevel(double Thrust, FlowParameters flowParameters, FrequencyBand frequencyBand) // см. метод с аналогичной сигнатурой в IModel
 {
     double[] Frequencies, FrequencyBands;                                                                              // массив среднегеометрических частот и ширин частотных полос
     // определение массивов Frequencies, FrequencyBands по исходному спектру частот frequencyBand
     if (frequencyBand == FrequencyBand.Infra)
     {
         FrequenciesAggregator.Infra(out Frequencies, out FrequencyBands);
     }
     else if (frequencyBand == FrequencyBand.Ultra)
     {
         FrequenciesAggregator.Ultra(out Frequencies, out FrequencyBands);
     }
     else
     {
         FrequenciesAggregator.Normal(out Frequencies, out FrequencyBands);
     }
     double[] spectralDecomposition = SpectralDecomposition.Get(1.01325E5, flowParameters, Frequencies, FrequencyBands); // Разложение шума на спектр по частотам
     // Определение функции, возвращающей уровень шума от двиагтеля на расстоянии Radius от сопла под углом Angle к напрвлению оси газовой струи при погодных условиях weatherParameters
     return((Radius, Angle, weatherParameters) =>
     {
         double[] atmospherePropagation = new double[Frequencies.Length];                               // массив затуханий звука на частотах Frequencies на расстоянии Radius при погодных условиях weatherParameters
         var atmosphereParameters = new AtmosphereParameters(weatherParameters.Temperature, 1.01325E5); // создание объекта, хранящего атмосферные параметры
         for (int j = 0; j < Frequencies.Length; j++)
         {
             atmospherePropagation[j] = Atmosphere.AbsorptionRatio(weatherParameters.Humidity, atmosphereParameters, Frequencies[j]) * Radius;                                // заполнение массива atmospherePropagation
         }
         double L0 = 10 * Math.Log10(0.5 * 0.0022 * Thrust * flowParameters.NozzleFlowVelocity) + 120 - 11 - 20 * Math.Log10(Radius) + DI.Interpolate(Angle * 180 / Math.PI); // Уровень шума в искомой точке без учёта корреляции по шкале A и затухания звука
         double L = 0;                                                                                                                                                        // Уровень шума в искомой точке с учётом корреляции по шкале A и затухания звука
         for (int i = 0; i < Frequencies.Length; i++)
         {
             double correction = frequencyBand == FrequencyBand.Normal ? Correction.Get(i) : 0;       // корреляции по шкале Aв случае расчёта в слышимом диапазоне частот
             double CurrentL = L0 + spectralDecomposition[i] - atmospherePropagation[i] + correction; // Уровень шума в искомой точке на частоте Frequencies[i] с учётом корреляции по шкале A и затуханием звука
             if (CurrentL > 0)
             {
                 L += Math.Pow(10, 0.1 * CurrentL); // логарифмическое суммиррование уровней шума на частотах Frequencies[i]
             }
         }
         if (L > 0)
         {
             return 10 * Math.Log10(L);
         }
         else
         {
             return 0;
         }
     });
 }
示例#4
0
        double Delta_atm(double Height, double DistanceToGround, WeatherParameters WeatherParameters)
        {
            var atmospherePropagation = Atmosphere.Propagation(SonicBoomFrequencies, WeatherParameters, Height, DistanceToGround);

            return(Math.Pow(10, 10 * Math.Log10(atmospherePropagation.Select(x => Math.Pow(10, -0.1 * x)).Sum() / SonicBoomFrequencies.Length) / 20));
        }
示例#5
0
        double Cx(double M)
        {
            double[] A;
            if (M <= 0.4)
            {
                A = new double[] { 0.2901, 0.0013, -0.0357, 0, 0 }
            }
            ;
            else if (M <= 0.9)
            {
                A = new double[] { 0.7921, -1.9414, 1.6607, 0, 0 }
            }
            ;
            else if (M <= 1.5)
            {
                A = new double[] { 29.601, -105.27, 138.34, -78.503, 16.326 }
            }
            ;
            else
            {
                A = new double[] { 0.955, -0.25, 0.0361, -0.00225, 5.11E-5 }
            };
            return(A.Zip(new double[] { 0, 1, 2, 3, 4 }, (a, n) => a * Math.Pow(M, n)).Sum());
        }

        Func <double, double> phi_1(double phi_k, double t_k)
        {
            return(t => t < 25 ?
                   Math.PI / 2 :
                   phi_k + (Math.PI / 2 - phi_k) / Math.Pow(t_k - 25, 2) * Math.Pow(t_k - t, 2));
        }

        Func <double, double> phi_2(double phi_0, double phi_k, double t_k)
        {
            return(t => phi_0 + (phi_k - phi_0) / t_k * t);
        }

        Func <double[], double, double[]> GetF(double n_0, double I_p, double l, double P_m, Func <double, double> phi)
        {
            return((X, t) =>
            {
                double v_char = X[0];
                double v_grav = X[1];
                double v_aer = X[2];
                double v_press = X[3];
                double mu = X[4];
                double x = X[5];
                double y = X[6];
                double v = v_char - v_grav - v_aer - v_press;
                double r = Math.Sqrt(Math.Pow(R + y, 2) + x * x);
                double h = r - R;
                var AtmospehereParameters = Atmosphere.ParametersAtHeight(h);
                var phi_t = phi(t);
                return new double[]
                {
                    n_0 *g / (l * mu),
                    g *Math.Pow(R / r, 2) * Math.Sin(phi_t + Math.Atan(x / (R + y))),
                    Cx(v / AtmospehereParameters.SoundVelosity) * AtmospehereParameters.Density * v * v / (2 * mu * P_m),
                    n_0 *g / mu * (1 / l - 1) * AtmospehereParameters.Pressure / 1.0125E5,
                    -n_0 * g / (I_p * l),
                    v *Math.Cos(phi_t),
                    v *Math.Sin(phi_t)
                };
            });
        }