- •1. Методические указания
- •Имитационное моделирование простого события
- •Имитационное моделирование полной группы несовместных событий
- •Имитационное моделирование дискретной случайной величины
- •Метод обратной функции имитационного моделирования непрерывной случайной величины
- •Имитационное моделирование случайных величин с показательным распределением
- •Имитационное моделирование случайных величин с равномерным распределением
- •Имитационное моделирование случайных величин с нормальным распределением
- •Имитационное моделирование случайных величин с произвольным распределением
- •Программная реализация имитационной модели случайных событий
- •Имитационное моделирование случайных величин с усеченным нормальным распределением
- •Программная реализация имитационной модели дискретных случайных величин
- •Программная реализация имитационной модели непрерывных случайных величин
- •2. Задания для самостоятельного выполнения практических занятий
- •Библиографический список
Программная реализация имитационной модели непрерывных случайных величин
Алгоритмы имитационного моделирования случайных факторов в форме непрерывных случайных величин, описанные в п. 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-окно формы программы имитационного моделирования случайных факторов в форме непрерывных случайных величин
