- •1. Методические указания
- •Имитационное моделирование простого события
- •Имитационное моделирование полной группы несовместных событий
- •Имитационное моделирование дискретной случайной величины
- •Метод обратной функции имитационного моделирования непрерывной случайной величины
- •Имитационное моделирование случайных величин с показательным распределением
- •Имитационное моделирование случайных величин с равномерным распределением
- •Имитационное моделирование случайных величин с нормальным распределением
- •Имитационное моделирование случайных величин с усеченным нормальным распределением
- •Имитационное моделирование случайных величин с произвольным распределением
- •Программная реализация имитационной модели случайных событий
- •Программная реализация имитационной модели дискретных случайных величин
- •Программная реализация имитационной модели непрерывных случайных величин
- •2. Задания для самостоятельного выполнения практических занятий
- •Библиографический список
Программная реализация имитационной модели дискретных случайных величин
Алгоритм имитационного моделирования случайных факторов в форме дискретных случайных величин, описанный в п. 5 на основе алгоритма из п. 4, реализован в среде программирования Borland Delphi 7. Windows-окно формы программы представлено на рис. 6. Код программы приведен ниже.
unit Unit1; {ИМ дискретных случайных величин}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
Label1: TLabel;{Количество возможных значений}
Edit1: TEdit;{Количество возможных значений}
Label2: TLabel;{Табличное задание случайной величины}
StringGrid1: TStringGrid;{Табличное задание случ. величины}
Label3: TLabel;{Точки разбиения единичного отрезка}
StringGrid2: TStringGrid;{Точки разбиения единичного отрезка}
Button1: TButton;{Реализация}
Label4: TLabel;{ДСЧ}
Edit2: TEdit;{ДСЧ}
Label5: TLabel;{Значение реализации случайной величины}
Edit3: TEdit;{Значение реализации случайной величины}
procedure Edit1Change(Sender: TObject);
procedure StringGrid1Exit(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const Max=1000;{Максимальное значение индекса массива}
var
X:array[1..Max] of extended;{Массив возможных значений}
P:array[1..Max] of extended;{Массив вер. реализ. заданных знач.}
L:array[1..Max] of extended;{Массив точек разбиен. един. отрезка}
z:extended;{Реализация ДСЧ}
n:cardinal;{Количество возможных значений}
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Edit1Change(Sender: TObject);
var i:cardinal;
begin{Подготовка к вводу параметров случайной величины}
n:=StrToInt(Edit1.Text);{Ввод кол-ва возможных знач. случ. вел.}
StringGrid1.RowCount:=n+1; StringGrid2.RowCount:=n+1;
StringGrid1.Cells[0,0]:='Номер';
StringGrid1.Cells[1,0]:='Значение';
StringGrid1.Cells[2,0]:='Вероятность';
StringGrid2.Cells[0,0]:='Номер';
StringGrid2.Cells[1,0]:='Точка разбиения';
for i:=1 to n do
begin
StringGrid1.Cells[0,i]:=IntToStr(i);
StringGrid2.Cells[0,i]:=IntToStr(i);
end;
end;
procedure TForm1.StringGrid1Exit(Sender: TObject);
var i,j:cardinal;
begin{Определение точек разбиения единичного отрезка}
for i:=1 to n do
begin
P[i]:=StrToFloat(StringGrid1.Cells[2,i]);
L[i]:=0; for j:=1 to i do L[i]:=L[i]+P[j];
StringGrid2.Cells[1,i]:=FloatToStr(L[i]);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i:cardinal;
begin{Определение реализации случайной величины}
randomize; z:=random;
Edit2.Text:=FloatToStr(z);{Вывод реализации ДСЧ}
for i:=1 to n do
begin
if z<L[i] then
begin
Edit3.Text:=StringGrid1.Cells[1,i];{Вывод знач. реал. случ. вел.}
break;
end;
end;
end;
end.
Рис. 6. Windows-окно формы программы имитационного моделирования случайных факторов в форме дискретных случайных величин
Программная реализация имитационной модели непрерывных случайных величин
Алгоритмы имитационного моделирования случайных факторов в форме непрерывных случайных величин, описанные в п. 7-11, реализованы в среде программирования Borland Delphi 7. Windows-окно формы программы представлено на рис. 7. Код программы приведен ниже.
unit Unit1;{ИМ непрерывных случайных величин}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Grids;
type
TForm1 = class(TForm)
RadioGroup1: TRadioGroup;{Закон распределения}
GroupBox1: TGroupBox;{Параметры распределения}
Label1: TLabel;{Среднее значение}
Edit1: TEdit;{Среднее значение}
Label2: TLabel;{Среднеквадратическое отклонение}
Edit2: TEdit;{Среднеквадратическое отклонение}
RadioGroup2: TRadioGroup;{Способ параметризации}
Label3: TLabel;{Минимальное значение}
Edit3: TEdit;{Минимальное значение}
Label4: TLabel;{Максимальное значение}
Edit4: TEdit;{Максимальное значение}
Label5: TLabel;{Длина отрезка}
Edit5: TEdit;{Длина отрезка}
GroupBox2: TGroupBox;{Параметры кусочно-постоянной аппроксимации распределения}
Label6: TLabel;{Количество частичных интервалов}
Edit6: TEdit;{Количество частичных интервалов}
Label7: TLabel;{Верхние границы частичных интервалов}
StringGrid1: TStringGrid;{Верхние границы частичных
интервалов}
GroupBox3: TGroupBox;{Расчеты}
Button1: TButton;{Реализация}
Label8: TLabel;{ДСЧ}
Edit7: TEdit;{ДСЧ}
Label9: TLabel;{Значение реализации случайной величины}
Edit8: TEdit;{Значение реализации случайной величины}
procedure RadioGroup1Click(Sender: TObject);
procedure RadioGroup2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Edit6Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
z:extended;{Реализация ДСЧ}
X:extended;{Значение реализации случайной величины}
n:cardinal;{Количество частичных интервалов}
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin{Определение способа задания распределения для выбранного закона}
GroupBox3.Visible:=true;{Исходные данные для расчетов заданы}
case RadioGroup1.ItemIndex of{Выбор закона распределения}
0:begin {Выбран показательный закон распределения}
RadioGroup2.Visible:=false;{Способ параметриз. не выбирается}
GroupBox1.Visible:=true;{Параметры распределения задаются}
GroupBox2.Visible:=false;{Кус.-пост. аппрокс. не производится}
Label1.Visible:=true; Edit1.Visible:=true;{Среднее знач. задается}
Label2.Visible:=false; Edit2.Visible:=false;{Ср.-кв. откл. не зад.}
Label3.Visible:=false; Edit3.Visible:=false;{Мин. знач. не зад.}
Label4.Visible:=false; Edit4.Visible:=false;{Макс. знач. не зад.}
Label5.Visible:=false; Edit5.Visible:=false;{Длина отрезка не задается}
end;
1:begin {Выбран равномерный закон распределения}
GroupBox3.Visible:=false;{Исх. данные для расчетов не заданы}
RadioGroup2.Visible:=true;{Способ параметр. выбирается}
RadioGroup2.ItemIndex:=-1;{Способ параметр. сначала не опр.}
GroupBox1.Visible:=false;{Параметры распред. сразу не зад.}
GroupBox2.Visible:=false;{Кус.-пост. аппрокс. не производится}
end;
2:begin {Выбран нормальный закон распределения}
RadioGroup2.Visible:=false;{Способ параметриз. не выбирается}
GroupBox1.Visible:=true;{Параметры распределения задаются}
GroupBox2.Visible:=false;{Кус.-пост. аппрокс. не производится}
Label1.Visible:=true; Edit1.Visible:=true;{Среднее значение зад.}
Label2.Visible:=true; Edit2.Visible:=true;{Ср.-кв. откл. задается}
Label3.Visible:=false; Edit3.Visible:=false;{Мин. знач. не зад.}
Label4.Visible:=false; Edit4.Visible:=false;{Макс. знач. не зад.}
Label5.Visible:=false; Edit5.Visible:=false;{Длина отрезка не задается}
end;
3:begin{Выбран усеченный нормальный закон распределения}
RadioGroup2.Visible:=false;{Способ параметриз. не выбирается}
GroupBox1.Visible:=true;{Параметры распределения задаются}
GroupBox2.Visible:=false;{Кус.-пост. аппрокс. не производится}
Label1.Visible:=true; Edit1.Visible:=true;{Ср. значение задается}
Label2.Visible:=true; Edit2.Visible:=true;{Ср.-кв. откл. задается}
Label3.Visible:=true; Edit3.Visible:=true;{Мин. знач. задается}
Label4.Visible:=true; Edit4.Visible:=true;{Макс. знач. задается}
Label5.Visible:=false; Edit5.Visible:=false;{Длина отрезка не задается}
end;
4:begin {Выбран произвольный закон распределения}
RadioGroup2.Visible:=false;{Способ параметриз. не выбирается}
GroupBox1.Visible:=false;{Параметры распред. не задаются}
GroupBox2.Visible:=true;{Кус.-пост. аппрокс. производится}
end;
end;
end;
procedure TForm1.RadioGroup2Click(Sender: TObject);
begin{Задание способа параметризации равномерного распределения}
GroupBox1.Visible:=true;{Параметры распределения задаются}
GroupBox3.Visible:=true;{Исходные данные для расчетов заданы}
Label2.Visible:=false; Edit2.Visible:=false;{Ср.-кв. откл. не зад.}
case RadioGroup2.ItemIndex of{Выбор способа параметризации}
0:begin{Выбрана параметриз. по мин. и макс. значению}
Label1.Visible:=false; Edit1.Visible:=false;{Ср. знач. не задается}
Label3.Visible:=true; Edit3.Visible:=true;{Мин. знач. задается}
Label4.Visible:=true; Edit4.Visible:=true;{Макс. знач. задается}
Label5.Visible:=false; Edit5.Visible:=false;{Длина отрезка не задается}
end;
1:begin{Выбрана параметриз. по среднему знач. и длине отрезка}
Label1.Visible:=true; Edit1.Visible:=true;{Среднее знач. задается}
Label3.Visible:=false; Edit3.Visible:=false;{Мин. знач. не зад.}
Label4.Visible:=false; Edit4.Visible:=false;{Макс. знач. не зад.}
Label5.Visible:=true; Edit5.Visible:=true;{Длина отрезка зад.}
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i:byte;j,k:cardinal;
begin{Вычисление реализации случайной величины}
randomize;
z:=random;
Edit7.Text:=FloatToStr(z);{Вывод реализации ДСЧ}
case RadioGroup1.ItemIndex of{Выбор закона распределения}
0: X:=-1*ln(z)*StrToFloat(Edit1.Text);{Выбран показ. закон}
1:begin {Выбран равномерный закон распределения}
case RadioGroup2.ItemIndex of{Выбор способа параметризации}
0:begin{Выбрана параметризация по мин. и макс. значению}
X:=StrToFloat(Edit3.Text)+z*(StrToFloat(Edit4.Text)
-StrToFloat(Edit3.Text));
end;
1:begin{Выбрана параметриз. по ср. знач. и длине отрезка}
X:=StrToFloat(Edit1.Text)+StrToFloat(Edit5.Text)*(z-0.5);
end;
end;
end;
2:begin{Выбран нормальный закон распределения}
X:=0;
for i:=1 to 12 do X:=X+random;
X:=StrToFloat(Edit1.Text)+StrToFloat(Edit2.Text)*(X-6);
end;
3:begin{Выбран усеченный нормальный закон распределения}
repeat
begin
X:=0;
for i:=1 to 12 do X:=X+random;
X:=StrToFloat(Edit1.Text)+
StrToFloat(Edit2.Text)*(X-6);
end
until (X>StrToFloat(Edit3.Text)) and
(X<StrToFloat(Edit4.Text));
end;
4:begin {Выбран произвольный закон распределения}
for j:=1 to n do
if z<j/n then
begin
k:=j;
break;
end;
z:=random;
X:=StrToFloat(StringGrid1.Cells[1,k])+
z*(StrToFloat(StringGrid1.Cells[1,k+1])-
StrToFloat(StringGrid1. Cells[1,k]));
end;
end;
Edit8.Text:=FloatToStr(X);{Вывод значения реализ. случ. вел.}
end;
procedure TForm1.Edit6Change(Sender: TObject);
var i:cardinal;
begin{Подготовка ввода границ частичных интервалов}
n:=StrToInt(Edit6.Text);{Ввод количества частичных интервалов}
StringGrid1.RowCount:=n+2;
StringGrid1.Cells[0,0]:='Номер';
StringGrid1.Cells[1,0]:='Граница';
for i:=0 to n do
StringGrid1.Cells[0,i+1]:=IntToStr(i);
end;
end.
Рис. 7. Windows-окно формы программы имитационного моделирования случайных факторов в форме непрерывных случайных величин