mirror of
https://github.com/apache/commons-math.git
synced 2025-02-07 18:49:40 +00:00
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:
parent
47e5bb380e
commit
85bab3ba61
@ -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 {
|
||||
|
||||
|
@ -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() {
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user