@@ -3,7 +3,7 @@ using IntervalArithmetic, ForwardDiff
3
3
import Base: + , - , * , / , ^ , sqrt, exp, log, sin, cos, tan, asin, acos, atan
4
4
import IntervalArithmetic: mid, interval
5
5
6
- function slope (f:: Function , x:: Interval , c:: Real )
6
+ function slope (f:: Function , x:: Interval , c:: Number )
7
7
try
8
8
f (slope_var (x, c)). s
9
9
catch y
@@ -17,16 +17,17 @@ struct Slope{T}
17
17
x:: Interval{T}
18
18
c:: Interval{T}
19
19
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 )
22
20
end
23
21
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 )
26
27
end
27
28
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 )
30
31
end
31
32
32
33
function interval (u:: Slope )
@@ -42,53 +43,53 @@ function slope(u::Slope)
42
43
end
43
44
44
45
function + (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)
46
47
end
47
48
48
49
function - (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)
50
51
end
51
52
52
53
function * (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)
54
55
end
55
56
56
57
function / (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)
58
59
end
59
60
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)
62
63
end
63
64
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)
66
67
end
67
68
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)
70
71
end
71
72
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))
74
75
end
75
76
76
- + (v:: Slope , u:: Union{Interval, Real} ) = u + v
77
+ + (v:: Slope , u) = u + v
77
78
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
80
81
81
- * (v:: Slope , u:: Union{Interval, Real} ) = u * v
82
+ * (v:: Slope , u) = u * v
82
83
83
- / (v:: Slope , u:: Union{Interval, Real} ) = u / v
84
+ / (v:: Slope , u) = u / v
84
85
85
86
function 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)
87
88
end
88
89
89
90
function ^ (u:: Slope , k:: Integer )
90
91
if k == 0
91
- return Slope {Float64} (1 )
92
+ return Slope (1 )
92
93
elseif k == 1
93
94
return u
94
95
elseif k == 2
@@ -107,7 +108,7 @@ function ^(u::Slope, k::Integer)
107
108
i = u. x. lo - u. c. lo
108
109
s = u. x. hi - u. c. hi
109
110
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))
111
112
h1 = k * (u. x ^ (k - 1 ))
112
113
else
113
114
if k % 2 == 0 || u. x. lo >= 0
@@ -116,12 +117,12 @@ function ^(u::Slope, k::Integer)
116
117
h1 = interval ((hxs. lo - hc. hi) / s, (hxi. lo - hc. hi) / i)
117
118
end
118
119
end
119
- return Slope {Float64} (hx, hc, h1 * u. s)
120
+ return Slope (hx, hc, h1 * u. s)
120
121
end
121
122
end
122
123
123
124
function 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)))
125
126
end
126
127
127
128
function exp (u:: Slope )
@@ -137,7 +138,7 @@ function exp(u::Slope)
137
138
h1 = interval ((hx. lo - hc. lo) / i, (hx. hi - hc. hi) / s)
138
139
end
139
140
140
- Slope {Float64} (hx, hc, h1 * u. s)
141
+ Slope (hx, hc, h1 * u. s)
141
142
end
142
143
143
144
function log (u:: Slope )
@@ -152,47 +153,47 @@ function log(u::Slope)
152
153
else
153
154
h1 = interval ((hx. hi - hc. hi) / s, (hx. lo - hc. lo) / i)
154
155
end
155
- Slope {Float64} (hx, hc, h1 * u. s)
156
+ Slope (hx, hc, h1 * u. s)
156
157
end
157
158
158
159
function sin (u:: Slope ) # Using derivative to upper bound the slope expansion for now
159
160
hx = sin (u. x)
160
161
hc = sin (u. c)
161
162
hs = cos (u. x)
162
- Slope {Float64} (hx, hc, hs)
163
+ Slope (hx, hc, hs)
163
164
end
164
165
165
166
function cos (u:: Slope ) # Using derivative to upper bound the slope expansion for now
166
167
hx = cos (u. x)
167
168
hc = cos (u. c)
168
169
hs = - sin (u. x)
169
- Slope {Float64} (hx, hc, hs)
170
+ Slope (hx, hc, hs)
170
171
end
171
172
172
173
function tan (u:: Slope ) # Using derivative to upper bound the slope expansion for now
173
174
hx = tan (u. x)
174
175
hc = tan (u. c)
175
176
hs = (sec (u. x)) ^ 2
176
- Slope {Float64} (hx, hc, hs)
177
+ Slope (hx, hc, hs)
177
178
end
178
179
179
180
function asin (u:: Slope )
180
181
hx = asin (u. x)
181
182
hc = asin (u. c)
182
183
hs = 1 / sqrt (1 - (u. x ^ 2 ))
183
- Slope {Float64} (hx, hc, hs)
184
+ Slope (hx, hc, hs)
184
185
end
185
186
186
187
function acos (u:: Slope )
187
188
hx = acos (u. x)
188
189
hc = acos (u. c)
189
190
hs = - 1 / sqrt (1 - (u. x ^ 2 ))
190
- Slope {Float64} (hx, hc, hs)
191
+ Slope (hx, hc, hs)
191
192
end
192
193
193
194
function atan (u:: Slope )
194
195
hx = atan (u. x)
195
196
hc = atan (u. c)
196
197
hs = 1 / 1 + (u. x ^ 2 )
197
- Slope {Float64} (hx, hc, hs)
198
+ Slope (hx, hc, hs)
198
199
end
0 commit comments