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); }
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)); } }
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; } }); }
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)); }
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) }; }); }