Текст подпрограммы и версий gsr2r_c.zip |
Тексты тестовых примеров tgsr2r_c.zip |
Генерация массива псевдослучайных чисел, имеющих произвольное заданное распределение.
По таблично заданной желаeмoй функции распределения F (x) строится интерполяционный многочлен p (x) для функции F - 1 (x) - обратной по отношению к F (x).
Псевдослучайные величины с функцией распределения F (x) получаются по формуле R = p (u), где u - псевдослучайная величина, pавномеpно распределенная в интервале (0, 1).
Akima H., "A new method of interpolation and smooth curve fitting based on local procedures", JACM, 17(4), 1970, 589 - 602.
Guerra V.M., Tapia R.A., and Thomson J.R., "A random number generator for continuous random variables", ICSA Technical Report, Rice Univercity, Houston, Texas.
int gsr2r_c (integer *iseed, integer *n, real *r__, real *tbl, integer *nx, integer *ip, integer *ierr)
Параметры
iseed - | целая переменная, значение которой перед обращением к подпрограмме должно быть в пределах [1, 2147483646]; по окончании работы подпрограммы ей присваивается новое значение, котоpое может быть использовано при повторном вхождении в подпрограмму; |
n - | заданное количество псевдослучайных чисел, которые необходимо сгенерировать (тип: целый); |
r - | вещественный вектоp длины n содержащий полученные псевдослучайные величины; |
t - | двумерный вещественный массив размерностью nx * 5, содержащий табличные значения функции распределения F: элементы t (1, 1), t (2, 1), ..., t (nx, 1) содержат абсциссы, элементы t (1, 2), ..., t (nx,2) - ординаты ( т.е. F (t (i, 1)) = t (i, 2) ). Должны выполняться следующие условия: t (i, 1) < t (i + 1, 1), t (i, 2) < t (i + 1, 2) для i = 1, 2, ...,nx - 1; t (1, 2) = 0.; t (nx, 2) = 1.; остальные элементы массива используются для хранения промежуточных результатов; |
nx - | заданное количество узлов сетки, на которой задана функция распределения, nx ≥ 4 (тип: целый); |
ip - | задает режим работы подпрограмы (тип: целый); при этом если: |
ip= 0 - | то считается, что происходит первое обращение к подпрограмме и вычисляются коэффициенты интерполяционных полиномов; |
ip= 1 - | то коэффициенты интерполяционных полиномов считаются уже вычисленными; |
по окончании работы подпрограммы параметру ip присваивается значение единица; | |
ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
ierr=65 - | когда заданное количество узлов сетки, на которой задана функция распределения, меньше четырех; |
ierr=66 - | когда либо абсциссы, либо ординаты табличных значений функции распределения не являются строго монотонно возрастающими; |
ierr=67 - | когда t (1, 2) > 0, либо t (nx, 2) < 1. |
Версии: нет
Вызываемые подпрограммы
gsu1r_c - | генерация массива псевдослучайных чисел, pавномеpно распределенных в интервале (0, 1); |
i is9r_c - | интерполяция кубическим квази - эрмитовым сплайном табличной функции от одной переменной на неравномерной сетке; |
utgs10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы gsr2r_c. |
uti i10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы i is9r_с. |
Замечания по использованию
Если после обращения к gsr2r_c с одной функцией распределения необходимо обратиться к gsr2r_c с другой функцией распределения, то необходимо установить параметр ip = 0. |
int main(void) { /* Initialized data */ static float t[30] /* was [6][5] */ = { 0.f,.6f,2.f,4.2f,7.2f,11.f,0.f, .2f,.4f,.6f,.8f,1.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f, 0.f,0.f,0.f,0.f,0.f,0.f,0.f }; /* Local variables */ static int ierr; extern int gsr2r_c(int *, int *, float *, float *, int *, int *, int *); static int n; static float r__[3]; static int iseed, ip, nx; nx = 6; n = 3; ip = 0; iseed = 12457; gsr2r_c(&iseed, &n, r__, t, &nx, &ip, &ierr); printf("\n %16.7e %16.7e %16.7e \n",r__[0],r__[1],r__[2]); printf("\n %5i %5i \n",ip,ierr); return 0; } /* main */ Результаты: ip = 1 r = ( 0.192542, 3.772356, 3.887485 ) ierr = 0