17 T SlicedTube<T>::integral(
const Interval& t)
const
19 auto partial_integ = partial_integral(t);
21 if(partial_integ.first.is_empty() || partial_integ.second.is_empty())
22 return this->empty_codomain();
24 else if(partial_integ.first.is_unbounded() || partial_integ.second.is_unbounded())
25 return this->all_reals_codomain();
28 return T(partial_integ.first.lb()) | partial_integ.second.ub();
34 auto integ_t1 = partial_integral(t1);
35 auto integ_t2 = partial_integral(t2);
37 if(integ_t1.first.is_empty() || integ_t1.second.is_empty() ||
38 integ_t2.first.is_empty() || integ_t2.second.is_empty())
40 return this->empty_codomain();
43 else if(integ_t1.first.is_unbounded() || integ_t1.second.is_unbounded() ||
44 integ_t2.first.is_unbounded() || integ_t2.second.is_unbounded())
46 return this->all_reals_codomain();
51 auto lb = (integ_t2.first - integ_t1.first).lb();
52 auto ub = (integ_t2.second - integ_t1.second).ub();
58 std::pair<T,T> SlicedTube<T>::partial_integral(
const Interval& t)
const
63 auto zero = this->all_reals_codomain();
66 std::pair<T,T> p_integ { zero, zero };
67 auto p_integ_uncertain = p_integ;
69 for(
const auto& si : *
this)
71 if(si.t0_tf().lb() >= t.ub())
74 if(si.codomain().is_empty())
76 auto e = this->empty_codomain();
80 if(si.codomain().is_unbounded())
82 auto u = this->all_reals_codomain();
89 if(!intv_t.is_empty())
91 p_integ.first += intv_t.diam() * si.codomain().lb();
92 p_integ.second += intv_t.diam() * si.codomain().ub();
93 p_integ_uncertain = p_integ;
95 if(intv_t.ub() == t.ub())
101 intv_t = si.t0_tf() & t;
102 if(!intv_t.is_empty())
104 auto p_integ_temp = p_integ_uncertain;
105 p_integ_uncertain.first +=
Interval(0., intv_t.diam()) * si.codomain().
lb();
106 p_integ_uncertain.second +=
Interval(0., intv_t.diam()) * si.codomain().
ub();
108 p_integ.first |= p_integ_uncertain.first;
109 p_integ.second |= p_integ_uncertain.second;
111 p_integ_uncertain.first = p_integ_temp.first + intv_t.diam() * si.codomain().lb();
112 p_integ_uncertain.second = p_integ_temp.second + intv_t.diam() * si.codomain().ub();
120 std::pair<T,T> SlicedTube<T>::partial_integral(
const Interval& t1,
const Interval& t2)
const
122 auto integ_t1 = partial_integral(t1);
123 auto integ_t2 = partial_integral(t2);
125 integ_t2.first - integ_t1.first,
126 integ_t2.second - integ_t1.second
Interval class, for representing closed and connected subsets of .
Definition codac2_Interval.h:62
double ub() const
Returns the upper bound of this.
Definition codac2_Interval_impl.h:113
double lb() const
Returns the lower bound of this.
Definition codac2_Interval_impl.h:108