Would you like to make this site your homepage? It's fast and easy...
Yes, Please make this my home page!
Implementación de la Distribución Normal Acumulada
Explicación de los métodos utilizados (C)
Código fuente
interface Evaluar
{
double f(double x);
}
class FuncZ implements Evaluar
{
public double f (double x)
{
return Math.exp(-Math.pow(x,2.0) / 2.0) / Math.sqrt(2.0 * Math.PI);
}
}
class Integral
{
public double sumaParcial(Double x, Double y, double h, Evaluar e)
{
double s = y.doubleValue();
s += 4 * e.f(x.doubleValue() + h);
x = new Double(x.doubleValue() + 2.0 * h);
y = new Double(e.f(x.doubleValue()));
s += y.doubleValue();
return s;
}
public double fintegral(Double a, double b, int n, Evaluar e)
{
double s = 0.0;
Double y = new Double(e.f(a.doubleValue()));
if (n % 2 != 0) n++;
double h = (b - a.doubleValue()) / n;
int cont = 0;
do
{
s += sumaParcial(a,y,h,e);
cont += 2;
} while(cont < n);
s *= h / 3.0;
return s;
}
}
class DistNormal
{
FuncZ fz;
Integral integral;
public DistNormal()
{
fz = new FuncZ();
integral = new Integral();
}
private double redondear4d(double num)
{
double aux = num * 10000;
int tmp = (int) aux;
return (double) tmp / 10000;
}
public double normal_acum(double z)
{
Double lim_inf = new Double(-3.60);
double acum = 0.000159;
double inc = 0.01;
do
{
acum += integral.fintegral(lim_inf,lim_inf.doubleValue() + inc , 4 , fz);
lim_inf = new Double(lim_inf.doubleValue() + inc);
} while (lim_inf.doubleValue() < z - inc);
return redondear4d(acum);
}
double dist_normal(double z)
{
return (z <= 0.0)? normal_acum(z) : 1.0 - normal_acum(-z);
}
double func_z(double prob)
{
Double lim_inf = new Double(-3.60);
double acum = 0.000159;
double inc = 0.01;
do
{
acum += integral.fintegral(lim_inf,lim_inf.doubleValue() + inc , 4 , fz);
lim_inf = new Double(lim_inf.doubleValue() + inc);
} while (acum < prob + 0.000159);
return redondear4d(lim_inf.doubleValue() - inc);
}
double obtener_z(double prob)
{
return (prob <= 0.5)? func_z(prob) : -func_z(1.0 - prob);
}
public static void main(String args[])
{
DistNormal d = new DistNormal();
System.out.println("P(Z < 2.66) : " + d.dist_normal(2.66));
System.out.println("Z(0.9962) : " + d.obtener_z(0.9962));
}
}
Bajar archivo