@@ -482,24 +482,106 @@ def sigmoid(x: Interval):
482482
483483 # =============================================== periodic functions
484484
485+ # @staticmethod
486+ # def sin(x: Interval):
487+ # print(x)
488+ # print(x - np.pi * 0.5)
489+ # return Interval.cos(x - np.pi * 0.5)
490+
485491 @staticmethod
486492 def sin (x : Interval ):
487- return Interval .cos (x - np .pi * 0.5 )
493+ ind0 = (x .sup - x .inf ) >= 2 * np .pi # xsup -xinf >= 2*pi
494+ yinf , ysup = np .mod (x .inf , np .pi * 2 ), np .mod (x .sup , np .pi * 2 )
495+
496+ ind1 = yinf < np .pi * 0.5 # yinf in R1
497+ ind2 = ysup < np .pi * 0.5 # ysup in R1
498+ ind3 = np .logical_not (ind1 ) & (yinf < np .pi * 1.5 ) # yinf in R2
499+ ind4 = np .logical_not (ind2 ) & (ysup < np .pi * 1.5 ) # ysup in R2
500+ ind5 = yinf >= np .pi * 1.5 # yinf in R3
501+ ind6 = ysup >= np .pi * 1.5 # ysup in R3
502+ ind7 = yinf > ysup # yinf > ysup
503+ ind8 = np .logical_not (ind7 ) # yinf <=ysup
504+
505+ inf , sup = x .inf , x .sup
506+
507+ ind = (ind1 & ind2 & ind8 ) | (ind5 & ind2 ) | (ind5 & ind6 & ind8 )
508+ inf [ind ] = np .sin (yinf [ind ])
509+ sup [ind ] = np .sin (ysup [ind ])
510+
511+ ind = (ind1 & ind4 ) | (ind5 & ind4 )
512+ inf [ind ] = np .minimum (np .sin (yinf [ind ]), np .sin (ysup [ind ]))
513+ sup [ind ] = 1
514+
515+ ind = (ind3 & ind2 ) | (ind3 & ind6 )
516+ inf [ind ] = - 1
517+ sup [ind ] = np .maximum (np .sin (yinf [ind ]), np .sin (ysup [ind ]))
518+
519+ ind = ind3 & ind4 & ind8
520+ inf [ind ] = np .sin (ysup [ind ])
521+ sup [ind ] = np .sin (yinf [ind ])
522+
523+ ind = (
524+ ind0
525+ | (ind1 & ind2 & ind7 )
526+ | (ind1 & ind6 )
527+ | (ind3 & ind4 & ind7 )
528+ | (ind5 & ind6 & ind7 )
529+ )
530+ inf [ind ] = - 1
531+ sup [ind ] = 1
532+
533+ return Interval (inf , sup )
534+
535+ # @staticmethod
536+ # def cos(x: Interval):
537+ #
538+ # def aux_max_cos(I: Interval):
539+ # k = np.ceil(I.inf / (2 * np.pi))
540+ #
541+ # a = I.inf - 2 * np.pi * k
542+ # b = I.sup - 2 * np.pi * k
543+ #
544+ # m = np.maximum(np.cos(a), np.cos(b))
545+ # return np.maximum(np.sign(b), m)
546+ #
547+ # inf = -aux_max_cos(x - np.pi)
548+ # sup = aux_max_cos(x)
549+ # return Interval(inf, sup)
488550
489551 @staticmethod
490552 def cos (x : Interval ):
553+ ind0 = (x .sup - x .inf ) >= 2 * np .pi # xsup -xinf >= 2*pi
554+ yinf , ysup = np .mod (x .inf , np .pi * 2 ), np .mod (x .sup , np .pi * 2 )
555+
556+ ind1 = yinf < np .pi # yinf in R1
557+ ind2 = ysup < np .pi # ysup in R1
558+ ind3 = np .logical_not (ind1 ) # yinf in R2
559+ ind4 = np .logical_not (ind2 ) # ysup in R2
560+ ind5 = yinf > ysup # yinf > ysup
561+ ind6 = np .logical_not (ind5 ) # yinf <= ysup
562+
563+ inf , sup = x .inf , x .sup
564+
565+ ind = ind3 & ind4 & ind6
566+ inf [ind ] = np .cos (yinf [ind ])
567+ sup [ind ] = np .cos (ysup [ind ])
568+
569+ ind = ind3 & ind2
570+ inf [ind ] = np .minimum (np .cos (yinf [ind ]), np .cos (ysup [ind ]))
571+ sup [ind ] = 1
491572
492- def aux_max_cos (I : Interval ):
493- k = np .ceil (I .inf / (2 * np .pi ))
573+ ind = ind1 & ind4
574+ inf [ind ] = - 1
575+ sup [ind ] = np .maximum (np .cos (yinf [ind ]), np .cos (ysup [ind ]))
494576
495- a = I .inf - 2 * np .pi * k
496- b = I .sup - 2 * np .pi * k
577+ ind = ind1 & ind2 & ind6
578+ inf [ind ] = np .cos (ysup [ind ])
579+ sup [ind ] = np .cos (yinf [ind ])
497580
498- m = np .maximum (np .cos (a ), np .cos (b ))
499- return np .maximum (np .sign (b ), m )
581+ ind = ind0 | (ind1 & ind2 & ind5 ) | (ind3 & ind4 & ind5 )
582+ inf [ind ] = - 1
583+ sup [ind ] = 1
500584
501- inf = - aux_max_cos (x - np .pi )
502- sup = aux_max_cos (x )
503585 return Interval (inf , sup )
504586
505587 @staticmethod
0 commit comments