Habe versucht einen Zufallszahlenüberprüfung mittels run und chi-quadrattest zu programmieren, ich bekomme leider die Fehlercode:
Subscript indices must either be real positive integers or logicals.
Error in BSP25_Geiger_Haun (line 147)
chi_quadrat_table_run = chi(degrees_Of_freedom_run, helper_for_probability_run);
Weiß aber leider nicht was ich ändern muss, dass es funktioniert. Vll kann mir jemand helfen. Danke im voraus.
for i = 1:n
calc_rand = a * x0 + b;
calc_rand = mod(calc_rand, m);
random_nr(i) = calc_rand/m; % to receive real random numbers we devide with m end
r = sqrt(n); % r = sqrt(n) -> so we get about 10 separate sub quantities
% parameter for chi-quadrat test
npi = n * (1/r);
probability_npi = 1/r;
class_limit_low = 0; % lower limit of a class intervall
class_limit_high = probability_npi; % upper limit of a class intervall
numbers_in_intervall = zeros(1,r); % counts the quantity of random numbers in one class
for i = 1:r
for j = 1:n
if(class_limit_low <= random_nr(j)) && (random_nr(j) < class_limit_high)% which random numbers are in which class
numbers_in_intervall(i) = numbers_in_intervall(i) + 1; % count the quantity of random numbers in one class end end
class_limit_low = class_limit_high; % for the next intervall set the lower limit of the class equal to the uppper limit % lower limit of the next class is upper limit of the class before
class_limit_high = class_limit_high+probability_npi; % the new upper limit is the old upper limit + probability of npi end
chi_quadrat = 0;
for k = 1:length(numbers_in_intervall)% from 1 to the amount of numbers in class
chi_quadrat = chi_quadrat + ((numbers_in_intervall(k) - npi)^2)/npi; % sum of x0 = ((n-np)^2)/np end
% receive chi quadrat from the table
degrees_Of_freedom_r = r-1;
degrees_Of_freedom = degrees_Of_freedom_table(degrees_Of_freedom_r); % degrees of freedom in the table
for l = 1:length(probabilities)% from 1 to the quantity of probabilities in the table if probabilities(l) == level_of_significance % when the probabiliet is equal to the level of significance
helper_for_probability = l; % in this class is the right probability in the table end end
probability = probabilities(helper_for_probability); % probability
chi_quadrat_table = chi(degrees_Of_freedom, helper_for_probability); % chi quadrat from the table
% compare the calculated chi quadrat and the qui quadrat from the table fprintf('\n');
fprintf('Ergebnis des Chi-Quadrat-Test:\n');
if chi_quadrat <= chi_quadrat_table
fprintf('Die angeführten Zahlen werden mit einem Signifikanzniveau von %g % beibeihalten: \n', level_of_significance*100); disp(random_nr');
else fprintf('Die angeführten Zahlen werden mit einem Signifikanzniveau von %g % verworfen: \n', level_of_significance*100); disp(random_nr');
end
% Run-Test
random_nr_run = random_nr; % same random numbers for the run test
counter_length = 0; % counts the length for m = 1:n-1% compare each random number with the following if random_nr_run(m) < random_nr_run(m+1)% if the following random number is bigger
counter_length = counter_length + 1; % add one to the counter else
length_run(m) = counter_length;
counter_length = 0; % we put the counter to 0 end end
max_length_run = max(length_run);
for m = 1:max_length_run
counter_runs = 0; % counter for each length is zero at the start for n = 1:length(length_run)% from 1 to length of length_run if length_run(n) == m % compare all amounts of runs and counts them togehter
counter_runs = counter_runs + 1; % add one to the counter
runs(:,m) = counter_runs; % adds all sumed up amounts of runs to a vector from 1 to max_length end end end
for o = 1:max_length_run % from 1 to maximum length of run
pi_run(o) = (1/prod(1:(o))) - (1/prod(1:(o+1))); % formula P(R=l) = sum((1/l!)-(1/(l+1!)))
npi_run(o) = n_run*pi_run(o);
end
chi_quadrat_run = 0;
for p = 1:max_length_run % from 1 to the maximum length of the run do
chi_quadrat_run = chi_quadrat_run + ((runs(p) - npi_run(p))^2)/npi_run(p); % formula x0 = sum((((n-np)^2)/np) end
for x = 1:length(probabilities)% from 1 to the quantity of probabilities in the table if probabilities(x) == level_of_significance % when is p = the probability in table
helper_for_probability_run = x; % this is the location in the table end end
% compare the calculated chi quadrat for the run test and the qui quadrat from the table fprintf('\n');
fprintf('Run-Test:\n');
if chi_quadrat_run <= chi_quadrat_table_run
fprintf('Die angeführten Zahlen werden mit einem Signifikanzniveau von %g % beibeihalten: \n', level_of_significance); disp(random_nr_run');
else fprintf('Die angeführten Zahlen werden mit einem Signifikanzniveau von %g % verworfen: \n', level_of_significance); disp(random_nr_run');
end
Die Fehlermeldung klingt eindeutig: Offenbar ist einer der beiden Inputs kein positiver Integer. Dann ist er nicht als Index benutzbar.
Du kannst einen Breakpoint in die Zeile setzen und so sehr einfach selbst herausfinden, welche Werte die beiden Variablen haben.
Eine Bemerkung: Die Lesbarkeit des Codes wäre höher, wenn die Namen der Variablen etwas kürzer wären. Verständliche Namen sind zwar auf jeden Fall besser als "a,b,c", aber "level_of_significance" sagt auch nicht mehr als "Significance".
Manche Code-Blöcke können vereinfacht werden:
Code:
chi_quadrat = 0;
for k = 1:length(numbers_in_intervall)
chi_quadrat = chi_quadrat + ((numbers_in_intervall(k) - npi)^2)/npi; % sum of x0 = ((n-np)^2)/np end
for l = 1:length(probabilities)% from 1 to the quantity of probabilities in the table if probabilities(l) == level_of_significance % when the probabiliet is equal to the level of significance
helper_for_probability = l; % in this class is the right probability in the table end end
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.