16double Function::eval(
const std::vector<double>& x)
const
18 auto denseX = vectorToDenseVector(x);
22std::vector<double> Function::evalJacobian(
const std::vector<double>& x)
const
24 auto denseX = vectorToDenseVector(x);
25 return denseVectorToVector(evalJacobian(denseX));
28std::vector<std::vector<double >> Function::evalHessian(
29 const std::vector<double>
32 auto denseX = vectorToDenseVector(x);
33 return denseMatrixToVectorVector(secondOrderCentralDifference(denseX));
36std::vector<double> Function::centralDifference(
const std::vector<double>& x)
39 auto denseX = vectorToDenseVector(x);
40 auto dx = centralDifference(denseX);
41 return denseVectorToVector(dx);
44std::vector<std::vector<double >> Function::secondOrderCentralDifference(
45 const std::vector<double>& x)
const
47 auto denseX = vectorToDenseVector(x);
48 DenseMatrix ddx = secondOrderCentralDifference(denseX);
49 return denseMatrixToVectorVector(ddx);
52DenseMatrix Function::evalJacobian(DenseVector x)
const
54 return centralDifference(x);
57DenseMatrix Function::evalHessian(DenseVector x)
const
59 auto vec = denseVectorToVector(x);
60 auto hessian = evalHessian(vec);
61 return vectorVectorToDenseMatrix(hessian);
64DenseMatrix Function::centralDifference(DenseVector x)
const
66 DenseMatrix dx(1, x.size());
68 double hForward = 0.5 * h;
69 double hBackward = 0.5 * h;
71 for (
unsigned int i = 0; i < getNumVariables(); ++i)
73 DenseVector xForward(x);
74 xForward(i) = xForward(i) + hForward;
75 DenseVector xBackward(x);
76 xBackward(i) = xBackward(i) - hBackward;
77 double yForward = eval(xForward);
78 double yBackward = eval(xBackward);
79 dx(i) = (yForward - yBackward) / (hBackward + hForward);
85DenseMatrix Function::secondOrderCentralDifference(DenseVector x)
const
87 DenseMatrix ddx(getNumVariables(), getNumVariables());
89 double hForward = 0.5 * h;
90 double hBackward = 0.5 * h;
92 for (
size_t i = 0; i < getNumVariables(); ++i)
94 for (
size_t j = 0; j < getNumVariables(); ++j)
100 x0(i) = x0(i) + hForward;
101 x0(j) = x0(j) + hForward;
102 x1(i) = x1(i) - hBackward;
103 x1(j) = x1(j) + hForward;
104 x2(i) = x2(i) + hForward;
105 x2(j) = x2(j) - hBackward;
106 x3(i) = x3(i) - hBackward;
107 x3(j) = x3(j) - hBackward;
108 ddx(i, j) = (eval(x0) - eval(x1) - eval(x2) + eval(x3)) / (h * h);