17 using rbf_base::rbf_base;
19 explicit biharmonic2d(
const std::vector<double>& params) {
20 set_parameters(params);
23 [[nodiscard]] std::unique_ptr<rbf_base> clone()
const override {
24 return std::make_unique<biharmonic2d>(*
this);
27 [[nodiscard]]
int cpd_order()
const override {
31 [[nodiscard]]
double evaluate_isotropic(
const vector3d& diff)
const override {
32 auto slope = parameters().at(0);
38 return slope * r * r * std::log(r);
41 [[nodiscard]] vector3d evaluate_gradient_isotropic(
const vector3d& diff)
const override {
42 auto slope = parameters().at(0);
46 return vector3d::Zero();
49 auto coeff = slope * (1.0 + 2.0 * std::log(r));
53 [[nodiscard]] matrix3d evaluate_hessian_isotropic(
const vector3d& )
const override {
54 throw std::runtime_error(
"Hessian of biharmonic2d is not implemented");
57 [[nodiscard]]
int num_parameters()
const override {
61 [[nodiscard]]
const std::vector<double>& parameter_lower_bounds()
const override {
62 static const std::vector<double> lower_bounds{0.0};
66 [[nodiscard]]
const std::vector<double>& parameter_upper_bounds()
const override {
67 static const std::vector<double> upper_bounds{std::numeric_limits<double>::infinity()};