Моделирование логнормального распределения

MessageBox('All of fields must be filled!', 'Error', MB_OK);

RestoreTopMosts;

end;

exit;

end;

//----------**initialization**--------------

T := GetTime;

Clear;

Chart1.Series[0].Clear;

Chart1.Series[1].Clear;

Chart1.Series[2].Clear;

sigma := StrToFloat(E1.Text);

mu := StrToFloat(E2.Text);

a := StrToFloat(E3.Text);

b := StrToFloat(E4.Text);

kk:=StrToint64(E5.Text);

if kk>2000000000 then

begin

Showmessage ('Очень большое число, введите меньшее');

exit;

end;

N := StrToInt(E5.Text);

g1:=100/N;

g2:=0;

Randomize;

M := 50;

//---------------**theoretical method**------------------

for i:=1 to 100 do

begin

if (i mod 10) =0 then application.ProcessMessages;

x := a+i*(b-a)/100;

//p := PL(x);

if x<>0 then

p := exp(-(ln(x)-mu)*(ln(x)-mu)/(2*sigma*sigma))/(x*sigma*Sqrt(2*Pi))

else

p := 0;

Chart1.Series[0].AddXY(x, p);

end; //---theoretical

//***********************************************************

МетодНеймана

//---------------**method of Neumann**------------------------

fmax :=Chart1.Series[0].MaxYValue;

{for i:=1 to N do

begin

if (i mod 10) =0 then application.ProcessMessages;

x := a+i*(b-a)/N;

f := PL(x);

if (f>fmax)then

fmax := f;

end;} //max

//------------------------------

Clear;

chi2_N:=0;

Mat:=0;

Mat2:=0;

Disp:=0;

i:=0;

Clear;

chi2_if := 0;

while true do

begin

if (i mod 10) =0 then application.ProcessMessages;

inc(i);

x := LogNorm();

Mat := Mat+x; //expectation

Mat2 := Mat2 +sqr(x);

if (x>b) or (x<a) then

continue;

u := trunc((x-a)/((b-a)/M));

gist[u] := gist[u]+1;

h1 := random;

h2 := random;

Ob := sqrt(-2*ln(h1))*cos(2*Pi*h2);

Ob := mu+Ob*sigma;

x := exp(Ob);

if (x>b) or (x<a) then

continue;

u := trunc((x-a)/((b-a)/M));

gist1[u] := gist1[u]+1;

g2:=g2+g1;

Gauge1.Progress:=trunc(g2)+1;

if i>N then break;

if flag=true then

begin

N:=i;

break;

end;

end;

Mat := Mat/N;

Mat2 := Mat2/N;

Disp := Mat2 - sqr(Mat);

for j:=0 to (M-1) do //------histogram

begin

sum := (Power(N*PL(a+(b-a)/M*(j+0.5))*(b-a)/M-gist[j], 2))/

(N*PL(a+(b-a)/M*(j+0.5))*(b-a)/M);

chi2_N := chi2_N+sum;

Chart1.Series[1].AddXY((a+(j+0.5)*(b-a)/M), gist[j]/N*M/(b-a));

end;

E6.Text := FloatToStrF(chi2_N, fffixed, 4, 4);//--chi-square for a Neumann

//****************************************************************

Метод обратной функции

//--------------**method of inverse function**-----------------

Clear;

chi2_if := 0;

{for i:=1 to N do

begin

h1 := random;

h2 := random;

Ob := sqrt(-2*ln(h1))*cos(2*Pi*h2);

Ob := mu+Ob*sigma;

x := exp(Ob);

if (x>b) or (x<a) then

continue;

u := trunc((x-a)/((b-a)/M));

gist[u] := gist[u]+1;

end;}

for j:=0 to (M-1) do //------histogram

begin

sum := (Power(N*PL(a+(b-a)/M*(j+0.5))*(b-a)/M-gist1[j], 2))/

(N*PL(a+(b-a)/M*(j+0.5))*(b-a)/M);

chi2_if := chi2_if+sum;

Chart1.Series[2].AddXY((a+(j+0.5)*(b-a)/M), gist1[j]/N*M/(b-a));

