Важная информация
Показано с 1 по 3 из 3

Тема: Критерий Колмогорова - Смирнова

  1. #1 Критерий Колмогорова - Смирнова 
    Новичок
    Регистрация
    08.01.2014
    Сообщений
    1
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Здравствуйте! Помогите, пожалуйста, у меня есть програмка, которая проверяет критерий Колмогорова-Смирновадля генератора случайных.
    Вот она:
    Код :
    program A_A_Kolm;
     
    type arDouble=array of Double;
     
    // сортировка по возрастанию
    procedure Puzyrek(var x:arDouble); 
    var t:Double;
    i,j,N:Integer;
    begin
    N:=Length(x);
    if N<2 then Exit;
    for i:=0 to N-2 do
    for j:=0 to N-2 do
    if x[j]>x[j+1] then
    begin
    t:=x[j+1];
    x[j+1]:=x[j];
    x[j]:=t;
    end;
    end;
     
    // вычисление критерия Колмогорова для равномерного распр.
    function krKolmgr(x:arDouble;a,b:Double):Double;
    var n,i:Integer;
    df,dfmax:Double;
    begin
    n:=Length(x);
    krKolmgr:=-1; 
    if n<2 then Exit;
    Puzyrek(x);
    dfmax:=0;
    for i:=0 to n-1 do
    begin
    df:=Abs((i+1)/n-(x[i]-a)/(b-a));
    if df>dfmax then dfmax:=df;
    end;
    krKolmgr:=dfmax*Sqrt(n);
    end;
     
    // функция распределения Колмогорова
    function Kolmogor(lam:Double):Double; 
    var i,k,n:Integer;
    s:Double;
    begin
    Kolmogor:=-1;
    if lam<0 then Exit;
    Kolmogor:=0;
    if lam<0.2 then Exit;
    Kolmogor:=1;
    if lam>3.5 then Exit;
    n:=Round(5.5/lam)+5;
    s:=0;
    if Odd(n)then k:=-1 else k:=1;
    for i:=-n to n do
    begin
    s:=s+k*Exp(-2*i*i*lam*lam);
    k:=-k;
    end;
    Kolmogor:=s;
    end;
     
    // пример - проверка генератора Random
    // равномерно распределенные на интервале 0..1 числа 
    var alph : Double;
    xrnd:arDouble;
    i:Integer;
    const N=30; 
    begin
    Randomize;
    SetLength(xrnd,N);
    for i:=0 to N-1 do xrnd[i]:=Random;
    alph:=1-Kolmogor(krKolmgr(xrnd,0,1));
    WriteLn(alph:0:6); // достигнутый уровень значимости
    ReadLn; 
    end.

    мне нужно за место генератора Random воткнуть свой:
    Код :
    program r;
    var
    f: array[0..1001] of integer;
    i: integer;;k:integer;
    begin
    k:=0;
    i := 1;
    f[0]:=1;
    f[1]:=1;
    while (i < 1001) do
    begin
    f[i+1]:=(f[i]+f[i-1]) mod 10;
    write(f[i-1], ' ');
    end;
    end.
    Помогите пожалуйста
    Ответить с цитированием  
     

  2. #2  
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    Опять сплошные копипастеры!
    Обязательно скопипастить где нибудь кусок кода, ну скопипастили, так хоть посмотрите что он делает и как!
    Вот совмещенный код для Вас, правда не пойму, почему значение функции "Randomize" никакой переменной не присваивается, я попытался угадать переменную...
    Еще сомнения цикл "while (i < 1001) do..." не пойму когда будет выход из цикла?
    Видимо есть еще ошибки, я не стал уже анализировать...

    Код :
    program A_A_Kolm;
     
    type arDouble=array of Double;
     
    // сортировка по возрастанию
    procedure Puzyrek(var x:arDouble); 
    var t:Double;
    i,j,N:Integer;
    begin
      N:=Length(x);
      if N<2 then Exit;
      for i:=0 to N-2 do
      for j:=0 to N-2 do
      if x[j]>x[j+1] then
      begin
        t:=x[j+1];
        x[j+1]:=x[j];
        x[j]:=t;
      end;
    end;
     
    // вычисление критерия Колмогорова для равномерного распр.
    function krKolmgr(x:arDouble;a,b:Double):Double;
    var n,i:Integer;
    df,dfmax:Double;
    begin
      n:=Length(x);
      krKolmgr:=-1; 
      if n<2 then Exit;
      Puzyrek(x);
      dfmax:=0;
      for i:=0 to n-1 do
      begin
        df:=Abs((i+1)/n-(x[i]-a)/(b-a));
        if df>dfmax then dfmax:=df;
      end;
      krKolmgr:=dfmax*Sqrt(n);
    end;
     
    // функция распределения Колмогорова
    function Kolmogor(lam:Double):Double; 
    var i,k,n:Integer;
    s:Double;
    begin
      Kolmogor:=-1;
      if lam<0 then Exit;
      Kolmogor:=0;
      if lam<0.2 then Exit;
      Kolmogor:=1;
      if lam>3.5 then Exit;
      n:=Round(5.5/lam)+5;
      s:=0;
      if Odd(n)then k:=-1 else k:=1;
      for i:=-n to n do
      begin
        s:=s+k*Exp(-2*i*i*lam*lam);
        k:=-k;
      end;
      Kolmogor:=s;
    end;
     
    // Функция случайностей ;)
    function Randomize1():Double;
    var
    f: array[0..1001] of integer;
    i: integer;
    k:integer;
    begin
      k:=0;
      i := 1;
      f[0]:=1;
      f[1]:=1;
      while (i < 1001) do
      begin
        f[i+1]:=(f[i]+f[i-1]) mod 10;
      write(f[i-1], ' ');
    end;
     
     
     
    // пример - проверка генератора Random
    // равномерно распределенные на интервале 0..1 числа 
    var alph : Double;
    xrnd:arDouble;
    i:Integer;
    const N=30; 
    begin
      // эту функцию убираем, 
      // вопрос в какую переменную присваиваются результаты?
      //Randomize;
      // эту функцию добавляем, не знаю угадал ли я с переменной
      xrnd:=Randomize1;
      SetLength(xrnd,N);
      for i:=0 to N-1 do xrnd[i]:=Random;
      alph:=1-Kolmogor(krKolmgr(xrnd,0,1));
      WriteLn(alph:0:6); // достигнутый уровень значимости
      ReadLn; 
    end;
    end.

    А еще математик Колмогорова изучает
    Последний раз редактировалось Dimon012; 09.01.2014 в 16:52. Причина: Мысли
    Ответить с цитированием  
     

  3. Пользователь сказал cпасибо:

    nik_1 (05.01.2015)

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •