Учебная работа. Курсовая работа: Разработка программного продукта Delphi для моделирования логнормального распределения

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (5 оценок, среднее: 4,80 из 5)
Загрузка...
Контрольные рефераты

Учебная работа. Курсовая работа: Разработка программного продукта Delphi для моделирования логнормального распределения

Министерство науки и образования Украины

Харьковский Государственный Институт им. В.Н.Каразина

Факультет компьютерных наук

Кафедра моделирования систем и технологий


Разработка программного продукта Delphi для моделирования логнормального распределения

Курсовая работа по дисциплине

«Языки прикладного программирования»

Исполнитель

студент ******

Управляющий

Ст. преп

Харьков 2007


План

1. Введение

2. Проектирование

3. Индивидуальности реализации

4. Отладка и тестирование

5. Описание работы программного продукта

6. Заключение

7. Перечень применяемой литературы


Введение

В данной работе рассматривается логнормальное распределение, его связь с иными распределениями. В статистике так называемое логнормальное распределение применяется в том случае, когда начинает изменяться стоимость актива в дальнейшем – а это случайный процесс, который в принципе должен описываться обычным распределением. В то же время для целей вероятностной оценки цены актива в теории пользуются не обычным, а логнормальным распределением.

Это обосновано последующими причинами. Во-1-х, обычное распределение симметрично относительно ее центральной оси и может иметь как положительные, так и отрицательные значения; но стоимость актива не быть может отрицательной. Во-2-х, обычное распределение гласит о равной вероятности для значений переменной отклониться ввысь либо вниз. В то же время на практике, к примеру, имеет пространство И, которая оказывает давление на цены в сторону их увеличения, также сама временная суть средств: стоимость средств сейчас меньше, чем стоимость средств вчера, но больше, чем стоимость средств завтра. Кривая логнормального распределения постоянно положительна и имеет правостороннюю скошенность (асимметрично), т.е. она показывает на огромную возможность цены отклониться ввысь. Потому если, допустим, стоимость актива составляет 50 долл., то кривая логнормального распределения свидетельствует о том, что опцион оков с ценой выполнения 45 долл. должен стоить меньше опциона колл с ценой выполнения 55 долл., в то время как в согласовании с обычным распределением они должны могли быть иметь схожую стоимость. Хотя недозволено возлагать, что приведенные начальные догадки в точности производятся во всех настоящих рыночных ситуациях, тем не наименее принято считать, что логнормальное распределение довольно отлично как 1-ое приближение в случае активов, которыми ведут торговлю на конкурентных рынках аукционного типа для длинноватых рассматриваемых периодов.

Проектирование

Перед началом работы в среде Delphi мною, я разработал макет программного продукта в письменном варианте, где я зарисовал какая обязана быть основная форма (наружный вид ее), сколько и какие составляющие должны быть на данной для нас форме для комфортной работы юзера с данным продуктом. Также на этом макете я разработал план сотворения текста программки.

Опосля того, как была проделана вышеуказанная работа, я перебежал конкретно к созданию программного продукта на компе. Поначалу я сделал главную форму, подобающую макету (Рис.1). На ней находятся:

· 2 колонки выводов значений: На теоретическом уровне, Аспект согласия;

· в Теоретической колонке: sigma, mu, a, b;

· в Аспекты согласия: способ Неймана и способ оборотных функций;

· поля для вывода мат.ожидания и дисперсии;

· клавиши управления программкой и режимом просмотра;

· меню“Help” котороесодержитподменю “About me” и “About the program”;

· поле время выполнения;

· Aтакже клавиши “Вывести графики и вычислить” при нажатии которой программка считает все значения и выводит график на экран, “Выход”, для выхода из программки.

· Aтакже клавиша Stop при нажатии которой программка считает значения, которые обработались до определенного момента.


Рис. 1

Индивидуальности реализации

var

Form1: TForm1;

kk:Int64;

flag:boolean;

implementation

Плотностьраспределения

function TForm1.PL(x:double):double; //—density of distribution

begin

if x<>0 then

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

else

result := 0;

end;

function TForm1.LogNorm() : double; //—for a method of Neumann

var

y : real;

x : double;

begin

repeat

x := a+random*(b-a);

f := PL(x);

y := fmax*random;

until y<f;

result := x;

end;

procedure TForm1.Clear; //————clear array———

const M=50;

var j : integer;

begin

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

begin

gist[j] := 0;

end;

end;

procedure TForm1.Panel1Click(Sender: TObject);

var

x, r, sr, h1, h2, Ob,g1,g2, chi2_N, chi2_12, chi2_if, sum, Z : double;

p, y, Mat, Mat2, Disp : real;

M, j : integer;

N, i, u : longint;

begin

flag:=false;

Gauge1.Progress:=0;

//——-**All fields must be filled!**———

if (E1.Text=») or (E2.Text=») or (E3.Text=») or (E4.Text=») or

(E5.Text=») then

begin

with Application do

begin

NormalizeTopMosts;

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 PosactiveXSender as TEdit).Text)=0 then Begin (Sender as TEdit).SelStart:=0; keyactiveXend

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 (KeyactiveXthen

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.

Отладка и тестирование программки

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

Рис. 2

Так, же пробовал вводить остальные значения, график при всем этом не очень изменялся


Рис. 3

юзер может узреть приобретенные графики в трехмерном и в двухмерном пространстве: для этого нужно надавить клавишу 2D3D. Итог 3D графика можно узреть на рис. 3

Функция для 3D2D записана так

procedure TForm1.Panel12Click(Sender: TObject);

begin

Chart1.View3D:=Not Chart1.View3D;

end;

Рис. 4


Описание работы программного продукта

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

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

В разделе «Аспект согласия» выводятся значения оценки Хи-квадрат для 2-ух обозначенных способов. Ниже вывод математического ожидания и дисперсии, посчитанных на теоретическом уровне и экспериментально.

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

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

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

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

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

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


Заключение

В данной курсовой работе была достигнута поставленная цель: я исследовал и сделал программный продукт, который представляет моделирование на компе логнормального распределения. Научился использовать на практике свои познания приобретенные в процессе исследования Delphi.

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

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


Перечень применяемой литературы

1. HTTP://en.wikipedia.org

2. Шеффе Г. Дисперсионный анализ. — М.: Физматгиз, 1980. — 628 с.

3. «Delphi 2005: «Секреты программирования»», Миша Фленов.

]]>