summaryrefslogtreecommitdiffstats
path: root/DataStructure/NormDistribution.java
diff options
context:
space:
mode:
Diffstat (limited to 'DataStructure/NormDistribution.java')
-rw-r--r--DataStructure/NormDistribution.java77
1 files changed, 77 insertions, 0 deletions
diff --git a/DataStructure/NormDistribution.java b/DataStructure/NormDistribution.java
new file mode 100644
index 0000000..109d4fa
--- /dev/null
+++ b/DataStructure/NormDistribution.java
@@ -0,0 +1,77 @@
+package DataStructure;
+
+class NormDistribution {
+ double variance;
+ double mean;
+ static final double sqrtPI = 2.506628274631000502415765284811d;
+
+ public static void main(String args[]) {
+ NormDistribution one = new NormDistribution(5.12, 10);
+ NormDistribution two = new NormDistribution(5.12, 10);
+ NormDistribution three = new NormDistribution(0, 4);
+ System.out.println(one.intersection(two));
+ System.out.println("value at max: " + three.valueAt(2));
+ }
+
+ public NormDistribution(double mean, double variance) {
+ this.mean = mean;
+ this.variance = variance;
+ }
+
+ public double valueAt(double x) {
+ double std = Math.sqrt(variance);
+ // double sqrtPI = Math.sqrt(2 * Math.PI);
+
+ double exp = Math.exp(((Math.pow((x - mean), 2)) / variance) / (-2));
+ double result = (1 / (std * sqrtPI)) * exp;
+ return result;
+ }
+
+ /**
+ * Calculates the intersection area of both Distributions
+ *
+ * @param distribution
+ * @return
+ */
+ public double intersection(NormDistribution distribution) {
+
+ // return one, if both distributions are alike? (speedup)
+ if (Math.abs(this.mean - distribution.mean) < 0.01
+ && Math.abs(this.variance - distribution.variance) < 0.01) {
+ return 0.998;
+ }
+
+ // if (variance < 0.1 && distribution.variance < 0.1
+ // && Math.abs(mean - distribution.mean) < 0.1) {
+ // return 1;
+ // }
+
+ // get plus/minus 3*sigma Intervall (95% of the values)
+ double begin = -3.5
+ * Math.sqrt(Math.min(variance, distribution.variance))
+ + Math.min(mean, distribution.mean);
+ ;
+ double end = 3.5 * Math.sqrt(Math.max(variance, distribution.variance))
+ + Math.max(mean, distribution.mean);
+ // get stepwidth for integration.
+ double step = (end - begin) / 42; // Resolution: 42 steps!
+ // what if rounding errors appear and step == 0?
+ if (step < 0.0000001) {
+ return 0;
+ }
+
+ double area = 0;
+ end -= step;
+
+ for (double x0 = begin; x0 <= end; x0 += step) {
+ // get min value
+ double x1 = x0 + step;
+ double fx0 = Math.min(valueAt(x0), distribution.valueAt(x0));
+ double fx1 = Math.min(valueAt(x1), distribution.valueAt(x1));
+ area += fx0 * (x1 - x0) + ((x1 - x0) * (fx1 - fx0)) / 2;
+ }
+
+ return area;
+ }
+
+} \ No newline at end of file