Помощь - Поиск - Пользователи - Календарь
Полная версия: Виснет программа
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Дмитрий
Написал программу которая должна строить практические и теоритические графики мат.ожидания, дисперсии и самой функции.
Проблема в том что при постройке графика дисперсии прога виснет.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, comobj, activex;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    GroupBox4: TGroupBox;
    Label7: TLabel;
    Button3: TButton;
    Button2: TButton;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
implementation

uses Unit2, Unit3, Unit4;

{$R *.dfm}
//
function eexp(n:double;te:double):double;
var sum:double;
    count:double;
    y:real;
begin
sum:=0;
count:=0;
randomize;
while count<=n do begin
y:=random(99)/100;
sum:=sum+(-2/te*ln(1-y));
count:=count+1;
end;
sum:=sum/n;
result:=sum;
end;
//
function dexp(n:double;te:double):double;
var sum:double;
    count:double;
    y,x:real;
begin
sum:=0;
count:=0;
randomize;
while count<=n do begin
y:=random(99)/100;
x:=(-2/te)*ln(1-y);
sum:=sum+(x-eexp(10,te));
end;
sum:=sum/n;
result:=sum;
end;
procedure TForm1.Button1Click(Sender: TObject);
var te,a,x:double;
    n:integer;
    y:real;
begin
form2.show;
a:=20;
te:=5;
randomize;
for n:=0 to 20 do begin
y:=random(99)/100;
x:=(-2/te)*ln(1-y);
form2.Series1.AddXY(x,1-exp(-te*x)-(x*exp(-te*x)),'',clRed);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var //b:integer;
    te,a:double;
begin
form3.show;
// a:=strtoint(form1.edit1.text);
a:=20;
form3.series1.clear;
te:=0.5;
while te <=a do
begin
//te:=round(i);
form3.series1.addxy(te, 2/te,'',clRed);
te:=te+te;
end;
te:=0.5;
while te<=a do
begin
form3.series2.addxy(te,eexp(100,te),'',clBlue);
te:=te+te;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var count:integer;
    te,a,sum:double;
begin
form4.show;
// a:=strtoint(form1.edit1.text);
a:=30;
form4.series1.clear;
te:=0.1;
while te <=a do
begin
//te:=round(i);
form4.series1.addxy(te, 2/(te*te),'',clRed);
te:=te+0.1;
end;
te:=0.1;
while te<=0.9 do
begin
form4.series2.AddXY(te,dexp(1,te),'',clBlue);
te:=te+0.1
end;
end;

end.


Практически дисперсию можно найти по формуле 1/n* сумма (Xi-Xсреднее).
Вот мне надо проделать это примерно 100 раз и усредненное значение будет примерно равно тетта.
х= (-2/тетта)*Ln(1-y)
y=random
Функция eexp - считает x среднее при данном тетта.
Функция dexp - считает как раз 1/n* сумма (Xi-Xсреднее).
Проблема новое окошко form4 виснет при запуске, причем даже если поставить всего один пробег.

Укажите на ошибку пожалуйста!
мисс_граффити
function dexp(n:double;te:double):double;
var sum:double;
count:double;
y,x:real;
begin
sum:=0;
count:=0;
randomize;
//вот на это место обрати внимание!
//отсюда
while count<=n do begin
y:=random(99)/100;
x:=(-2/te)*ln(1-y);
sum:=sum+(x-eexp(10,te));
end;
//и до сюда
sum:=sum/n;
result:=sum;
end;

условие выхода из цикла связано с count
а где этот count изменяется?

з.ы. сама такое же сейчас пишу sad.gif только у меня несколько видов распределений, генератор случайных чисел, моменты до 4-го порядка, проверка по критерию хи-квадрат...
в общем, мат статистика - жестокая штука.
Дмитрий
Большое спасибо =)

У нас это все в курсе теории вероятностей...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.