imatrix Id ( imatrix& A ) // Interval identity matrix { //------------------------- int i,j; int lbi = Lb(A,1), ubi = Ub(A,1); int lbj = Lb(A,2), ubj = Ub(A,2); imatrix B(lbi,ubi,lbj,ubj); for (i = lbi; i <= ubi; i++) for (j = lbj; j <= ubj; j++) B[i][j] = _interval( (i==j) ? 1.0 : 0.0 ); return B; }
//---------------------------------------------------------------------------- // Intersection of an interval 'X' and an extended interval 'Y'. The result // is given as a pair (vector) of intervals, where one or both of them can // be empty intervals. //---------------------------------------------------------------------------- ivector operator& ( const interval& X, const xinterval& Y ) { interval H; ivector IS(2); IS[1] = EmptyIntval(); IS[2] = EmptyIntval(); switch (Y.kind) { case Finite : // [X.inf,X.sup] & [Y.inf,Y.sup] //------------------------------ H = _interval(Y.inf,Y.sup); if ( !Disjoint(X,H) ) IS[1] = X & H; break; case PlusInfty : // [X.inf,X.sup] & [Y.inf,+oo] //---------------------------- if (Sup(X) >= Y.inf) { if (Inf(X) > Y.inf) IS[1] = X; else IS[1] = _interval(Y.inf,Sup(X)); } break; case MinusInfty : // [X.inf,X.sup] & [-oo,Y.sup] //---------------------------- if (Y.sup >= Inf(X)) { if (Sup(X)<Y.sup) IS[1] = X; else IS[1] = _interval(Inf(X),Y.sup); } break; case Double : if ( (Inf(X) <= Y.sup) && (Y.inf <= Sup(X)) ) { IS[1] = _interval(Inf(X),Y.sup); // X & [-oo,Y.sup] IS[2] = _interval(Y.inf,Sup(X)); // X & [Y.inf,+oo] } else if (Y.inf <= Sup(X)) // [X.inf,X.sup] & [Y.inf,+oo] if (Inf(X) >= Y.inf) //---------------------------- IS[1] = X; else IS[1] = _interval(Y.inf,Sup(X)); else if (Inf(X) <= Y.sup){// [X.inf,X.sup] & [-oo,Y.sup] if (Sup(X) <= Y.sup) //---------------------------- IS[1] = X; else IS[1] = _interval(Inf(X),Y.sup); } break; case Empty : break; // [X.inf,X.sup] ** [/] } // switch //--------------------- return IS; } // operator&