Deprecated DifferentiableUnivariateFunction.

The interface and its implementations should be removed for 4.0. The
remaining uses in the library are only there for compatibility.
Everything else now use the new UnivariateDifferentiableFunction
interface and DerivativeStructure, which allow both arbitrary
differentiation order and arbitrary number of free parameters.

The next step for 3.1 is to replace the multidimensional functions (i.e.
multivariate functions, vector valued functions and matrix valued
functions).

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1383845 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Luc Maisonobe 2012-09-12 08:34:10 +00:00
parent 47e5bb380e
commit 85bab3ba61
5 changed files with 50 additions and 45 deletions

View File

@ -20,7 +20,9 @@ package org.apache.commons.math3.analysis;
* Extension of {@link UnivariateFunction} representing a differentiable univariate real function.
*
* @version $Id$
* @deprecated as of 3.1 replaced by {@link org.apache.commons.math3.analysis.differentiation.UnivariateDifferentiableFunction}
*/
@Deprecated
public interface DifferentiableUnivariateFunction
extends UnivariateFunction {

View File

@ -101,6 +101,7 @@ public class FunctionUtils {
*
* @param f List of functions.
* @return the composite function.
* @deprecated as of 3.1 replaced by {@link #compose(UnivariateDifferentiableFunction...)}
*/
public static DifferentiableUnivariateFunction compose(final DifferentiableUnivariateFunction ... f) {
return new DifferentiableUnivariateFunction() {
@ -186,7 +187,9 @@ public class FunctionUtils {
*
* @param f List of functions.
* @return a function that computes the sum of the functions.
* @deprecated as of 3.1 replaced by {@link #add(UnivariateDifferentiableFunction...)}
*/
@Deprecated
public static DifferentiableUnivariateFunction add(final DifferentiableUnivariateFunction ... f) {
return new DifferentiableUnivariateFunction() {
/** {@inheritDoc} */
@ -269,6 +272,7 @@ public class FunctionUtils {
*
* @param f List of functions.
* @return a function that computes the product of the functions.
* @deprecated as of 3.1 replaced by {@link #multiply(UnivariateDifferentiableFunction...)}
*/
public static DifferentiableUnivariateFunction multiply(final DifferentiableUnivariateFunction ... f) {
return new DifferentiableUnivariateFunction() {

View File

@ -17,6 +17,8 @@
package org.apache.commons.math3.analysis;
import org.apache.commons.math3.analysis.differentiation.DerivativeStructure;
import org.apache.commons.math3.analysis.differentiation.UnivariateDifferentiableFunction;
import org.apache.commons.math3.analysis.function.Add;
import org.apache.commons.math3.analysis.function.Constant;
import org.apache.commons.math3.analysis.function.Cos;
@ -67,27 +69,27 @@ public class FunctionUtilsTest {
@Test
public void testComposeDifferentiable() {
DifferentiableUnivariateFunction id = new Identity();
Assert.assertEquals(1, FunctionUtils.compose(id, id, id).derivative().value(3), EPS);
UnivariateDifferentiableFunction id = new Identity();
Assert.assertEquals(1, FunctionUtils.compose(id, id, id).value(new DerivativeStructure(1, 1, 0, 3)).getPartialDerivative(1), EPS);
DifferentiableUnivariateFunction c = new Constant(4);
Assert.assertEquals(0, FunctionUtils.compose(id, c).derivative().value(3), EPS);
Assert.assertEquals(0, FunctionUtils.compose(c, id).derivative().value(3), EPS);
UnivariateDifferentiableFunction c = new Constant(4);
Assert.assertEquals(0, FunctionUtils.compose(id, c).value(new DerivativeStructure(1, 1, 0, 3)).getPartialDerivative(1), EPS);
Assert.assertEquals(0, FunctionUtils.compose(c, id).value(new DerivativeStructure(1, 1, 0, 3)).getPartialDerivative(1), EPS);
DifferentiableUnivariateFunction m = new Minus();
Assert.assertEquals(-1, FunctionUtils.compose(m).derivative().value(3), EPS);
Assert.assertEquals(1, FunctionUtils.compose(m, m).derivative().value(3), EPS);
UnivariateDifferentiableFunction m = new Minus();
Assert.assertEquals(-1, FunctionUtils.compose(m).value(new DerivativeStructure(1, 1, 0, 3)).getPartialDerivative(1), EPS);
Assert.assertEquals(1, FunctionUtils.compose(m, m).value(new DerivativeStructure(1, 1, 0, 3)).getPartialDerivative(1), EPS);
DifferentiableUnivariateFunction inv = new Inverse();
Assert.assertEquals(0.25, FunctionUtils.compose(inv, m, id).derivative().value(2), EPS);
UnivariateDifferentiableFunction inv = new Inverse();
Assert.assertEquals(0.25, FunctionUtils.compose(inv, m, id).value(new DerivativeStructure(1, 1, 0, 2)).getPartialDerivative(1), EPS);
DifferentiableUnivariateFunction pow = new Power(2);
Assert.assertEquals(108, FunctionUtils.compose(pow, pow).derivative().value(3), EPS);
UnivariateDifferentiableFunction pow = new Power(2);
Assert.assertEquals(108, FunctionUtils.compose(pow, pow).value(new DerivativeStructure(1, 1, 0, 3)).getPartialDerivative(1), EPS);
DifferentiableUnivariateFunction log = new Log();
UnivariateDifferentiableFunction log = new Log();
double a = 9876.54321;
Assert.assertEquals(pow.derivative().value(a) / pow.value(a),
FunctionUtils.compose(log, pow).derivative().value(a), EPS);
Assert.assertEquals(pow.value(new DerivativeStructure(1, 1, 0, a)).getPartialDerivative(1) / pow.value(a),
FunctionUtils.compose(log, pow).value(new DerivativeStructure(1, 1, 0, a)).getPartialDerivative(1), EPS);
}
@Test
@ -104,14 +106,14 @@ public class FunctionUtilsTest {
@Test
public void testAddDifferentiable() {
DifferentiableUnivariateFunction sin = new Sin();
DifferentiableUnivariateFunction c = new Constant(4);
DifferentiableUnivariateFunction m = new Minus();
DifferentiableUnivariateFunction inv = new Inverse();
UnivariateDifferentiableFunction sin = new Sin();
UnivariateDifferentiableFunction c = new Constant(4);
UnivariateDifferentiableFunction m = new Minus();
UnivariateDifferentiableFunction inv = new Inverse();
final double a = 123.456;
Assert.assertEquals(- 1 / (a * a) -1 + Math.cos(a),
FunctionUtils.add(inv, m, c, sin).derivative().value(a),
FunctionUtils.add(inv, m, c, sin).value(new DerivativeStructure(1, 1, 0, a)).getPartialDerivative(1),
EPS);
}
@ -127,20 +129,20 @@ public class FunctionUtilsTest {
@Test
public void testMultiplyDifferentiable() {
DifferentiableUnivariateFunction c = new Constant(4);
DifferentiableUnivariateFunction id = new Identity();
UnivariateDifferentiableFunction c = new Constant(4);
UnivariateDifferentiableFunction id = new Identity();
final double a = 1.2345678;
Assert.assertEquals(8 * a, FunctionUtils.multiply(c, id, id).derivative().value(a), EPS);
Assert.assertEquals(8 * a, FunctionUtils.multiply(c, id, id).value(new DerivativeStructure(1, 1, 0, a)).getPartialDerivative(1), EPS);
DifferentiableUnivariateFunction inv = new Inverse();
DifferentiableUnivariateFunction pow = new Power(2.5);
DifferentiableUnivariateFunction cos = new Cos();
UnivariateDifferentiableFunction inv = new Inverse();
UnivariateDifferentiableFunction pow = new Power(2.5);
UnivariateDifferentiableFunction cos = new Cos();
Assert.assertEquals(1.5 * Math.sqrt(a) * Math.cos(a) - Math.pow(a, 1.5) * Math.sin(a),
FunctionUtils.multiply(inv, pow, cos).derivative().value(a), EPS);
FunctionUtils.multiply(inv, pow, cos).value(new DerivativeStructure(1, 1, 0, a)).getPartialDerivative(1), EPS);
DifferentiableUnivariateFunction cosh = new Cosh();
UnivariateDifferentiableFunction cosh = new Cosh();
Assert.assertEquals(1.5 * Math.sqrt(a) * Math.cosh(a) + Math.pow(a, 1.5) * Math.sinh(a),
FunctionUtils.multiply(inv, pow, cosh).derivative().value(a), 8 * EPS);
FunctionUtils.multiply(inv, pow, cosh).value(new DerivativeStructure(1, 1, 0, a)).getPartialDerivative(1), 8 * EPS);
}
@Test

View File

@ -16,6 +16,8 @@
*/
package org.apache.commons.math3.analysis;
import org.apache.commons.math3.analysis.differentiation.DerivativeStructure;
import org.apache.commons.math3.analysis.differentiation.UnivariateDifferentiableFunction;
import org.apache.commons.math3.analysis.function.Sinc;
/**
@ -24,8 +26,7 @@ import org.apache.commons.math3.analysis.function.Sinc;
* @version $Id$
*/
public class SumSincFunction implements DifferentiableMultivariateFunction {
private static final DifferentiableUnivariateFunction sinc = new Sinc();
private static final UnivariateFunction sincDeriv = sinc.derivative();
private static final UnivariateDifferentiableFunction sinc = new Sinc();
/**
* Factor that will multiply each term of the sum.
@ -59,7 +60,7 @@ public class SumSincFunction implements DifferentiableMultivariateFunction {
public MultivariateFunction partialDerivative(final int k) {
return new MultivariateFunction() {
public double value(double[] point) {
return sincDeriv.value(point[k]);
return sinc.value(new DerivativeStructure(1, 1, 0, point[k])).getPartialDerivative(1);
}
};
}
@ -74,7 +75,7 @@ public class SumSincFunction implements DifferentiableMultivariateFunction {
final double[] r = new double[n];
for (int i = 0; i < n; i++) {
final double x = point[i];
r[i] = factor * sincDeriv.value(x);
r[i] = factor * sinc.value(new DerivativeStructure(1, 1, 0, x)).getPartialDerivative(1);
}
return r;
}

View File

@ -16,11 +16,12 @@
*/
package org.apache.commons.math3.analysis.solvers;
import org.apache.commons.math3.analysis.DifferentiableUnivariateFunction;
import org.apache.commons.math3.analysis.FunctionUtils;
import org.apache.commons.math3.analysis.MonitoredFunction;
import org.apache.commons.math3.analysis.QuinticFunction;
import org.apache.commons.math3.analysis.UnivariateFunction;
import org.apache.commons.math3.analysis.differentiation.DerivativeStructure;
import org.apache.commons.math3.analysis.differentiation.UnivariateDifferentiableFunction;
import org.apache.commons.math3.analysis.function.Constant;
import org.apache.commons.math3.analysis.function.Inverse;
import org.apache.commons.math3.analysis.function.Sin;
@ -245,28 +246,23 @@ public final class BrentSolverTest {
@Test
public void testMath832() {
final DifferentiableUnivariateFunction f = new DifferentiableUnivariateFunction() {
private final DifferentiableUnivariateFunction sqrt = new Sqrt();
private final DifferentiableUnivariateFunction inv = new Inverse();
private final DifferentiableUnivariateFunction func
final UnivariateFunction f = new UnivariateFunction() {
private final UnivariateDifferentiableFunction sqrt = new Sqrt();
private final UnivariateDifferentiableFunction inv = new Inverse();
private final UnivariateDifferentiableFunction func
= FunctionUtils.add(FunctionUtils.multiply(new Constant(1e2), sqrt),
FunctionUtils.multiply(new Constant(1e6), inv),
FunctionUtils.multiply(new Constant(1e4),
FunctionUtils.compose(inv, sqrt)));
public double value(double x) {
return func.value(x);
return func.value(new DerivativeStructure(1, 1, 0, x)).getPartialDerivative(1);
}
public UnivariateFunction derivative() {
return func.derivative();
}
};
BrentSolver solver = new BrentSolver();
final double result = solver.solve(99,
f.derivative(),
1, 1e30, 1 + 1e-10);
final double result = solver.solve(99, f, 1, 1e30, 1 + 1e-10);
Assert.assertEquals(804.93558250, result, 1e-8);
}
}