Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Создание «разреженного массива» в виде массива указателей покажем на примере решения конкретной задачи. Рассматривается задача моделирования непрерывной случайной величины ξ с распределением вероятности: ρ(x) = 1/x2 на интервале (1, ∞). Методом обратных функций получаем формулу для розыгрыша случайной величины ξ = 1/random. Для визуализации результатов моделирования получаемых значений случайной величины ξ по умолчанию выбирается шаг группировки равный 0.1, это значит, что все значения случайной величины, отличающиеся друг от друга меньше, чем на 0.1, заносятся в одну ячейку гистограммы. Интерфейс программы показан на рис. 6.
|
|
|
|
|
Рис. 6. Интерфейс программы моделирования случайной величины
На рисунке показан результат выполнения программы. При увеличении статистики разница между требуемым количеством ячеек гистограммы и количеством ячеек, которые используются в «разреженном массиве» («количество точек на графике»), еще более разительна.
Создадим класс для того, чтобы для каждой уникальной точки хранить значения индекса и количество точек, попавших в этот индекс.
type
TOne= class (TObject)
Find:integer;
Fvalue:integer;
Constructor Create(Fi,Fv:integer);
end;
Что здесь имеется в виду под индексом Find?Пусть есть интервал от a до b.
Рис. 7. Индекс точки
Чтобы узнать, в какой интервал попадает случайная точка a ≤ d ≤ b, необходимо вычислить (d – a) / sh. Для распределения, выбранного для этого примера, интервал начинается с 1, поэтому индекс гистограммы равен trunc ((ξ -1)/sh). Описание глобальных переменных и конструктор класса Tone:
var
Form1: TForm1;
MyList:TList; // Объявление объектной переменной, списка //указателей
flag:boolean; // Флажок
stat:integer; // Статистика (берется из Edit1)
sh,ma:single; // sh - Шаг гистограммы (берется из Edit2)
// ma – максимальное значение случ. в-ны ξ
Constructor TOne.Create(Fi,Fv:integer);
begin
inherited Create;
FInd:=Fi; FValue:=Fv;
end;
Обработчик события OnCreate формы Form1:
procedure TForm1.FormCreate(Sender: TObject);
begin
MyList:=TList.Create; // создание списка указателей
Label2.Visible:=false; Label3.Visible:=false; Label6.Visible:=false;
end;
Обработчик события нажатие кнопки Run («Расчет»):
procedure TForm1.RunClick(Sender: TObject);
var Temp:TOne; //Переменная,чтобы использовать свойства класса TOne
d,t:single;
i,j,indArr:integer;
begin
Label2.Visible:=false; Label3.Visible:=false; Label6.Visible:=false;
MyList.Clear; // очистка списка
stat:=StrToInt(Edit1.Text); sh:=StrToFloat(Edit2.Text);
ma:=1; // нач. значение для поиска максимума
Randomize;
for i:=1 to stat do begin // очень большая статистика не нужна
t:=random;
if not (t=0) then d:=1/t else d:=1;
indArr:=trunc((d-1)/sh); // индекс
if d>ma then ma:=d; // максимальное значение случ. величины
if MyList.Count=0 then // если список пуст
MyList.Add(TOne.Create(indArr,1)) //добавить в список
else begin // не пустой список
flag:=false;
for j:=0 to MyList.Count-1 do begin // цикл по всему //списку, есть ли точка с инд indArr
Temp:=MyList.Items[j]; // указатель из MyList на Temp
if Temp.Find=IndArr then begin // indArr совпал
inc(Temp.Fvalue); // добавить к-во точек
flag:=true; // флаг - искали индекс и нашли
break;
end; // совпали
end; // цикл по всему списку
if flag=false then // индекс не нашли,пришло новое значение
MyList.Add(TOne.Create(IndArr,1)); //добавить в список end; // не пустой список
end; // цикл по статистике
Label2.Visible:=true; Label2.Caption:='Расчет закончен';
end;
Обработчик события нажатие кнопки Show («График»):
procedure TForm1.ShowClick(Sender: TObject);
var i:integer;
Temp:TOne;
x,y,y1:single;
begin
Chart1.Series[0].Clear; Chart1.Series[1].Clear;
if MyList.Count>0 then begin
Label2.Visible:=true;
Label2.Caption:='Количество точек на графике ='+ IntToStr(MyList.Count);
for i:=0 to MyList.Count-1 do begin // просмотреть весь список
Temp:=MyList.Items[i]; // очередной элемент списка
x:=Temp.Find*Sh+1;
y:=Temp.Fvalue/stat/sh; // моделируемое значение в точке x
y1:=1/(x*x); // аналитическое значение функции в точке x
Chart1.Series[0].AddXY(x,y,'',clTeeColor);
Chart1.Series[1].AddXY(x,y1,'',clTeeColor);
end;
Label3.Visible:=true;
Label3.Caption:='Требуемое число ячеек гистограммы = '+
IntToStr(Trunc((ma-1)/sh)+1);
Label6.Visible:=true;
Label6.Caption:='Максимальное значение случайной величины ='+
FloatToStrF(ma,ffFixed,6,3);
end; end;
Обработчик события OnClose формы Form1:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MyList.Free; // освободить память, отведенную для списка
Chart1.Series[0].Clear; // освободить память, отведенную под серию
Chart1.Series[1].Clear;
end;
Дата публикования: 2014-11-03; Прочитано: 301 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!