Описание программы
В ходе выполнения лабораторной работы, с целью автоматизации проведения необходимых расчетов, был разработан программный продукт lab4.exe, который выполняет следующие функции:
Генерация массивов данных с равномерным, экспоненциальным и релеевским законами распределения (представляют интервалы времени между нахождением ошибок).
Подсчет характеристик fmиgmдля 60%, 80% и 100% элементов массивов
Вывод полученных результатов в виде таблиц в файл.
Реализуемые в программе массивы чисел представляют прототип массивов интервалов времени между обнаружением ошибок в какой – то программной системе. (Более подробные теоретические сведения см. предыдущий раздел). Далее программа для каждого массива рассчитывает значение первоначального числа ошибок в программной системе (при этом используются 60%, 80%, 100% сгенерированных массивов). Производится расчет характеристик fmиgm и их разности с целью дальнейшего анализа результатов и определения оценкиB– числа первоначальных ошибок в программной системе. Подсчетfmиgm завершается при достижении их разности значения 0,0001. Считается, что такая точность достаточна для получения корректных результатов (при уменьшении данного значения последовательностиfmиgm сходятся медленно, иmможет достигать значений порядка нескольких тысяч).
Данный программный продукт полностью реализован на языке Pascal.
Текст программы
usesCRT;
const
MAX = 30;
var
i:integer;
a_60, a_80, a_100:real;
f:Text;
procedure GenerateRandom(max, floor:integer; var aRandom_60, aRandom_80, aRandom_100:real);
var
i:integer;
x, sumR, sumIR:real;
begin
repeat
sumR := 0; sumIR := 0;
writeln(f);
for i := 1 to max do
begin
x := random(floor);
write(f, x:6:2);
sumR := sumR + x;
sumIR := sumIR + i*x;
if i = Round(max*0.6) then
aRandom_60 := sumIR/sumR;
if i = Round(max*0.8) then
aRandom_80 := sumIR/sumR;
if (i mod 10 = 0) then
writeln(f);
end;
aRandom_100 := sumIR/sumR;
writeln(f);
until ((aRandom_100 > (max + 1)/2) and
(aRandom_80 > (Round(max*0.8) + 1)/2) and
(aRandom_60 > (Round(max*0.6) + 1)/2));
end;
procedure GenerateExponential(max:integer; b:real; var aExp_60, aExp_80, aExp_100:real);
var
i:integer;
y,w:real;
sumE, sumIE:real;
begin
repeat
sumE := 0; sumIE := 0;
writeln(f);
for i := 1 to max do
begin
y := -ln(random)/b;
w := b*exp(-b*y);
write(f, w:6:2);
sumE := sumE + w;
sumIE := sumIE + i*w;
if i = Round(max*0.6) then
aExp_60 := sumIE/sumE;
if i = Round(max*0.8) then
aExp_80 := sumIE/sumE;
if (i mod 10 = 0) then
writeln(f);
end;
aExp_100 := sumIE/sumE;
writeln(f);
until ((aExp_100 > (max + 1)/2) and
(aExp_80 > (Round(max*0.8) + 1)/2) and
(aExp_60 > (Round(max*0.6) + 1)/2));
end;
procedure GenerateRelay(max:integer; c:real; var aRel_60, aRel_80, aRel_100:real);
var
i:integer;
y,w:real;
sumR, sumIR:real;
begin
repeat
sumR := 0; sumIR := 0;
writeln(f);
for i := 1 to max do
begin
y := c*sqrt(-2*ln(random));
w := y/sqr(c)*exp(-sqr(y)/(2*sqr(c)));
write(f, w:6:2);
sumR := sumR + w;
sumIR := sumIR + i*w;
if i = Round(max*0.6) then
aRel_60 := sumIR/sumR;
if i = Round(max*0.8) then
aRel_80 := sumIR/sumR;
if (i mod 10 = 0) then
writeln(f);
end;
aRel_100 := sumIR/sumR;
writeln(f);
until ((aRel_100 > (max + 1)/2) and
(aRel_80 > (Round(max*0.8) + 1)/2) and
(aRel_60 > (Round(max*0.6) + 1)/2));
end;
procedure CheckEstimations(max:integer; a:real);
const
MIN_VAL = 0.0001;
var
i,m : integer;
gm,fm,d, d_new : real;
begin
{A_100}
writeln(f);
writeln(f,'_________________________________');
writeln(f,'| m | Fm | Gm | Delta |');
writeln(f,'_________________________________');
m := max + 1;
d_new:= 32767;
repeat
gm := 0; fm := 0;
d:=d_new;
for i := 1 to max do
fm := fm + 1/(m-i);
gm := max/(m - a);
d_new := fm - gm;
writeln(f,'|',m:5,'|',fm:8:5,'|',gm:8:5,'|',d_new:7:5,'|');
m := m + 1;
until (abs(d) < abs(d_new));
writeln(f,'_________________________________');
end;
begin
clrscr;
randomize;
assign(f,'lab4.txt');
rewrite(f);
{равномерное распределение}
writeln(f,'------------Генерация ',MAX,' чисел (равномерное распределение)------------');
writeln('Генерация ',MAX,' чисел (равномерное распределение)...');
GenerateRandom(MAX, 20, a_60, a_80, a_100);
writeln(f,'100% - A = ',a_100:6:3,', (n+1)/2 = ',(MAX+1)/2:6:3);
writeln(f,'80% - A = ',a_80:6:3,', (n+1)/2 = ',(Round(MAX*0.8)+1)/2:6:3);
writeln(f,'60% - A = ',a_60:6:3,', (n+1)/2 = ',(Round(MAX*0.6)+1)/2:6:3);
writeln(f);
writeln(f,'------------Вычисление оценок для ',MAX ,' чисел------------');
writeln('Вычисление оценок для ',MAX ,' чисел...');
CheckEstimations(MAX, a_100);
writeln(f);
writeln(f,'------------Вычисление оценок для ',Round(MAX*0.8) ,' чисел------------');
writeln('Вычисление оценок для ',Round(MAX*0.8) ,' чисел..');
CheckEstimations(Round(MAX*0.8), a_80);
writeln(f);
writeln(f,'------------Вычисление оценок для ',Round(MAX*0.6) ,' чисел------------');
writeln('Вычисление оценок для ',Round(MAX*0.6) ,' чисел...');
CheckEstimations(Round(MAX*0.6), a_60);
{экспоненциальное распределение}
writeln(f);
writeln;
writeln(f,'------------Генерация ',MAX,' чисел(экспоненциальное распределение)------------');
writeln('Генерация ',MAX,' чисел(экспоненциальное распределение)...');
GenerateExponential(MAX, 0.1, a_60, a_80, a_100);
writeln(f,'100% - A = ',a_100:6:3,', (n+1)/2 = ',(MAX+1)/2:6:3);
writeln(f,'80% - A = ',a_80:6:3,', (n+1)/2 = ',(Round(MAX*0.8)+1)/2:6:3);
writeln(f,'60% - A = ',a_60:6:3,', (n+1)/2 = ',(Round(MAX*0.6)+1)/2:6:3);
writeln(f);
writeln(f,'------------Вычисление оценок для ',MAX ,' чисел------------');
writeln('Вычисление оценок для ',MAX ,' чисел...');
CheckEstimations(MAX, a_100);
writeln(f);
writeln(f,'------------Вычисление оценок для ',Round(MAX*0.8) ,' чисел------------');
writeln('Вычисление оценок для ',Round(MAX*0.8) ,' чисел..');
CheckEstimations(Round(MAX*0.8), a_80);
writeln(f);
writeln(f,'------------Вычисление оценок для ',Round(MAX*0.6) ,' чисел------------');
writeln('Вычисление оценок для ',Round(MAX*0.6) ,' чисел...');
CheckEstimations(Round(MAX*0.6), a_60);
{релеевское распределение}
writeln(f);
writeln;
writeln(f,'------------Генерация ',MAX,' чисел (релеевское распределение)------------');
writeln('Генерация ',MAX,' чисел (релеевское распределение)...');
GenerateRelay(MAX, 8, a_60, a_80, a_100);
writeln(f,'100% - A = ',a_100:6:3,', (n+1)/2 = ',(MAX+1)/2:6:3);
writeln(f,'80% - A = ',a_80:6:3,', (n+1)/2 = ',(Round(MAX*0.8)+1)/2:6:3);
writeln(f,'60% - A = ',a_60:6:3,', (n+1)/2 = ',(Round(MAX*0.6)+1)/2:6:3);
writeln(f);
writeln(f,'------------Вычисление оценок для ',MAX ,' чисел------------');
writeln('Вычисление оценок для ',MAX ,' чисел...');
CheckEstimations(MAX, a_100);
writeln(f);
writeln(f,'------------Вычисление оценок для ',Round(MAX*0.8) ,' чисел------------');
writeln('Вычисление оценок для ',Round(MAX*0.8) ,' чисел..');
CheckEstimations(Round(MAX*0.8), a_80);
writeln(f);
writeln(f,'------------Вычисление оценок для ',Round(MAX*0.6) ,' чисел------------');
writeln('Вычисление оценок для ',Round(MAX*0.6) ,' чисел...');
CheckEstimations(Round(MAX*0.6), a_60);
close(f);
end.