@@ -3,7 +3,7 @@ using IntervalArithmetic, ForwardDiff
33import Base: + , - , * , / , ^ , sqrt, exp, log, sin, cos, tan, asin, acos, atan
44import IntervalArithmetic: mid, interval
55
6- function slope (f:: Function , x:: Interval , c:: Real )
6+ function slope (f:: Function , x:: Interval , c:: Number )
77 try
88 f (slope_var (x, c)). s
99 catch y
@@ -17,16 +17,17 @@ struct Slope{T}
1717 x:: Interval{T}
1818 c:: Interval{T}
1919 s:: Interval{T}
20- Slope {T} (a, b, c) where T = new (a, b, c)
21- Slope {T} (c) where T = Slope {T} (c, c, 0 )
2220end
2321
24- function slope_var (v:: Real )
25- Slope {Float64} (v, v, 1 )
22+ Slope (c) = Slope (c, c, 0 )
23+ Slope (a, b, c) = Slope (promote (convert (Interval, a), b, c)... )
24+
25+ function slope_var (v:: Number )
26+ Slope (v, v, 1 )
2627end
2728
28- function slope_var (v:: Interval , c:: Real )
29- Slope {Float64} (v, c, 1 )
29+ function slope_var (v:: Interval , c:: Number )
30+ Slope (v, c, 1 )
3031end
3132
3233function interval (u:: Slope )
@@ -42,53 +43,53 @@ function slope(u::Slope)
4243end
4344
4445function + (u:: Slope , v:: Slope )
45- Slope {Float64} (u. x + v. x, u. c + v. c, u. s + v. s)
46+ Slope (u. x + v. x, u. c + v. c, u. s + v. s)
4647end
4748
4849function - (u:: Slope , v:: Slope )
49- Slope {Float64} (u. x - v. x, u. c - v. c, u. s - v. s)
50+ Slope (u. x - v. x, u. c - v. c, u. s - v. s)
5051end
5152
5253function * (u:: Slope , v:: Slope )
53- Slope {Float64} (u. x * v. x, u. c * v. c, u. s * v. c + u. x * v. s)
54+ Slope (u. x * v. x, u. c * v. c, u. s * v. c + u. x * v. s)
5455end
5556
5657function / (u:: Slope , v:: Slope )
57- Slope {Float64} (u. x / v. x, u. c / v. c, (u. s - (u. c / v. c) * v. s) / v. x)
58+ Slope (u. x / v. x, u. c / v. c, (u. s - (u. c / v. c) * v. s) / v. x)
5859end
5960
60- function + (u:: Union{Interval, Real} , v:: Slope )
61- Slope {Float64} (u + v. x, u + v. c, v. s)
61+ function + (u, v:: Slope )
62+ Slope (u + v. x, u + v. c, v. s)
6263end
6364
64- function - (u:: Union{Interval, Real} , v:: Slope )
65- Slope {Float64} (u - v. x, u - v. c, - v. s)
65+ function - (u, v:: Slope )
66+ Slope (u - v. x, u - v. c, - v. s)
6667end
6768
68- function * (u:: Union{Interval, Real} , v:: Slope )
69- Slope {Float64} (u * v. x, u * v. c, u * v. s)
69+ function * (u, v:: Slope )
70+ Slope (u * v. x, u * v. c, u * v. s)
7071end
7172
72- function / (u:: Union{Interval, Real} , v:: Slope )
73- Slope {Float64} (u / v. x, u / v. c, - (u / v. c) * (v. s / v. x))
73+ function / (u, v:: Slope )
74+ Slope (u / v. x, u / v. c, - (u / v. c) * (v. s / v. x))
7475end
7576
76- + (v:: Slope , u:: Union{Interval, Real} ) = u + v
77+ + (v:: Slope , u) = u + v
7778
78- - (v:: Slope , u:: Union{Interval, Real} ) = u - v
79- - (u:: Slope ) = u * - 1
79+ - (v:: Slope , u) = u - v
80+ - (u:: Slope ) = u * - 1.0
8081
81- * (v:: Slope , u:: Union{Interval, Real} ) = u * v
82+ * (v:: Slope , u) = u * v
8283
83- / (v:: Slope , u:: Union{Interval, Real} ) = u / v
84+ / (v:: Slope , u) = u / v
8485
8586function sqr (u:: Slope )
86- Slope {Float64} (u. x ^ 2 , u. c ^ 2 , (u. x + u. c) * u. s)
87+ Slope (u. x ^ 2 , u. c ^ 2 , (u. x + u. c) * u. s)
8788end
8889
8990function ^ (u:: Slope , k:: Integer )
9091 if k == 0
91- return Slope {Float64} (1 )
92+ return Slope (1 )
9293 elseif k == 1
9394 return u
9495 elseif k == 2
@@ -107,7 +108,7 @@ function ^(u::Slope, k::Integer)
107108 i = u. x. lo - u. c. lo
108109 s = u. x. hi - u. c. hi
109110
110- if ((i == 0 ) || (s == 0 ) || (k % 2 == 1 && Interval ( 0 ) ⪽ u. x))
111+ if ((i == 0 ) || (s == 0 ) || (k % 2 == 1 && zero (u . x ) ⪽ u. x))
111112 h1 = k * (u. x ^ (k - 1 ))
112113 else
113114 if k % 2 == 0 || u. x. lo >= 0
@@ -116,12 +117,12 @@ function ^(u::Slope, k::Integer)
116117 h1 = interval ((hxs. lo - hc. hi) / s, (hxi. lo - hc. hi) / i)
117118 end
118119 end
119- return Slope {Float64} (hx, hc, h1 * u. s)
120+ return Slope (hx, hc, h1 * u. s)
120121 end
121122end
122123
123124function sqrt (u:: Slope )
124- Slope {Float64} (sqrt (u. x), sqrt (u. c), u. s / (sqrt (u. x) + sqrt (u. c)))
125+ Slope (sqrt (u. x), sqrt (u. c), u. s / (sqrt (u. x) + sqrt (u. c)))
125126end
126127
127128function exp (u:: Slope )
@@ -137,7 +138,7 @@ function exp(u::Slope)
137138 h1 = interval ((hx. lo - hc. lo) / i, (hx. hi - hc. hi) / s)
138139 end
139140
140- Slope {Float64} (hx, hc, h1 * u. s)
141+ Slope (hx, hc, h1 * u. s)
141142end
142143
143144function log (u:: Slope )
@@ -152,47 +153,47 @@ function log(u::Slope)
152153 else
153154 h1 = interval ((hx. hi - hc. hi) / s, (hx. lo - hc. lo) / i)
154155 end
155- Slope {Float64} (hx, hc, h1 * u. s)
156+ Slope (hx, hc, h1 * u. s)
156157end
157158
158159function sin (u:: Slope ) # Using derivative to upper bound the slope expansion for now
159160 hx = sin (u. x)
160161 hc = sin (u. c)
161162 hs = cos (u. x)
162- Slope {Float64} (hx, hc, hs)
163+ Slope (hx, hc, hs)
163164end
164165
165166function cos (u:: Slope ) # Using derivative to upper bound the slope expansion for now
166167 hx = cos (u. x)
167168 hc = cos (u. c)
168169 hs = - sin (u. x)
169- Slope {Float64} (hx, hc, hs)
170+ Slope (hx, hc, hs)
170171end
171172
172173function tan (u:: Slope ) # Using derivative to upper bound the slope expansion for now
173174 hx = tan (u. x)
174175 hc = tan (u. c)
175176 hs = (sec (u. x)) ^ 2
176- Slope {Float64} (hx, hc, hs)
177+ Slope (hx, hc, hs)
177178end
178179
179180function asin (u:: Slope )
180181 hx = asin (u. x)
181182 hc = asin (u. c)
182183 hs = 1 / sqrt (1 - (u. x ^ 2 ))
183- Slope {Float64} (hx, hc, hs)
184+ Slope (hx, hc, hs)
184185end
185186
186187function acos (u:: Slope )
187188 hx = acos (u. x)
188189 hc = acos (u. c)
189190 hs = - 1 / sqrt (1 - (u. x ^ 2 ))
190- Slope {Float64} (hx, hc, hs)
191+ Slope (hx, hc, hs)
191192end
192193
193194function atan (u:: Slope )
194195 hx = atan (u. x)
195196 hc = atan (u. c)
196197 hs = 1 / 1 + (u. x ^ 2 )
197- Slope {Float64} (hx, hc, hs)
198+ Slope (hx, hc, hs)
198199end
0 commit comments