Skip to content

Commit 749031e

Browse files
committed
rebase interval operations (sin & cos)
1 parent 76b5e4d commit 749031e

File tree

3 files changed

+106
-9
lines changed

3 files changed

+106
-9
lines changed

pybdr/geometry/interval.py

Lines changed: 91 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

pybdr/model/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from .brusselator import brusselator
1818
from .neural_ode_spiral1 import neural_ode_spiral1
1919
from .neural_ode_spiral2 import neural_ode_spiral2
20+
from .bicycle import bicycle
2021

2122
__all__ = [
2223
"Model",
@@ -38,4 +39,5 @@
3839
'brusselator',
3940
'neural_ode_spiral1',
4041
'neural_ode_spiral2',
42+
'bicycle',
4143
]

pybdr/model/bicycle.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from sympy import *
2+
3+
4+
def bicycle(x, u):
5+
dxdt = [None] * 3
6+
7+
v = 2
8+
9+
dxdt[0] = u[0] * cos(x[2])
10+
dxdt[1] = u[0] * sin(x[2])
11+
dxdt[2] = u[0] * tan(u[1])
12+
13+
return Matrix(dxdt)

0 commit comments

Comments
 (0)