Essays.club - Получите бесплатные рефераты, курсовые работы и научные статьи
Поиск

Метод кусочной аппроксимации плотности распределения вероятности

Автор:   •  Сентябрь 14, 2025  •  Лабораторная работа  •  2,325 Слов (10 Страниц)  •  1,729 Просмотры

Страница 1 из 10

ГУАП

КАФЕДРА № 21

ОТЧЕТ
ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

Канд. техн. наук

Н.А. Гладкий

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №3

Метод кусочной аппроксимации плотности распределения вероятности (метод Брусленко Н.П.)

по курсу: «Моделирование систем и процессов в радиоэлектронных системах»

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ гр. №

2310

А.А. Щербань

подпись, дата

инициалы, фамилия

Санкт-Петербург 2025

  1. Цель

В соответствии с номером варианта необходимо сгенерировать выборку случайных чисел с заданным законом распределения с помощью метода Брусленко Н.П., исследовать данный метод.

  1. Выполнение работы

 Заданный закон распределения[pic 1]

  1. Подставляем известные значения[pic 2][pic 3]

Рисунок 1 – График, построенный по формуле плотности распределения

  1. Алгоритм

Алгоритм работы программы поделен мной на 6 блоков:

      - для подпрограмм:

А)   создание функции с заданным законом распределения;

Б) создание функции численного интегрирования методом средних прямоугольников;

- для основной программы:

В) Численный поиск максимума функции;

Г) Поиск правой границы b (где функция < 1% от максимума);

Д) Подготовка данных для метода Брусленко;

Е) Генерация случайных чисел методом Брусленко[pic 4]

Рисунок 1 – Алгоритм программы блока А

                       а)                                                                           б)[pic 5][pic 6]

Рисунок 2 (а,б) – Алгоритм работы программы: а) блока Б; б) блока В[pic 7]

 Рисунок 3 – Алгоритм работы программы блока Г

                             а)                                                                         б) [pic 8][pic 9]

Рисунок 4 (а,б) – Алгоритм работы программы: а) блока Д, б) блока Е

  1. Программа (C++)

  1. #include <iostream>
  2. #include <cmath>
  3. #include <ctime>
  4. #include <cstdlib>
  5. using namespace std;
  6. /*
  7. Функция плотности вероятности
  8. y - входное значение
  9. Возвращает значение функции плотности в точке y
  10. */
  11. double func(double y) {
  12.     return  pow(y, 3) * exp(-y * y / 2.0) / 2.0;
  13. }
  14. /*
  15.  * Функция численного интегрирования методом средних прямоугольников
  16.  * a - нижний предел интегрирования
  17.  * b - верхний предел интегрирования
  18.  * Возвращает значение интеграла от a до b с точностью E
  19.  */
  20. double integ(double a, double b) {
  21.     const double E = 0.001; // желаемая точность вычисления интеграла
  22.     int n = 1; // начальное количество интервалов разбиения
  23.     double h = (b - a) / n; // Шаг интегрирования
  24.     double S1 = 0, S2; // S1 - текущая сумма, S2 - предыдущая сумма
  1.     do {
  2.         n *= 2; // Удваиваем количество интервалов
  3.         h = (b - a) / n; // Пересчитываем шаг интегрирования
  4.         S2 = S1; // Сохраняем предыдущее значение суммы
  5.         S1 = 0; // Обнуляем текущую сумму
  6.         // Суммируем значения функции в средних точках интервалов
  7.         for (int i = 0; i < n; ++i) {
  8.             S1 += func(a + (i + 0.5) * h);
  9.         }
  10.         S1 *= h; // Умножаем сумму на шаг интегрирования
  11.         // Повторяем, пока не достигнем нужной точности
  12.     } while (fabs(S1 - S2) > E);
  13.     return S1;
  14. }
  15. int main() {
  16.     // Инициализация генератора случайных чисел текущим временем
  17.     srand(static_cast<unsigned>(time(nullptr)));
  18.     // Численный поиск максимума функции
  19.     double max_y = 0;       // Максимальное значение функции
  20.     double x = 0;       // Точка, где достигается максимум
  21.     double s = 0.001;    // Шаг поиска
  22.     double y0 = 0.1; // Начальная точка поиска (избегаем y=0)
  23.     // Ищем максимум на интервале [0.1, 10.0]
  24.     while (y0 <= 10.0) {
  25.         double val = func(y0); // Значение функции в текущей точке
  26.         // Если нашли большее значение, обновляем максимум
  27.         if (val > max_y) {
  28.             max_y = val;
  29.             x = y0;
  30.         }
  31.         // Переходим к следующей точке
  32.       y0 += s;
  33.     }
  34.     cout << "max y = " << max_y << endl;
  35.     // Поиск правой границы b
  36.     double d = 0.1; // Шаг поиска границы
  37.     double y = x; // Начинаем поиск от точки максимума
  38.     double b = x; // Правая граница области
  39.     // Двигаемся вправо, пока значение функции > 1% от максимума
  40.     while (func(y) > max_y * 0.01) {
  41.         y += d;
  42.         b = y;
  43.     }
  44.     cout << "b = " << b << endl;
  45.     // Подготовка данных для метода Брусленко
  46.     const int K = 100; // Количество интервалов разбиения
  47.     double yk[K + 1];  // Массив границ интервалов
  48.     double F[K + 1] = { 0 };  // Массив значений интегральной функции
  49.     // Равномерное разбиение интервала [0, b] на K частей
  50.     for (int k = 0; k <= K; ++k) {
  51.         yk[k] = k * b / K; // Вычисляем k-ю границу
  52.     }
  53.     // Вычисление интегральной функции распределения
  54.     for (int k = 1; k <= K; ++k) {
  55.         F[k] = F[k - 1] + integ(yk[k - 1], yk[k]);
  56.     }
  57.     //Нормировка интегральной функции
  58.     for (int k = 1; k <= K; ++k) {
  59.         F[k] /= F[K]; // Делим все значения на F[K] (интеграл по всей области)
  60.     }
  61.     // Генерация случайных чисел
  62.     for (int i = 0; i < 100; ++i) {
  63.         //Генерируем равномерно распределенное число c1 [0, 1]
  64.         double c1 = static_cast<double>(rand()) / RAND_MAX;
  65.         //Находим интервал k, где F[k] <= c1 < F[k + 1]
  66.         int k = 0;
  67.         while (k < K && F[k + 1] < c1) {
  68.             k++;
  69.         }
  70.         //Генерируем второе равномерное число c2  [0,1]
  71.         double c2 = static_cast<double>(rand()) / RAND_MAX;
  72.         //Линейная интерполяция внутри выбранного интервала
  73.         double n = yk[k] + (yk[k + 1] - yk[k]) * c2;
  74.         cout << n << endl;
  75.     }
  76.     return 0;
  77. }

                                   а)                                                                                                   б)[pic 10][pic 11]

...

Скачать:   txt (14.2 Kb)   pdf (669.4 Kb)   docx (1.5 Mb)  
Продолжить читать еще 9 страниц(ы) »
Доступно только на Essays.club