29 template <
typename IncFun,
typename EvalFun>
32 constexpr
const double delta = 1e-9;
33 constexpr
const double scalar = 1.0 / delta;
35 int dim_x = jacobian.cols();
36 int dim_val = jacobian.rows();
38 Eigen::VectorXd f0(dim_val);
39 Eigen::VectorXd f1(dim_val);
42 for (
int i = 0; i < dim_x; ++i)
47 jacobian.col(i).noalias() = scalar * (f1 - f0);
51 template <
typename IncFun,
typename EvalFun>
54 constexpr
const double delta = 1e-5;
55 constexpr
const double scalar = 1 / (delta * delta);
57 assert(hessian.rows() == hessian.cols());
59 int dim_x = hessian.cols();
64 Eigen::VectorXd f0(dim_f);
65 Eigen::VectorXd f1(dim_f);
66 Eigen::VectorXd f2(dim_f);
67 Eigen::VectorXd f3(dim_f);
72 for (
int i = 0; i < dim_x; ++i)
74 for (
int j = 0; j < dim_x; ++j)
87 hessian(i, j) = scalar * (f3[0] - f1[0] - f2[0] + f0[0]) * multipliers[0];
88 for (
int v = 1; v < dim_f; ++v)
90 hessian(i, j) += scalar * (f3[v] - f1[v] - f2[v] + f0[v]) * multipliers[v];
95 hessian(i, j) = scalar * (f3[0] - f1[0] - f2[0] + f0[0]);
96 for (
int v = 1; v < dim_f; ++v)
98 hessian(i, j) += scalar * (f3[v] - f1[v] - f2[v] + f0[v]);
105 template <
typename IncFun,
typename EvalFun>
107 const double* multipliers)
109 constexpr
const double delta = 1e-5;
110 constexpr
const double scalar_x = 1 / (delta);
111 constexpr
const double scalar_xy = 1 / (delta * delta);
113 assert(hessian.rows() == hessian.cols());
114 assert(jacobian.cols() == hessian.cols());
116 int dim_x = hessian.cols();
117 int dim_f = jacobian.rows();
123 Eigen::VectorXd f0(dim_f);
124 Eigen::VectorXd f1(dim_f);
125 Eigen::VectorXd f2(dim_f);
126 Eigen::VectorXd f3(dim_f);
131 for (
int i = 0; i < dim_x; ++i)
133 for (
int j = 0; j < dim_x; ++j)
146 hessian(i, j) = scalar_xy * (f3[0] - f1[0] - f2[0] + f0[0]) * multipliers[0];
147 for (
int v = 1; v < dim_f; ++v)
149 hessian(i, j) += scalar_xy * (f3[v] - f1[v] - f2[v] + f0[v]) * multipliers[v];
151 if (i == j) jacobian.col(i).noalias() = scalar_x * (f1 - f0).cwiseProduct(multipliers_vec);
155 hessian(i, j) = scalar_xy * (f3[0] - f1[0] - f2[0] + f0[0]);
156 for (
int v = 1; v < dim_f; ++v)
158 hessian(i, j) += scalar_xy * (f3[v] - f1[v] - f2[v] + f0[v]);
160 if (i == j) jacobian.col(i).noalias() = scalar_x * (f1 - f0);
166 template <
typename IncFun,
typename EvalFun>
169 constexpr
const double delta = 1e-9;
170 constexpr
const double ddelta = 2 * delta;
171 constexpr
const double scalar = 1.0 / ddelta;
173 int dim_x = jacobian.cols();
174 int dim_val = jacobian.rows();
176 Eigen::VectorXd f0(dim_val);
177 Eigen::VectorXd f1(dim_val);
179 for (
int i = 0; i < dim_x; ++i)
185 jacobian.col(i).noalias() = scalar * (f1 - f0);
190 template <
typename IncFun,
typename EvalFun>
193 constexpr
const double delta = 1e-5;
194 constexpr
const double ddelta = 2 * delta;
195 constexpr
const double scalar_xx = 1 / (delta * delta);
196 constexpr
const double scalar_xy = 1 / (4.0 * delta * delta);
198 assert(hessian.rows() == hessian.cols());
200 int dim_x = hessian.cols();
202 Eigen::VectorXd f1(dim_f);
203 Eigen::VectorXd f2(dim_f);
204 Eigen::VectorXd f3(dim_f);
205 Eigen::VectorXd f4(dim_f);
211 for (
int i = 0; i < dim_x; ++i)
213 for (
int j = 0; j < dim_x; ++j)
226 hessian(i, j) = scalar_xx * (f1[0] - 2 * f2[0] + f3[0]) * multipliers[0];
227 for (
int v = 1; v < dim_f; ++v)
229 hessian(i, j) += scalar_xx * (f1[v] - 2 * f2[v] + f3[v]) * multipliers[v];
234 hessian(i, j) = scalar_xx * (f1[0] - 2 * f2[0] + f3[0]);
235 for (
int v = 1; v < dim_f; ++v)
237 hessian(i, j) += scalar_xx * (f1[v] - 2 * f2[v] + f3[v]);
259 hessian(i, j) = scalar_xy * (f1[0] - f2[0] - f3[0] + f4[0]) * multipliers[0];
260 for (
int v = 1; v < dim_f; ++v)
262 hessian(i, j) += scalar_xy * (f1[v] - f2[v] - f3[v] + f4[v]) * multipliers[v];
267 hessian(i, j) = scalar_xy * (f1[0] - f2[0] - f3[0] + f4[0]);
268 for (
int v = 1; v < dim_f; ++v)
270 hessian(i, j) += scalar_xy * (f1[v] - f2[v] - f3[v] + f4[v]);
278 template <
typename IncFun,
typename EvalFun>
280 const double* multipliers)
282 constexpr
const double delta = 1e-5;
283 constexpr
const double ddelta = 2 * delta;
284 constexpr
const double scalar_x = 1 / ddelta;
285 constexpr
const double scalar_xx = 1 / (delta * delta);
286 constexpr
const double scalar_xy = 1 / (2.0 * delta * delta);
288 assert(hessian.rows() == hessian.cols());
289 assert(jacobian.cols() == hessian.cols());
291 int dim_x = hessian.cols();
292 int dim_f = jacobian.rows();
298 Eigen::VectorXd f0(dim_f);
299 Eigen::VectorXd f1(dim_f);
300 Eigen::VectorXd f2(dim_f);
301 Eigen::VectorXd f3(dim_f);
302 Eigen::VectorXd f4(dim_f);
303 Eigen::VectorXd f5(dim_f);
304 Eigen::VectorXd f6(dim_f);
308 for (
int i = 0; i < dim_x; ++i)
310 for (
int j = 0; j < dim_x; ++j)
323 hessian(i, j) = scalar_xx * (f1[0] - 2 * f3[0] + f4[0]) * multipliers[0];
324 for (
int v = 1; v < dim_f; ++v)
326 hessian(i, j) += scalar_xx * (f1[v] - 2 * f3[v] + f4[v]) * multipliers[v];
328 jacobian.col(i).noalias() = scalar_x * (f1 - f4).cwiseProduct(multipliers_vec);
332 hessian(i, j) = scalar_xx * (f1[0] - 2 * f3[0] + f4[0]);
333 for (
int v = 1; v < dim_f; ++v)
335 hessian(i, j) += scalar_xx * (f1[v] - 2 * f3[v] + f4[v]);
337 jacobian.col(i).noalias() = scalar_x * (f1 - f4);
359 hessian(i, j) = scalar_xy * (f0[0] - f1[0] - f2[0] + 2 * f3[0] - f4[0] - f5[0] + f6[0]) * multipliers[0];
360 for (
int v = 1; v < dim_f; ++v)
362 hessian(i, j) += scalar_xy * (f0[v] - f1[v] - f2[v] + 2 * f3[v] - f4[v] - f5[v] + f6[v]) * multipliers[v];
367 hessian(i, j) = scalar_xy * (f0[0] - f1[0] - f2[0] + 2 * f3[0] - f4[0] - f5[0] + f6[0]);
368 for (
int v = 1; v < dim_f; ++v)
370 hessian(i, j) += scalar_xy * (f0[v] - f1[v] - f2[v] + 2 * f3[v] - f4[v] - f5[v] + f6[v]);
void jacobianHessian(IncFun inc_fun, EvalFun eval_fun, Eigen::Ref< Eigen::MatrixXd > jacobian, Eigen::Ref< Eigen::MatrixXd > hessian, const double *multipliers=nullptr)
static void jacobian(IncFun inc_fun, EvalFun eval_fun, Eigen::Ref< Eigen::MatrixXd > jacobian)
Compute Jacobian of a desired function.
static void jacobian(IncFun inc_fun, EvalFun eval_fun, Eigen::Ref< Eigen::MatrixXd > jacobian)
Compute Jacobian of a desired function.
A matrix or vector expression mapping an existing array of data.
void jacobianHessian(IncFun inc_fun, EvalFun eval_fun, Eigen::Ref< Eigen::MatrixXd > jacobian, Eigen::Ref< Eigen::MatrixXd > hessian, const double *multipliers=nullptr)
Compute Jacobian and Hessian of a desired function.
A matrix or vector expression mapping an existing expression.
static void hessian(IncFun inc_fun, EvalFun eval_fun, int dim_f, Eigen::Ref< Eigen::MatrixXd > hessian, const double *multipliers=nullptr)
static void hessian(IncFun inc_fun, EvalFun eval_fun, int dim_f, Eigen::Ref< Eigen::MatrixXd > hessian, const double *multipliers=nullptr)
Compute Hessian of a desired function.