You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2011/02/15 00:54:10 UTC
svn commit: r1070698 - in /commons/proper/math/trunk/src:
main/java/org/apache/commons/math/analysis/function/Gaussian.java
test/java/org/apache/commons/math/analysis/function/GaussianTest.java
Author: erans
Date: Mon Feb 14 23:54:10 2011
New Revision: 1070698
URL: http://svn.apache.org/viewvc?rev=1070698&view=rev
Log:
MATH-511
Implement "DifferentiableUnivariateRealFunction".
Modified:
commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/function/Gaussian.java
commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/function/GaussianTest.java
Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/function/Gaussian.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/function/Gaussian.java?rev=1070698&r1=1070697&r2=1070698&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/function/Gaussian.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/analysis/function/Gaussian.java Mon Feb 14 23:54:10 2011
@@ -18,6 +18,7 @@
package org.apache.commons.math.analysis.function;
import org.apache.commons.math.analysis.UnivariateRealFunction;
+import org.apache.commons.math.analysis.DifferentiableUnivariateRealFunction;
import org.apache.commons.math.exception.NotStrictlyPositiveException;
import org.apache.commons.math.util.FastMath;
@@ -28,7 +29,7 @@ import org.apache.commons.math.util.Fast
* @version $Revision$ $Date$
* @since 3.0
*/
-public class Gaussian implements UnivariateRealFunction {
+public class Gaussian implements DifferentiableUnivariateRealFunction {
/** Mean. */
private final double mean;
/** Inverse of twice the square of the standard deviation. */
@@ -80,4 +81,22 @@ public class Gaussian implements Univari
final double diff = x - mean;
return norm * FastMath.exp(-diff * diff * i2s2);
}
+
+ /** {@inheritDoc} */
+ public UnivariateRealFunction derivative() {
+ return new UnivariateRealFunction() {
+ /** {@inheritDoc} */
+ public double value(double x) {
+ final double diff = x - mean;
+ final double g = Gaussian.this.value(x);
+
+ if (g == 0) {
+ // Avoid returning NaN in case of overflow.
+ return 0;
+ } else {
+ return -2 * diff * i2s2 * g;
+ }
+ }
+ };
+ }
}
Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/function/GaussianTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/function/GaussianTest.java?rev=1070698&r1=1070697&r2=1070698&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/function/GaussianTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/analysis/function/GaussianTest.java Mon Feb 14 23:54:10 2011
@@ -39,8 +39,49 @@ public class GaussianTest {
public void testSomeValues() {
final UnivariateRealFunction f = new Gaussian();
- Assert.assertEquals(0, f.value(Double.NEGATIVE_INFINITY), 0);
Assert.assertEquals(1 / FastMath.sqrt(2 * Math.PI), f.value(0), EPS);
+ }
+
+ @Test
+ public void testLargeArguments() {
+ final UnivariateRealFunction f = new Gaussian();
+
+ Assert.assertEquals(0, f.value(Double.NEGATIVE_INFINITY), 0);
+ Assert.assertEquals(0, f.value(-Double.MAX_VALUE), 0);
+ Assert.assertEquals(0, f.value(-1e2), 0);
+ Assert.assertEquals(0, f.value(1e2), 0);
+ Assert.assertEquals(0, f.value(Double.MAX_VALUE), 0);
Assert.assertEquals(0, f.value(Double.POSITIVE_INFINITY), 0);
}
+
+ @Test
+ public void testDerivative() {
+ final Gaussian f = new Gaussian();
+ final UnivariateRealFunction dfdx = f.derivative();
+
+ Assert.assertEquals(0, dfdx.value(0), 0);
+ }
+
+ @Test
+ public void testDerivativeLargeArguments() {
+ final Gaussian f = new Gaussian(0, 1e-50);
+ final UnivariateRealFunction dfdx = f.derivative();
+
+ Assert.assertEquals(0, dfdx.value(Double.NEGATIVE_INFINITY), 0);
+ Assert.assertEquals(0, dfdx.value(-Double.MAX_VALUE), 0);
+ Assert.assertEquals(0, f.value(-1e50), 0);
+ Assert.assertEquals(0, f.value(-1e2), 0);
+ Assert.assertEquals(0, f.value(1e2), 0);
+ Assert.assertEquals(0, f.value(1e50), 0);
+ Assert.assertEquals(0, dfdx.value(Double.MAX_VALUE), 0);
+ Assert.assertEquals(0, dfdx.value(Double.POSITIVE_INFINITY), 0);
+ }
+
+ @Test
+ public void testDerivativeNaN() {
+ final Gaussian f = new Gaussian(0, 1e-50);
+ final UnivariateRealFunction dfdx = f.derivative();
+
+ Assert.assertTrue(Double.isNaN(dfdx.value(Double.NaN)));
+ }
}