11using IntervalArithmetic, IntervalRootFinding
2- using ForwardDiff
2+ using ForwardDiff, StaticArrays
33using Base. Test
44
55struct Slopes{T}
@@ -9,39 +9,68 @@ struct Slopes{T}
99 sol:: Interval{T}
1010end
1111
12- @testset " Automatic slope expansion(Float64)" begin
12+ @testset " Automatic slope expansion" begin
13+ for T in [Float64, BigFloat]
14+ s = interval(T(0.75 ), T(1.75 ))
15+ rts = Slopes{T}[]
16+ push!(rts, Slopes(x-> ((x + sin(x)) * exp(- x^ 2 )), s, mid(s), interval(T(- 2.8 ), T(0.1 ))))
17+ push!(rts, Slopes(x-> (x^ 4 - 10 x^ 3 + 35 x^ 2 - 50 x + 24 ), s, mid(s), interval(T(- 44 ), T(38.5 ))))
18+ push!(rts, Slopes(x-> ((log(x + 1.25 ) - 0.84 x) ^ 2 ), s, mid(s), interval(T(- 0.16 ), T(0.44 ))))
19+ push!(rts, Slopes(x-> (0.02 x^ 2 - 0.03 exp(- (20 (x - 0.875 ))^ 2 )), s, mid(s), interval(T(0.03 ), T(0.33 ))))
20+ push!(rts, Slopes(x-> (exp(x^ 2 )), s, mid(s), interval(T(6.03 ), T(33.23 ))))
21+ push!(rts, Slopes(x-> (x^ 4 - 12 x^ 3 + 47 x^ 2 - 60 x - 20 exp(- x)), s, mid(s), interval(T(- 39 ), T(65.56 ))))
22+ push!(rts, Slopes(x-> (x^ 6 - 15 x^ 4 + 27 x^ 2 + 250 ), s, mid(s), interval(T(- 146.9 ), T(67.1 ))))
23+ push!(rts, Slopes(x-> (atan(cos(tan(x)))), s, mid(s), interval(T(1 ), T(2 ))))
24+ push!(rts, Slopes(x-> (asin(cos(acos(sin(x))))), s, mid(s), interval(T(1.36 ), T(∞))))
1325
14- s = interval(0.75 , 1.75 )
15- rts = Slopes{Float64}[]
16- push!(rts, Slopes(x-> ((x + sin(x)) * exp(- x^ 2 )), s, mid(s), interval(- 2.8 , 0.1 )))
17- push!(rts, Slopes(x-> (x^ 4 - 10 x^ 3 + 35 x^ 2 - 50 x + 24 ), s, mid(s), interval(- 44 , 38.5 )))
18- push!(rts, Slopes(x-> ((log(x + 1.25 ) - 0.84 x) ^ 2 ), s, mid(s), interval(- 0.16 , 0.44 )))
19- push!(rts, Slopes(x-> (0.02 x^ 2 - 0.03 exp(- (20 (x - 0.875 ))^ 2 )), s, mid(s), interval(0.03 , 0.33 )))
20- push!(rts, Slopes(x-> (exp(x^ 2 )), s, mid(s), interval(6.03 , 33.23 )))
21- push!(rts, Slopes(x-> (x^ 4 - 12 x^ 3 + 47 x^ 2 - 60 x - 20 exp(- x)), s, mid(s), interval(- 39 , 65.56 )))
22- push!(rts, Slopes(x-> (x^ 6 - 15 x^ 4 + 27 x^ 2 + 250 ), s, mid(s), interval(- 146.9 , 67.1 )))
23- push!(rts, Slopes(x-> (atan(cos(tan(x)))), s, mid(s), interval(1 , 2 )))
24- push!(rts, Slopes(x-> (asin(cos(acos(sin(x))))), s, mid(s), interval(1.36 , ∞)))
25-
26- for i in 1 : length(rts)
27- @test slope(rts[i]. f, rts[i]. x, rts[i]. c) ⊆ rts[i]. sol
26+ for i in 1 : length(rts)
27+ @test slope(rts[i]. f, rts[i]. x, rts[i]. c) ⊆ rts[i]. sol
28+ end
2829 end
2930end
3031
31- @testset " Automatic slope expansion(BigFloat)" begin
32- s = interval(BigFloat(0.75 ), BigFloat(1.75 ))
33- rts = Slopes{BigFloat}[]
34- push!(rts, Slopes(x-> ((x + sin(x)) * exp(- x^ 2 )), s, mid(s), interval(BigFloat(- 2.8 ), BigFloat(0.1 ))))
35- push!(rts, Slopes(x-> (x^ 4 - 10 x^ 3 + 35 x^ 2 - 50 x + 24 ), s, mid(s), interval(BigFloat(- 44 ), BigFloat(38.5 ))))
36- push!(rts, Slopes(x-> ((log(x + 1.25 ) - 0.84 x) ^ 2 ), s, mid(s), interval(BigFloat(- 0.16 ), BigFloat(0.44 ))))
37- push!(rts, Slopes(x-> (0.02 x^ 2 - 0.03 exp(- (20 (x - 0.875 ))^ 2 )), s, mid(s), interval(BigFloat(0.03 ), BigFloat(0.33 ))))
38- push!(rts, Slopes(x-> (exp(x^ 2 )), s, mid(s), interval(BigFloat(6.03 ), BigFloat(33.23 ))))
39- push!(rts, Slopes(x-> (x^ 4 - 12 x^ 3 + 47 x^ 2 - 60 x - 20 exp(- x)), s, mid(s), interval(BigFloat(- 39 ), BigFloat(65.56 ))))
40- push!(rts, Slopes(x-> (x^ 6 - 15 x^ 4 + 27 x^ 2 + 250 ), s, mid(s), interval(BigFloat(- 146.9 ), BigFloat(67.1 ))))
41- push!(rts, Slopes(x-> (atan(cos(tan(x)))), s, mid(s), interval(BigFloat(1 ), BigFloat(2 ))))
42- push!(rts, Slopes(x-> (asin(cos(acos(sin(x))))), s, mid(s), interval(BigFloat(1.36 ), BigFloat(∞))))
32+ struct SlopesMulti
33+ f:: Function
34+ x:: IntervalBox
35+ c:: Vector
36+ sol:: Matrix{Interval}
37+ end
38+
39+ @testset " Multidim slope expansion" begin
40+
41+ rts = SlopesMulti[]
42+ f(x, y) = SVector(x^ 2 + y^ 2 - 1 , y - 2 x)
43+ f(X) = f(X... )
44+ X = (- 6 .. 6 ) × (- 6 .. 6 )
45+ c = [0.0 , 0.0 ]
46+ push!(rts, SlopesMulti(f, X, c, [- 6 .. 6 - 6 .. 6 ; - 2 .. - 2 1 .. 1 ]))
47+
48+ function g(x)
49+ (x1, x2, x3) = x
50+ SVector( x1^ 2 + x2^ 2 + x3^ 2 - 1 ,
51+ x1^ 2 + x3^ 2 - 0.25 ,
52+ x1^ 2 + x2^ 2 - 4 x3
53+ )
54+ end
55+
56+ X = (- 5 .. 5 )
57+ XX = IntervalBox(X, 3 )
58+ cc = [0.0 , 0.0 , 0.0 ]
59+ push!(rts, SlopesMulti(g, XX, cc, [- 5 .. 5 - 5 .. 5 - 5 .. 5 ; - 5 .. 5 0 .. 0 - 5 .. 5 ; - 5 .. 5 - 5 .. 5 - 4 .. - 4 ]))
60+ function h(x)
61+ (x1, x2, x3) = x
62+ SVector( x1 + x2^ 2 + x3^ 2 - 1 ,
63+ x1^ 2 + x3 - 0.25 ,
64+ x1^ 2 + x2 - 4 x3
65+ )
66+ end
67+
68+ XXX = IntervalBox(1 .. 5 , 2 .. 6 , - 3 .. 7 )
69+ ccc = [3.0 , 4.0 , 2.0 ]
70+ push!(rts, SlopesMulti(h, XXX, ccc, [1 .. 1 6 .. 10 - 1 .. 9 ; 4 .. 8 0 .. 0 1 .. 1 ; 4 .. 8 1 .. 1 - 4 .. - 4 ]))
4371
4472 for i in 1 : length(rts)
45- @test slope(rts[i]. f, rts[i]. x, rts[i]. c) ⊆ rts[i]. sol
73+ @test slope(rts[i]. f, rts[i]. x, rts[i]. c) == rts[i]. sol
4674 end
75+
4776end
0 commit comments