@@ -189,7 +189,8 @@ function sf(u, p=nothing)
189
189
end
190
190
191
191
u0 = [1.0 , 1.0 ]
192
- radius_update_schemes = [RadiusUpdateSchemes. Simple, RadiusUpdateSchemes. Hei, RadiusUpdateSchemes. Yuan]
192
+ radius_update_schemes = [RadiusUpdateSchemes. Simple, RadiusUpdateSchemes. Hei, RadiusUpdateSchemes. Yuan,
193
+ RadiusUpdateSchemes. Fan]
193
194
194
195
for radius_update_scheme in radius_update_schemes
195
196
sol = benchmark_immutable (ff, cu0, radius_update_scheme)
@@ -255,7 +256,6 @@ for p in 1.1:0.1:100.0
255
256
@test ForwardDiff. derivative (g, p) ≈ 1 / (2 * sqrt (p))
256
257
end
257
258
258
- # # FAIL BECAUSE JVP CANNOT ACCEPT PARAMETERS IN FUNCTIONS
259
259
g = function (p)
260
260
probN = NonlinearProblem {false} (f, csu0, p)
261
261
sol = solve (probN, TrustRegion (radius_update_scheme = RadiusUpdateSchemes. Yuan), abstol = 1e-9 )
@@ -267,6 +267,17 @@ for p in 1.1:0.1:100.0
267
267
@test ForwardDiff. derivative (g, p) ≈ 1 / (2 * sqrt (p))
268
268
end
269
269
270
+ g = function (p)
271
+ probN = NonlinearProblem {false} (f, csu0, p)
272
+ sol = solve (probN, TrustRegion (radius_update_scheme = RadiusUpdateSchemes. Fan), abstol = 1e-9 )
273
+ return sol. u[end ]
274
+ end
275
+
276
+ for p in 1.1 : 0.1 : 100.0
277
+ @test g (p) ≈ sqrt (p)
278
+ @test ForwardDiff. derivative (g, p) ≈ 1 / (2 * sqrt (p))
279
+ end
280
+
270
281
# Scalar
271
282
f, u0 = (u, p) -> u * u - p, 1.0
272
283
@@ -309,6 +320,19 @@ for p in 1.1:0.1:100.0
309
320
@test ForwardDiff. derivative (g, p) ≈ 1 / (2 * sqrt (p))
310
321
end
311
322
323
+ g = function (p)
324
+ probN = NonlinearProblem {false} (f, oftype (p, u0), p)
325
+ sol = solve (probN, TrustRegion (radius_update_scheme = RadiusUpdateSchemes. Fan), abstol = 1e-10 )
326
+ return sol. u
327
+ end
328
+
329
+ @test ForwardDiff. derivative (g, 3.0 ) ≈ 1 / (2 * sqrt (3.0 ))
330
+
331
+ for p in 1.1 : 0.1 : 100.0
332
+ @test g (p) ≈ sqrt (p)
333
+ @test ForwardDiff. derivative (g, p) ≈ 1 / (2 * sqrt (p))
334
+ end
335
+
312
336
f = (u, p) -> p[1 ] * u * u - p[2 ]
313
337
t = (p) -> [sqrt (p[2 ] / p[1 ])]
314
338
p = [0.9 , 50.0 ]
328
352
@test gnewton (p) ≈ [sqrt (p[2 ] / p[1 ])]
329
353
@test ForwardDiff. jacobian (gnewton, p) ≈ ForwardDiff. jacobian (t, p)
330
354
355
+ gnewton = function (p)
356
+ probN = NonlinearProblem {false} (f, 0.5 , p)
357
+ sol = solve (probN, TrustRegion (radius_update_scheme = RadiusUpdateSchemes. Yuan))
358
+ return [sol. u]
359
+ end
360
+ @test gnewton (p) ≈ [sqrt (p[2 ] / p[1 ])]
361
+ @test ForwardDiff. jacobian (gnewton, p) ≈ ForwardDiff. jacobian (t, p)
362
+
363
+ gnewton = function (p)
364
+ probN = NonlinearProblem {false} (f, 0.5 , p)
365
+ sol = solve (probN, TrustRegion (radius_update_scheme = RadiusUpdateSchemes. Fan))
366
+ return [sol. u]
367
+ end
368
+ @test gnewton (p) ≈ [sqrt (p[2 ] / p[1 ])]
369
+ @test ForwardDiff. jacobian (gnewton, p) ≈ ForwardDiff. jacobian (t, p)
370
+
331
371
# Iterator interface
332
372
f = (u, p) -> u * u - p
333
373
g = function (p_range)
@@ -372,6 +412,9 @@ probN = NonlinearProblem(f, u0)
372
412
@test solve (probN, TrustRegion (radius_update_scheme = RadiusUpdateSchemes. Yuan)). u[end ] ≈ sqrt (2.0 )
373
413
@test solve (probN, TrustRegion (; radius_update_scheme = RadiusUpdateSchemes. Yuan, autodiff = false )). u[end ] ≈ sqrt (2.0 )
374
414
415
+ @test solve (probN, TrustRegion (radius_update_scheme = RadiusUpdateSchemes. Fan)). u[end ] ≈ sqrt (2.0 )
416
+ @test solve (probN, TrustRegion (; radius_update_scheme = RadiusUpdateSchemes. Fan, autodiff = false )). u[end ] ≈ sqrt (2.0 )
417
+
375
418
for u0 in [1.0 , [1 , 1.0 ]]
376
419
local f, probN, sol
377
420
f = (u, p) -> u .* u .- 2.0
@@ -404,6 +447,16 @@ u = g(p)
404
447
f (u, p)
405
448
@test all (abs .(f (u, p)) .< 1e-10 )
406
449
450
+ g = function (p)
451
+ probN = NonlinearProblem {false} (f, u0, p)
452
+ sol = solve (probN, TrustRegion (radius_update_scheme = RadiusUpdateSchemes. Fan), abstol = 1e-10 )
453
+ return sol. u
454
+ end
455
+ p = [0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ]
456
+ u = g (p)
457
+ f (u, p)
458
+ @test all (abs .(f (u, p)) .< 1e-10 )
459
+
407
460
# Test kwars in `TrustRegion`
408
461
max_trust_radius = [10.0 , 100.0 , 1000.0 ]
409
462
initial_trust_radius = [10.0 , 1.0 , 0.1 ]
0 commit comments