Метод кусочно-линейной аппроксимации
Метод кусочно-линейной аппроксимации предложен Н.П. Бус- ленко и используется в тех случаях, когда одного выражения для обратной функции достичь не удается. Функция распределения F(x) заменяется функцией F*(x), состоящей из аппроксимированных отрезков прямых (или других подходящих простых функций, для которых можно найти обратную функцию). Число подынтервалов разбиения зависит от требуемой точности конечных результатов. На каждом интервале моделируется случайная величина с равномерным законом распределения (или другим аппроксимирующим простым распределением). Для получения выражения для реализации случайной величины Xнеобходимо решить уравнение г- F(x) относительно переменной Xна каждом аппроксимирующем интервале.
Пример. Составить программу моделирования случайной величины X, функция распределения которой F(x) аппроксимирована тремя линейными функциями:
Решение. Для каждого подынтервала решим уравнение г = F(x) относительно переменной х. Получим:
Схема алгоритма реализации случайной величины приведена на рис. 4.2.

Рис. 4.2. Схема алгоритма генерации случайной величины
Программа на языке C# имеет вид:
static void Main(string[] args)
{
Console.Write("Количество случайных величин n: "); int n = int.Parse(Console.ReadLine());
Random random = new Random(); double r, x;
for (int i = 0; i < n; i++)
{
r = random.NextDouble (); if (r < 0.5) x = 2 * r; else
if (r < 0.8) x = (r — 0.2) / 0.3; else x = 10 * r—6;
Console.WriteLine("x[{0}] = {l:f3}", i + 1, x);
}
Console.WriteLine("Моделирование завершено");
Console.ReadLine() ;
}
Пример. Составить программу моделирования случайной величины X, функция распределения которой F(x) аппроксимирована двумя простыми функциями:
Решение. Для каждого подынтервала решим уравнение R = F(x) относительно переменной х. Получим:
Программа на языке C# имеет вид:
static void Main(string[] args)
{
Console.Write("Количество случайных величин n: "); int n = int.Parse(Console.ReadLine());
Random random = new Random(); double r, x;
for (int i = 0; i < n; i++)
{
r = random.NextDouble ();
x = r < 0.5 ? Math.Sqrt(r) : r * r + 0.4571;
Console.WriteLine("x[{0}] = {l:f3}", i + 1, x);
}
Console.WriteLine("Моделирование завершено");
Console.ReadLine() ;
}