@@ -14,13 +14,13 @@ complex_cache = DiffEqDiffTools.DerivativeCache(x, nothing, nothing, Val{:comple
14
14
15
15
err_func (a,b) = maximum (abs .(a- b))
16
16
17
- @time @testset " Derivative single point real-valued tests" begin
17
+ @time @testset " Derivative single point f : R -> R tests" begin
18
18
@test err_func (DiffEqDiffTools. finite_difference_derivative (sin, π/ 4 , Val{:forward }), √ 2 / 2 ) < 1e-4
19
19
@test err_func (DiffEqDiffTools. finite_difference_derivative (sin, π/ 4 , Val{:central }), √ 2 / 2 ) < 1e-8
20
20
@test err_func (DiffEqDiffTools. finite_difference_derivative (sin, π/ 4 , Val{:complex }), √ 2 / 2 ) < 1e-15
21
21
end
22
22
23
- @time @testset " Derivative StridedArray real-valued tests" begin
23
+ @time @testset " Derivative StridedArray f : R -> R tests" begin
24
24
@test err_func (DiffEqDiffTools. finite_difference_derivative (sin, x, Val{:forward }), df_ref) < 1e-4
25
25
@test err_func (DiffEqDiffTools. finite_difference_derivative (sin, x, Val{:central }), df_ref) < 1e-8
26
26
@test err_func (DiffEqDiffTools. finite_difference_derivative (sin, x, Val{:complex }), df_ref) < 1e-15
@@ -51,12 +51,12 @@ df_ref = cos.(x) - sin.(x)
51
51
forward_cache = DiffEqDiffTools. DerivativeCache (x, y, epsilon, Val{:forward })
52
52
central_cache = DiffEqDiffTools. DerivativeCache (x, y, epsilon, Val{:central })
53
53
54
- @time @testset " Derivative single point complex-valued tests" begin
54
+ @time @testset " Derivative single point f : C -> C tests" begin
55
55
@test err_func (DiffEqDiffTools. finite_difference_derivative (f, π/ 4 + im* π/ 4 , Val{:forward }, Val{:Complex }), cos (π/ 4 + im* π/ 4 )- sin (π/ 4 + im* π/ 4 )) < 1e-3
56
56
@test err_func (DiffEqDiffTools. finite_difference_derivative (f, π/ 4 + im* π/ 4 , Val{:central }, Val{:Complex }), cos (π/ 4 + im* π/ 4 )- sin (π/ 4 + im* π/ 4 )) < 1e-7
57
57
end
58
58
59
- @time @testset " Derivative StridedArray complex-valued tests" begin
59
+ @time @testset " Derivative StridedArray f : C -> C tests" begin
60
60
@test err_func (DiffEqDiffTools. finite_difference_derivative (f, x, Val{:forward }), df_ref) < 1e-3
61
61
@test err_func (DiffEqDiffTools. finite_difference_derivative (f, x, Val{:central }), df_ref) < 1e-6
62
62
79
79
@test err_func (DiffEqDiffTools. finite_difference_derivative! (df, f, x, central_cache), df_ref) < 1e-6
80
80
end
81
81
82
+ x = collect (linspace (- 2 π, 2 π, 100 ))
83
+ f (x) = sin (x) + im* cos (x)
84
+ y = f .(x)
85
+ df = zeros (Complex{eltype (x)}, size (x))
86
+ epsilon = similar (real (x))
87
+ df_ref = cos .(x) - im* sin .(x)
88
+ forward_cache = DiffEqDiffTools. DerivativeCache (x, y, epsilon, Val{:forward }, eltype (df))
89
+ central_cache = DiffEqDiffTools. DerivativeCache (x, y, epsilon, Val{:central }, eltype (df))
90
+
91
+ @time @testset " Derivative single point f : R -> C tests" begin
92
+ @test err_func (DiffEqDiffTools. finite_difference_derivative (f, π/ 4 , Val{:forward }, Val{:Complex }), cos (π/ 4 )- im* sin (π/ 4 )) < 1e-3
93
+ @test err_func (DiffEqDiffTools. finite_difference_derivative (f, π/ 4 , Val{:central }, Val{:Complex }), cos (π/ 4 )- im* sin (π/ 4 )) < 1e-7
94
+ end
95
+
96
+ @time @testset " Derivative StridedArray f : R -> C tests" begin
97
+ @test err_func (DiffEqDiffTools. finite_difference_derivative (f, x, Val{:forward }, Complex{eltype (x)}), df_ref) < 1e-3
98
+ @test err_func (DiffEqDiffTools. finite_difference_derivative (f, x, Val{:central }, Complex{eltype (x)}), df_ref) < 1e-6
99
+
100
+ @test err_func (DiffEqDiffTools. finite_difference_derivative (f, x, Val{:forward }, Complex{eltype (x)}, y), df_ref) < 1e-3
101
+ @test err_func (DiffEqDiffTools. finite_difference_derivative (f, x, Val{:central }, Complex{eltype (x)}, y), df_ref) < 1e-6
102
+
103
+ @test err_func (DiffEqDiffTools. finite_difference_derivative (f, x, Val{:forward }, Complex{eltype (x)}, y, epsilon), df_ref) < 1e-3
104
+ @test err_func (DiffEqDiffTools. finite_difference_derivative (f, x, Val{:central }, Complex{eltype (x)}, y, epsilon), df_ref) < 1e-6
105
+
106
+ @test err_func (DiffEqDiffTools. finite_difference_derivative! (df, f, x, Val{:forward }, Complex{eltype (x)}), df_ref) < 1e-3
107
+ @test err_func (DiffEqDiffTools. finite_difference_derivative! (df, f, x, Val{:central }, Complex{eltype (x)}), df_ref) < 1e-6
108
+
109
+ @test err_func (DiffEqDiffTools. finite_difference_derivative! (df, f, x, Val{:forward }, Complex{eltype (x)}, y), df_ref) < 1e-3
110
+ @test err_func (DiffEqDiffTools. finite_difference_derivative! (df, f, x, Val{:central }, Complex{eltype (x)}, y), df_ref) < 1e-6
111
+
112
+ @test err_func (DiffEqDiffTools. finite_difference_derivative! (df, f, x, Val{:forward }, Complex{eltype (x)}, y, epsilon), df_ref) < 1e-3
113
+ @test err_func (DiffEqDiffTools. finite_difference_derivative! (df, f, x, Val{:central }, Complex{eltype (x)}, y, epsilon), df_ref) < 1e-6
114
+
115
+ @test err_func (DiffEqDiffTools. finite_difference_derivative! (df, f, x, forward_cache), df_ref) < 1e-3
116
+ @test err_func (DiffEqDiffTools. finite_difference_derivative! (df, f, x, central_cache), df_ref) < 1e-6
117
+ end
118
+
119
+ #=
120
+ x = x + im*x
121
+ f(x) = abs2(x)
122
+ y = f.(x)
123
+ df = zeros(eltype(x), size(x))
124
+ epsilon = similar(real(x))
125
+ df_ref = 2*conj.(x)
126
+ forward_cache = DiffEqDiffTools.DerivativeCache(x, y, epsilon, Val{:forward}, eltype(df))
127
+ central_cache = DiffEqDiffTools.DerivativeCache(x, y, epsilon, Val{:central}, eltype(df))
128
+ @show typeof(DiffEqDiffTools.finite_difference_derivative(f, 1.+im*1., Val{:forward}, real(eltype(x))))
129
+
130
+ @time @testset "Derivative single point f : C -> R tests" begin
131
+ @test err_func(DiffEqDiffTools.finite_difference_derivative(f, 1.+im*1., Val{:forward}, real(eltype(x))), 2.-2.*im) < 1e-3
132
+ @test err_func(DiffEqDiffTools.finite_difference_derivative(f, 1.+im*1., Val{:central}, real(eltype(x))), 2.-2.*im) < 1e-7
133
+ end
134
+
135
+ @time @testset "Derivative StridedArray f : C -> R tests" begin
136
+ @test err_func(DiffEqDiffTools.finite_difference_derivative(f, x, Val{:forward}, real(eltype(x))), df_ref) < 1e-3
137
+ @test err_func(DiffEqDiffTools.finite_difference_derivative(f, x, Val{:central}, real(eltype(x))), df_ref) < 1e-6
138
+
139
+ @test err_func(DiffEqDiffTools.finite_difference_derivative(f, x, Val{:forward}, real(eltype(x)), y), df_ref) < 1e-3
140
+ @test err_func(DiffEqDiffTools.finite_difference_derivative(f, x, Val{:central}, real(eltype(x)), y), df_ref) < 1e-6
141
+
142
+ @test err_func(DiffEqDiffTools.finite_difference_derivative(f, x, Val{:forward}, real(eltype(x)), y, epsilon), df_ref) < 1e-3
143
+ @test err_func(DiffEqDiffTools.finite_difference_derivative(f, x, Val{:central}, real(eltype(x)), y, epsilon), df_ref) < 1e-6
144
+
145
+ @test err_func(DiffEqDiffTools.finite_difference_derivative!(df, f, x, Val{:forward}, real(eltype(x))), df_ref) < 1e-3
146
+ @test err_func(DiffEqDiffTools.finite_difference_derivative!(df, f, x, Val{:central}, real(eltype(x))), df_ref) < 1e-6
147
+
148
+ @test err_func(DiffEqDiffTools.finite_difference_derivative!(df, f, x, Val{:forward}, real(eltype(x)), y), df_ref) < 1e-3
149
+ @test err_func(DiffEqDiffTools.finite_difference_derivative!(df, f, x, Val{:central}, real(eltype(x)), y), df_ref) < 1e-6
150
+
151
+ @test err_func(DiffEqDiffTools.finite_difference_derivative!(df, f, x, Val{:forward}, real(eltype(x)), y, epsilon), df_ref) < 1e-3
152
+ @test err_func(DiffEqDiffTools.finite_difference_derivative!(df, f, x, Val{:central}, real(eltype(x)), y, epsilon), df_ref) < 1e-6
153
+
154
+ @test err_func(DiffEqDiffTools.finite_difference_derivative!(df, f, x, forward_cache), df_ref) < 1e-3
155
+ @test err_func(DiffEqDiffTools.finite_difference_derivative!(df, f, x, central_cache), df_ref) < 1e-6
156
+ end
157
+ =#
158
+
82
159
# Gradient tests
83
160
f (x) = 2 x[1 ] + x[2 ]^ 2
84
161
x = rand (2 )
@@ -107,9 +184,7 @@ f(x) = 2x[1] + im*2x[1] + x[2]^2
107
184
x = x + im* x
108
185
fx = f (x)
109
186
df = zeros (x)
110
- df_ref = [2.0 + 2.0 * im, 2.0 * x[2 ]]
111
- DiffEqDiffTools. finite_difference_gradient (f, x, Val{:forward })
112
- DiffEqDiffTools. finite_difference_gradient (f, x, Val{:central })
187
+ df_ref = conj ([2.0 + 2.0 * im, 2.0 * x[2 ]])
113
188
forward_cache = DiffEqDiffTools. GradientCache (df,x,fx,nothing ,nothing ,Val{:forward })
114
189
central_cache = DiffEqDiffTools. GradientCache (df,x,fx,nothing ,nothing ,Val{:central })
115
190
@@ -128,9 +203,7 @@ f(x) = sum(abs2, x)
128
203
x = ones (2 ) * (1 + im)
129
204
fx = f (x)
130
205
df = zeros (x)
131
- df_ref = 2 * conj .(x)
132
- DiffEqDiffTools. finite_difference_gradient (f, x, Val{:forward })
133
- DiffEqDiffTools. finite_difference_gradient (f, x, Val{:central })
206
+ df_ref = 2 * x
134
207
forward_cache = DiffEqDiffTools. GradientCache (df,x,fx,nothing ,nothing ,Val{:forward })
135
208
central_cache = DiffEqDiffTools. GradientCache (df,x,fx,nothing ,nothing ,Val{:central })
136
209
@@ -149,7 +222,7 @@ f(x) = 2*x[1] + im*x[2]^2
149
222
x = ones (2 )
150
223
fx = f (x)
151
224
df = zeros (eltype (fx), size (x))
152
- df_ref = [2.0 , im* 2 * x[2 ]]
225
+ df_ref = [2.0 , - im* 2 * x[2 ]]
153
226
forward_cache = DiffEqDiffTools. GradientCache (df,x,fx,nothing ,nothing ,Val{:forward },eltype (df))
154
227
central_cache = DiffEqDiffTools. GradientCache (df,x,fx,nothing ,nothing ,Val{:central },eltype (df))
155
228
0 commit comments