gist1[j]:=0;

end;

E8.Text := FloatToStrF(chi2_if, fffixed, 4, 4); //chi-sq for a inverse function

E10.Text := FloatToStr(exp(mu+sqr(sigma)/2)); //--expectation (teor)

E11.Text := FloatToStr(Mat); //--expectation (experim)

E12.Text := FloatToStr((exp(sqr(sigma))-1)*exp(2*mu+sqr(sigma)));

E13.Text := FloatToStr(Disp);

D := GetTime;

Z := MilliSecondSpan(D, T);

e5.Text:=IntTostr(N);

Edit1.Text := FloatToStrF(Z, fffixed, 6, 6);

//*****************************************************************

end;

procedure TForm1.Panel7Click(Sender: TObject);

begin

Close;

end;

procedure TForm1.E1KeyPress(Sender: TObject; var Key: Char);

begin

if (key='-')

then begin

if Pos ('-', (Sender as TEdit).Text)=0 then Begin (Sender as TEdit).SelStart:=0; key:='-'; end

else key:=#0;

end;

if Sender is TEdit then

begin

if Not((Key in ['0' '9'])or (Key=Chr(vk_Back))

or (Key=DecimalSeparator) or (Key='-')) then

Key:=#0

else

begin

if Key = DecimalSeparator then

if Pos(DecimalSeparator,(Sender as TEdit).Text)>0 then

Key:=#0;

end;

end;

end;

procedure TForm1.Aboutme1Click(Sender: TObject);

begin

AboutBox.Show;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Panel19.Caption := TimeToStr(Time);

end;

procedure TForm1.E1KeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if (ssShift in Shift)then

key:=0;

end;

procedure TForm1.Panel20Click(Sender: TObject);

begin

flag:=true;

end;

end.

Инструкция пользователю

При запуске программы перед пользователем открывается форма, на которой есть поля ввода параметров, поля вывода посчитанных значений, поле для вывода графика и кнопки, при нажатии на которые происходит то или иное событие.

Справа в разделе "Теоретически пользователь может ввести значение sigma и mu, те значения которые он считает нужными; a и b это интервал в пределах которого меняется график. И значение N – (количество єксперементов) – в зависемости от того сколько раз мы будем проводить єксперемент . В зависимости от выбора данных параметров пользователь может получить различные формы графика плотности вероятности.

В разделе "Критерий согласия" выводятся значения оценки Хи-квадрат для двух указанных методов. Ниже вывод математического ожидания и дисперсии, посчитанных теоретически и экспериментально.

Справа внизу формы выводится системное время и время выполнения расчётов в миллисекундах.

При нажатии на кнопку «Вывести графики и вычислить» слева выводятся график плотности логнормального распределения (построенный теоретически), гистограммы распределения случайной величины по логнормальному закону, смоделированные при помощи метода Неймана и метода обратной функции.

При нажатии на кнопку «Стоп» программа прекращаются свою работу и начинает считывать значения которые обработались до определенного момента и записует значения в поля.

При нажатии на кнопку «2D/3D» пользователь может наблюдать изменение графика из 2D в 3D и наоборот.

При нажатии на кнопку «Выход» программа будет завершена.

В закладке «About» пользователь может узнать о создателях данного программного продукта и краткое описание программного продукта.

Описание программного модуля.

Программа состоит из одного окна, на котором расположены все элементы управления. Справа формы находятся поля для ввода исходных данных.

В центре формы размещена кнопка «Вывести графики и вычислить», нажатие на которую запускает генератор случайных величин. На графике появляются две кривые описывающие функцию плотности логнормального распределения. Красным цветом изображена теоретическая кривая, а синим (метод обратной функции) и зеленым (метод Неймана) – полученная в результате эксперимента. Справа в полях отображаются значения математического ожидания и дисперсии

Страница:  1  2  3 


Другие рефераты на тему «Программирование, компьютеры и кибернетика»:

Поиск рефератов

Последние рефераты раздела

Copyright © 2010-2024 - www.refsru.com - рефераты, курсовые и дипломные работы