Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИМЭП.doc
Скачиваний:
21
Добавлен:
02.04.2015
Размер:
543.23 Кб
Скачать

Программная реализация имитационной модели дискретных случайных величин

Алгоритм имитационного моделирования случайных факторов в форме дискретных случайных величин, описанный в п. 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-окно формы программы имитационного моделирования случайных факторов в форме непрерывных случайных величин