26 double x[
n] = {0.0, 1.0, 2.0};
27 double y[
n] = {1.0, 2.0, 1.5};
32 CHECK(y2[0] == Approx(0));
33 CHECK(y2[1] == Approx(-2.25));
34 CHECK(y2[2] == Approx(0));
42 double x[
n] = {0.0, 1.0, 2.0};
43 double y[
n] = {1.0, 2.0, 1.5};
48 CHECK(y2[0] == Approx(0));
49 CHECK(y2[1] == Approx(-3.85714));
50 CHECK(y2[2] == Approx(6.42857));
58 double x[
n] = {0.0, 1.0, 2.0};
59 double y[
n] = {1.0, 2.0, 1.5};
64 CHECK(y2[0] == Approx(2.75));
65 CHECK(y2[1] == Approx(-5.5));
66 CHECK(y2[2] == Approx(10.25));
74 double x[
n] = {0.0, 1.2, 2.4, 3.0};
75 double y[
n] = {1.0, 2.0, 1.5, 1.8};
80 CHECK(y2[0] == Approx(0));
81 CHECK(y2[1] == Approx(-2.12121));
82 CHECK(y2[2] == Approx(2.23485));
83 CHECK(y2[3] == Approx(0));
91 double x[
n] = {0.0, 1.2, 2.4, 3.0};
92 double y[
n] = {1.0, 2.0, 1.5, 1.8};
97 CHECK(y2[0] == Approx(3.60507));
98 CHECK(y2[1] == Approx(-3.04348));
99 CHECK(y2[2] == Approx(2.31884));
100 CHECK(y2[3] == Approx(1.34058));
107 D2U(
double val_,
double du_,
double d2u_) :
val(val_),
du(du_),
d2u(d2u_) {}
118 std::vector<double> yvals = {1.0, 2.0, 1.5};
120 auto grid = std::make_unique<LinearGrid<double>>();
121 grid->set(0.0, 2.0,
n);
131 cubic_spline.
spline(imin, yp0, imax, ypn);
133 std::vector<double> check_xvals = {0.0, 0.39999999998, 0.79999999996, 1.19999999994, 1.59999999992, 1.9999999999};
134 std::vector<double> check_yvals;
135 std::vector<D2U> check_yvals_d2u;
137 for (
int i = 0; i < check_xvals.size(); i++)
139 double r = check_xvals[i];
140 double val = cubic_spline.
splint(r);
141 check_yvals.push_back(val);
144 double val2 = cubic_spline.
splint(r, du, d2u);
145 check_yvals_d2u.push_back(
D2U(val2, du, d2u));
150 CHECK(check_yvals[0] == Approx(1));
151 CHECK(check_yvals[1] == Approx(1.532));
152 CHECK(check_yvals[2] == Approx(1.976));
153 CHECK(check_yvals[3] == Approx(1.836));
154 CHECK(check_yvals[4] == Approx(1.352));
155 CHECK(check_yvals[5] == Approx(1.5));
157 CHECK(check_yvals_d2u[0].val == Approx(1));
158 CHECK(check_yvals_d2u[0].du == Approx(1));
159 CHECK(check_yvals_d2u[0].d2u == Approx(2.75));
160 CHECK(check_yvals_d2u[1].val == Approx(1.532));
161 CHECK(check_yvals_d2u[1].du == Approx(1.44));
162 CHECK(check_yvals_d2u[1].d2u == Approx(-0.55));
163 CHECK(check_yvals_d2u[2].val == Approx(1.976));
164 CHECK(check_yvals_d2u[2].du == Approx(0.56));
165 CHECK(check_yvals_d2u[2].d2u == Approx(-3.85));
166 CHECK(check_yvals_d2u[3].val == Approx(1.836));
167 CHECK(check_yvals_d2u[3].du == Approx(-1.16));
168 CHECK(check_yvals_d2u[3].d2u == Approx(-2.35));
169 CHECK(check_yvals_d2u[4].val == Approx(1.352));
170 CHECK(check_yvals_d2u[4].du == Approx(-0.84));
171 CHECK(check_yvals_d2u[4].d2u == Approx(3.95));
172 CHECK(check_yvals_d2u[5].val == Approx(1.5));
173 CHECK(check_yvals_d2u[5].du == Approx(2));
174 CHECK(check_yvals_d2u[5].d2u == Approx(10.25));
void CubicSplineSolve(T const *x, T const *y, int n, T yp0, T ypn, T *y2)
Solve for second derivatives for cubic splines.
helper functions for EinsplineSetBuilder
TEST_CASE("complex_helper", "[type_traits]")
value_type splint(point_type r) const override
void spline(int imin, value_type yp1, int imax, value_type ypn) override
Evaluate the 2nd derivative on the grid points.
CHECK(log_values[0]==ComplexApprox(std::complex< double >{ 5.603777579195571, -6.1586603331188225 }))
D2U(double val_, double du_, double d2u_)