/// <inheritdoc/> /// <exception cref="NumberIsTooLargeException"> if derivation order is greater /// than 1</exception> public DerivativeStructure value(DerivativeStructure t) { switch (t.getOrder()) { case 0: return(new DerivativeStructure(t.getFreeParameters(), 0, f.value(t.getValue()))); case 1: { int parameters = t.getFreeParameters(); double[] derivatives = new double[parameters + 1]; derivatives[0] = f.value(t.getValue()); double fPrime = f.derivative().value(t.getValue()); int[] orders = new int[parameters]; for (int i = 0; i < parameters; ++i) { orders[i] = 1; derivatives[i + 1] = fPrime * t.getPartialDerivative(orders); orders[i] = 0; } return(new DerivativeStructure(parameters, 1, derivatives)); } default: throw new NumberIsTooLargeException <Int32, Int32>(t.getOrder(), 1, true); } }
/// <inheritdoc/> public double value(double[] x) { int n = x.Length; // delegate computation to underlying function DerivativeStructure[] dsX = new DerivativeStructure[n]; for (int i = 0; i < n; ++i) { if (i == k) { dsX[i] = new DerivativeStructure(1, 1, 0, x[i]); } else { dsX[i] = new DerivativeStructure(1, 1, x[i]); } } DerivativeStructure y = f.value(dsX); // extract partial derivative return(y.getPartialDerivative(1)); }
/// <inheritdoc/> public double[] value(double[] x) { int n = x.Length; // delegate computation to underlying function DerivativeStructure[] dsX = new DerivativeStructure[n]; for (int i = 0; i < n; ++i) { dsX[i] = new DerivativeStructure(n, 1, i, x[i]); } DerivativeStructure y = f.value(dsX); // extract gradient double[] gradient = new double[n]; int[] orders = new int[n]; for (int i = 0; i < n; ++i) { orders[i] = 1; gradient[i] = y.getPartialDerivative(orders); orders[i] = 0; } return(gradient); }