📄 d13r7.cpp
字号:
#include "iostream.h"
#include "math.h"
#include "stdlib.h"
double gammln(double xx)
{
double cof[7];
cof[1] = 76.18009173;
cof[2] = -86.50532033;
cof[3] = 24.01409822;
cof[4] = -1.231739516;
cof[5] = 0.00120858003;
cof[6] = -0.00000536382;
double stp = 2.50662827465;
double half = 0.5;
double one = 1.0;
double x,tmp,ser,fpf = 5.5;
x = xx - one;
tmp = x + fpf;
tmp = (x + half) * log(tmp) - tmp;
ser = one;
for (int j = 1; j<=6; j++)
{
x = x + one;
ser = ser + cof[j] / x;
}
return tmp + log(stp * ser);
}
double betacf(double a, double b, double x)
{
int em,tem,m,itmax = 100;
double d,ap,bp,aap,bpp,aold,eps = 0.0000003;
double am = 1.0;
double bm = 1.0;
double az = 1.0;
double qab = a + b;
double qap = a + 1.0;
double qam = a - 1.0;
double bz = 1.0 - qab * x / qap;
for (m = 1; m<=itmax; m++)
{
em = m;
tem = em + em;
d = em * (b - m) * x / ((qam + tem) * (a + tem));
ap = az + d * am;
bp = bz + d * bm;
d = -(a + em) * (qab + em) * x / ((a + tem) * (qap + tem));
aap = ap + d * az;
bpp = bp + d * bz;
aold = az;
am = ap / bpp;
bm = bp / bpp;
az = aap / bpp;
bz = 1.0;
if (fabs(az - aold) < eps * fabs(az))
{
return az;
}
}
cout<< "a or b too big, or itmax too small"<<endl;
exit(1);
}
void avevar(double data[], int n, double& ave, double& var)
{
ave = 0.0;
var = 0.0;
int j;
double s;
for (j = 1; j<=n; j++)
{
ave = ave + data[j];
}
ave = ave / n;
for (j = 1; j<=n; j++)
{
s = data[j] - ave;
var = var + s * s;
}
var = var / (n - 1);
}
double betai(double a, double b, double x)
{
double bt,aaa;
if (x < 0.0 || x > 1.0)
{
cout<<"bad argument x in betai"<<endl;
}
if (x == 0.0 || x == 1.0)
{
bt = 0.0;
}
else
{
aaa = gammln(a + b) - gammln(a) - gammln(b);
bt = exp(aaa + a * log(x) + b * log(1.0 - x));
}
if (x < (a + 1.0) / (a + b + 2.0))
{
return bt * betacf(a, b, x) / a;
}
else
{
return 1.0 - bt * betacf(b, a, 1.0 - x) / b;
}
}
void ftest(double data1[], int n1, double data2[], int n2, double& f, double& prob)
{
double df1,df2,dum1,dum2,ave1,ave2,var1,var2;
avevar(data1, n1, ave1, var1);
avevar(data2, n2, ave2, var2);
if (var1 > var2)
{
f = var1 / var2;
df1 = n1 - 1;
df2 = n2 - 1;
}
else
{
f = var2 / var1;
df1 = n2 - 1;
df2 = n1 - 1;
}
dum1 = betai(0.5 * df2, 0.5 * df1, df2 / (df2 + df1 * f));
dum2 = 1.0 - betai(0.5 * df1, 0.5 * df2, df1 / (df1 + df2 / f));
prob = dum1 + dum2;
}
double ran1(long& idum)
{
int j,iff=-1;
static long ix1,ix2,ix3;
static double r[98];
long m1 = 259200; long m2 = 134456; long m3 = 243000;
long ia1 = 7141; long ia2 = 8121; long ia3 = 4561;
long ic1 = 54773; long ic2 = 28411; long ic3 = 51349;
double rm1 = 0.0000038580247; double rm2 = 0.0000074373773;
if (idum < 0 || iff == 0)
{
iff = 1;
ix1 = (ic1 - idum) % m1;
ix1 = (ia1 * ix1 + ic1) % m1;
ix2 = ix1 % m2;
ix1 = (ia1 * ix1 + ic1) % m1;
ix3 = ix1 % m3;
for (j = 1; j<=97; j++)
{
ix1 = (ia1 * ix1 + ic1) % m1;
ix2 = (ia2 * ix2 + ic2) % m2;
r[j] = (double(ix1) + double(ix2) * rm2) * rm1;
}
idum = 1;
}
ix1 = (ia1 * ix1 + ic1) % m1;
ix2 = (ia2 * ix2 + ic2) % m2;
ix3 = (ia3 * ix3 + ic3) % m3;
j = 1 + int((97 * ix3) / m3);
if (j > 97 || j < 1)
{
cout<<"abnormal exit in ran1"<<endl;
exit(1);
}
double temp=r[j];
r[j] = (double(ix1) + double(ix2) * rm2) * rm1;
return temp;
}
double gasdev(long& idum)
{
static int iset;
static double gset;
double v1,v2,r,fac;
if (iset == 0)
{
do
{
v1 = 2.0 * ran1(idum) - 1.0;
v2 = 2.0 * ran1(idum) - 1.0;
r = v1 * v1 + v2 * v2;
}while (r >= 1.0 || r == 0);
fac = sqrt(-2.0 * log(r) / r);
gset = v1 * fac;
iset = 1;
return v2 * fac;
}
else
{
iset = 0;
return gset;
}
}
void main()
{
//program d13r7
//driver for routine ftest
int npts = 1000;
int i,j,mpts = 500;
double f,prob,var,factor,eps = 0.01;
int nval = 10;
double data1[1001], data2[501], data3[501];
//generate two gaussian distributions with
//different variances
long idum = -13;
for (j = 1; j<=npts; j++)
{
data1[j] = gasdev(idum);
}
for (j = 1; j<=mpts; j++)
{
data2[j] = gasdev(idum);
}
cout<<endl;
cout<<"Variance 1 = "<<1.0;
cout<<endl;
cout<<" Variance 2 Ratio Probability"<<endl;
cout.setf(ios::fixed|ios::right);
cout.precision(4);
for (i = 1; i<=nval + 1; i++)
{
var = 1.0 + (i - 1) * eps;
factor = sqrt(var);
for (j = 1; j<=mpts; j++)
{
data3[j] = factor * data2[j];
}
ftest(data1, npts, data3, mpts, f, prob);
cout.width(12);
cout<<var;
cout.width(12);
cout<<f;
cout.width(12);
cout<<prob<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -