Пример #1
0
            /// <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);
                }
            }
Пример #2
0
                /// <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));
                }
Пример #3
0
                /// <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);
                }