Написал программу которая должна строить практические и теоритические графики мат.ожидания, дисперсии и самой функции. Проблема в том что при постройке графика дисперсии прога виснет.
{$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 виснет при запуске, причем даже если поставить всего один пробег.
Укажите на ошибку пожалуйста!
Автор: мисс_граффити 14.04.2007 15:29
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 изменяется?
з.ы. сама такое же сейчас пишу только у меня несколько видов распределений, генератор случайных чисел, моменты до 4-го порядка, проверка по критерию хи-квадрат... в общем, мат статистика - жестокая штука.