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

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

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