1 #ifndef __JTOOLS__JSPLINE__
2 #define __JTOOLS__JSPLINE__
20 namespace JPP {
using namespace JTOOLS; }
33 template<
class JOrdinate_t>
119 throw JNoValue(
"JSplineBounds: missing 1st derivative.");
133 throw JNoValue(
"JSplineBounds: missing 1st derivative.");
149 template<
class JOrdinate_t>
151 const JOrdinate_t fpAtXmax)
173 template<
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t>
175 public JCollection_t<JElement_t, JDistance_t>,
188 typedef typename collection_type::iterator
iterator;
201 const int numberOfElements = this->size();
205 if (numberOfElements > 2) {
214 const double dx = this->
getDistance(i->getX(), j->getX());
230 for (
iterator k = this->begin(), i =
k++,
j =
k++;
k != this->end(); ++i, ++
j, ++
k, ++index) {
241 const double h = sig * buffer[index-1] + 2.0;
243 buffer[index] = (sig - 1.0) / h;
248 j->setU((6.0 * j->getU() / this->
getDistance(x1, x3) - sig * i->getU()) / h);
257 index = numberOfElements - 2;
259 const double dx = this->
getDistance(i->getX(), j->getX());
264 i->setU((i->getU() - 0.5*j->getU()) / (0.5*buffer[index] + 1.0));
275 index = numberOfElements - 2;
277 for ( ; j != this->rend(); ++i, ++
j, --index) {
278 j->setU(j->getU() + i->getU() * buffer[index]);
283 for (
iterator i = this->begin(); i != this->end(); ++i) {
311 template<
class JElement_t,
312 template<
class,
class>
class JCollection_t,
321 template<
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t>
327 public JFunction<typename JElement_t::abscissa_type,
328 typename JResultType<typename JElement_t::ordinate_type>::result_type>
341 typedef typename collection_type::iterator
iterator;
367 if (this->size() <= 1
u) {
375 if ((p == this->begin() && this->
getDistance(x, (p++)->getX()) > distance_type::precision) ||
376 (p == this->end() && this->
getDistance((--p)->getX(), x) > distance_type::precision)) {
383 const double dx = this->
getDistance(p->getX(), q->getX());
385 const double b = 1.0 -
a;
387 return a * p->getY() + b * q->getY()
388 - a*b * ((a + 1.0)*p->getU() + (b + 1.0)*q->getU()) * dx*dx/6;
396 template<
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t>
402 public JFunction<typename JElement_t::abscissa_type,
403 JResultDerivative<typename JResultType<typename JElement_t::ordinate_type>::result_type> >
416 typedef typename collection_type::iterator
iterator;
444 if (this->size() <= 1
u) {
453 if ((p == this->begin() && this->
getDistance(x, (p++)->getX()) > distance_type::precision) ||
454 (p == this->end() && this->
getDistance((--p)->getX(), x) > distance_type::precision)) {
461 const double dx = this->
getDistance(p->getX(), q->getX());
463 const double b = 1.0 -
a;
465 result.f = a * p->getY() + b * q->getY()
466 - a*b * ((a + 1.0)*p->getU() + (b + 1.0)*q->getU()) * dx*dx/6;
468 result.fp = (q->getY() - p->getY() + (p->getU()*(1.0 - 3*a*
a) -
469 q->getU()*(1.0 - 3*b*b)) * dx*dx/6) / dx;
490 template<
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t>
496 public JFunction<typename JElement_t::abscissa_type,
497 JResultPDF<typename JResultType<typename JElement_t::ordinate_type>::result_type> >
510 typedef typename collection_type::iterator
iterator;
537 if (this->size() >= 2
u) {
539 collection_type::compile(bounds);
543 for (
iterator j = this->begin(), i =
j++;
j != this->end(); ++i, ++
j) {
545 const double dx = this->
getDistance(i->getX(),
j->getX());
552 j->setIntegral(i->getIntegral() + v -
w);
566 if (this->size() <= 1
u) {
574 if (p == this->begin() && this->
getDistance(x, (p++)->getX()) > distance_type::precision) {
583 result.V = this->rbegin()->getIntegral();
591 }
else if (p == this->end() && this->
getDistance((--p)->getX(), x) > distance_type::precision) {
599 result.v = this->rbegin()->getIntegral();
600 result.V = this->rbegin()->getIntegral();
611 const double dx = this->
getDistance(p->getX(), q->getX());
613 const double b = 1.0 -
a;
615 result.f = a * p->getY() + b * q->getY()
616 - a*b * ((a + 1.0)*p->getU() + (b + 1.0)*q->getU()) * dx*dx/6;
618 result.fp = (q->getY() - p->getY() + (p->getU()*(1.0 - 3*a*
a) -
619 q->getU()*(1.0 - 3*b*b)) * dx*dx/6) / dx;
621 result.v = p->getIntegral()
622 + 0.5*dx * (p->getY() - 0.5*p->getU()*dx*dx/6)
623 - 0.5*dx * ((a*a*p->getY() - b*b*q->getY()) +
624 (p->getU() * a*a*(0.5*a*a - 1.0) -
625 q->getU() * b*b*(0.5*b*b - 1.0)) * dx*dx/6);
627 result.V = this->rbegin()->getIntegral();
653 template<
class JElement_t,
654 template<
class,
class>
class JCollection_t,
655 class JResult_t =
typename JElement_t::ordinate_type,
658 public JSplineFunction<JElement_t, JCollection_t, JResult_t, JDistance_t>,
659 public JFunction1D<typename JElement_t::abscissa_type, JResult_t>
693 template<
class JKey_t,
695 template<
class,
class,
class>
class JMap_t,
699 public JMap_t<JKey_t, JValue_t, JDistance_t>,
766 for (
iterator i = this->begin(); i != this->end(); ++i) {
785 template<
class JElement_t,
786 template<
class,
class>
class JCollection_t,
789 inline typename JElement_t::ordinate_type
798 if (input.getSize() > 1) {
800 output.
put(input.begin()->getX(), V);
802 for (const_iterator
j = input.begin(), i =
j++;
j != input.end(); ++i, ++
j) {
804 const double dx = input.getDistance(i->getX(),
j->getX());
805 const ordinate_type y = i->getY() +
j->getY();
806 const ordinate_type z = i->getU() +
j->getU();
807 const ordinate_type
v = dx * 0.50 * y;
808 const ordinate_type
w = dx * 0.25 * z*dx*dx/6;
812 output.
put(
j->getX(), V);
829 template<
class JElement_t,
830 template<
class,
class>
class JCollection_t,
832 inline typename JElement_t::ordinate_type
840 if (input.getSize() > 1) {
842 for (const_iterator i = input.begin(); i != input.end(); ++i) {
843 output.
put(i->getX(), i->getIntegral());
846 return input.rbegin()->getIntegral();
*fatal Wrong number of arguments esac JCookie sh JRuns D $DETECTOR d sort n k
Exception for a functional operation.
This include file containes various data structures that can be used as specific return types for the...
static const JZero zero
Function object to assign zero value.
fi JEventTimesliceWriter a
Definition of zero value for any class.
double getDistance(const JFirst_t &first, const JSecond_t &second)
Get distance between objects.
Exception for missing value.
JArgument< T >::argument_type argument_type
Exception for division by zero.
Exception for accessing a value in a collection that is outside of its range.