|
Текст подпрограммы и версий gsr2r_p.zip |
Тексты тестовых примеров tgsr2r_p.zip |
Генерация массива псевдослучайных чисел, имеющих произвольное заданное распределение.
По таблично заданной желаемой функции распределения 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.
procedure GSR2R(var ISEED :Integer; N :Integer; var R :Array of Real;
var TBL :Array of Real; NX :Integer; var IP :Integer;
var IERR :Integer);
Параметры
| 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 - | генерация массива псевдослучайных чисел, pавномеpно распределенных в интервале (0, 1); |
| I IS9R - | интерполяция кубическим квази - эрмитовым сплайном табличной функции от одной переменной на неравномерной сетке; |
| UTGS10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы GSR2R. |
| UTI I10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы I IS9R. |
Замечания по использованию
| Если после обращения к GSR2R с одной функцией распределения необходимо обратиться к GSR2R с другой функцией распределения, то необходимо установить параметр IP = 0. |
Unit TGSR2R_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc, UtRes_p, GSR2R_p;
function TGSR2R: String;
implementation
function TGSR2R: String;
var
NX,N,IP,ISEED,_i,IERR :Integer;
R :АRray [0..2] of Real;
const
T :Array [0..29] of Real = ( 0.0,0.6,2.0,4.2,7.2,11.0,0.0,0.2,0.4,0.6,0.8,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0 );
begin
ReSULt := '';
NX := 6;
N := 3;
IP := 0;
ISEED := 12457;
GSR2R(ISEED,N,R,T,NX,IP,IERR);
Result := Result + #$0D#$0A;
for _i:=0 to 2 do
begin
Result := Result + Format('%20.16f ',[R[_i]]);
if ( ((_i+1) mod 3)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%5d %5d',[IP,IERR]) + #$0D#$0A;
UtRes('TGSR2R',Result); { вывод результатов в файл TGSR2R.res }
exit;
end;
end.
Результаты:
IP = 1
R = ( 0.192542, 3.772356, 3.887485 )
IERR = 0