Колмогоров смринов тест в с ++
Я написал программу на с ++ для теста Колмогорова Смринова, но она не работает. Он не возвращает d+(dp), d-(dn) правильное значение. Я не смог найти ошибку в программе. Пожалуйста, ребята, помогите быстрее. Я думаю, что есть некоторая ошибка при передаче массива как аргумента функции как для функции dplus, так и для dminus. ПРИМЕЧАНИЕ:- эта программа предназначена только для распределения, альфа-значения которого равны 0,05, а табличные значения - 0,565.
#include <stdio.h>
#include <math.h>
float dplus(float num[], int n);
float dminus(float num[], int n);
float larges(float data[], int n);
int main()
{
printf("Kolmogorov Test\n");
int n;
float dvalue1;
printf("Enter number of elements to compute for tets: \t");
scanf("%d", &n);
float num[n];
float dp, dn;
for(int i=0; i<n; i++)
{
scanf("%f", &num[i]);
}
//sorting in ascending order
for(int i=0; i<n; i++)
{
for(int j=i+1; j<n; j++)
{
if(num[i]>num[j])
{
float temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
}
printf("\nNumbers in ascending order is: \t");
for(int i=0; i<n; i++)
{
printf("%0.2f\t",num[i]);
}
dp = dplus(num, n);
dn = dminus(num, n);
printf("\ndp = %f",dp);
printf("\ndp = %f",dn);
if(dp>dn)
{
dvalue1 = dp;
}
else
{
dvalue1 = dn;
}
float dvalue = 0.565; //for alpha = 0.05
printf("\nCalculated D = %0.2f",dvalue1);
if(dvalue1 < dvalue)
{
printf("\n Since D is less tha Dalpha so the data is uniformily distributed.");
}
else
{
printf("\nSince D is greater than Dalpha so the data is not uniformily distributed.");
}
return 0;
}
float dplus(float num[], int n)
{
float data[n];
int count=1;
for(int i=0; i<n; i++)
{
while(count<=n)
{
data[i] = ((count/n)-num[i]);
count++;
}
}
float lar = larges(data, n);
return lar;
}
float dminus(float num[], int n)
{
float data[n];
int count=1;
for(int i=0; i<n; i++)
{
while(count<=n)
{
data[i] = (num[i]-((count-1)/n));
count++;
}
}
float lar = larges(data, n);
return lar;
}
float larges(float data[], int n)
{
for(int i=1; i<n; i++)
{
if(data[0]<data[i])
data[0] = data[i];
}
float lar = data[0];
return lar;
}
2 ответа
Этот код C должен дать вам правильные значения D+ и D, но я не уверен насчет критических значений.
#include <stdio.h>
double dplus(double num[], double d1[], int length, double n) {
for (int i = 0; i < length; i++) {
d1[i] = ((i + 1) / n) - num[i];
}
double d1max = d1[0];
for (int i = 0; i < length; i++) {
if (d1max <= d1[i]) {
d1max = d1[i];
}
}
printf("D+ = %f\n", d1max);
return d1max;
}
double dminus(double num[], double d2[], int length, double n) {
for (int i = 0; i < length; i++) {
d2[i] = (num[i] - (i) / n);
}
double d2max = d2[0];
for (int i = 0; i < length; i++) {
if (d2max <= d2[i]) {
d2max = d2[i];
}
}
printf("D- = %f\n", d2max);
return d2max;
}
void kst(double num[], int length) {
for (int i = 0; i < length; i++) {
for (int j = i + 1; j < length; j++) {
if (num[i] > num[j]) {
double temp;
temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
}
double d1[length];
double d2[length];
double n = (double) length;
double d1max = dplus(num, d1, length, n);
double d2max = dminus(num, d2, length, n);
double dplus = d1max;
double dminus = d2max;
double d;
if (dplus > dminus) {
d = dplus;
printf("D = %f\n", d);
} else {
d = dminus;
printf("D = %f\n", d);
}
}
int main() {
printf("Kolmogorov Test\n");
int n;
double dvalue1;
printf("Enter number of elements to compute for tets: \t");
scanf("%d", &n);
double num[n];
double dp, dn;
int i;
for (i = 0; i < n; i++) {
scanf("%lf", &num[i]);
}
kst(num, i);
}
count
переменные в вашем dplus()
а также dminus()
рутины, вместе со своим спутником while()
петли, кажется, не имеет смысла. Также вам следует позаботиться о том, чтобы ваши выражения делали целочисленные или плавающие деления. Ниже приведена упрощенная переделка вашего кода - посмотрите, ближе ли он к тому, что вы намереваетесь:
#include <stdio.h>
#include <math.h>
float dplus(float num[], int n);
float dminus(float num[], int n);
float largest(float data[], int n);
int main()
{
printf("Kolmogorov Test\n");
int n;
printf("Enter number of elements to compute for test: ");
scanf("%d", &n);
float num[n];
for (int i = 0; i < n; i++)
{
scanf("%f", &num[i]);
}
// sorting in ascending order
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (num[i] > num[j])
{
float temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
}
printf("Numbers in ascending order are: \t");
for (int i = 0; i < n; i++)
{
printf("%0.2f\t", num[i]);
}
printf("\n");
float dp = dplus(num, n);
float dn = dminus(num, n);
printf("dp = %f\n", dp);
printf("dn = %f\n", dn);
float dvalue = dn;
if (dp > dn)
{
dvalue = dp;
}
printf("Calculated D = %0.2f\n", dvalue);
float dalpha = 0.565; // for alpha = 0.05
if (dalpha > dvalue)
{
printf("Since D is less than Dalpha, the data is uniformly distributed.\n");
}
else
{
printf("Since D is greater than Dalpha, the data is not uniformly distributed.\n");
}
return 0;
}
float dplus(float num[], int n)
{
float data[n];
for (int i = 0; i < n; i++)
{
data[i] = (i + 1) / ((float) n) - num[i];
}
return largest(data, n);
}
float dminus(float num[], int n)
{
float data[n];
for (int i = 0; i < n; i++)
{
data[i] = num[i] - i / ((float) n);
}
return largest(data, n);
}
float largest(float data[], int n)
{
float large = data[0];
for (int i = 1; i < n; i++)
{
if (large < data[i])
large = data[i];
}
return large;
}
Я не вижу ошибок в передаче вашего массива.