|
193 | 193 |
|
194 | 194 | u0 = [1.0, 1.0]
|
195 | 195 | radius_update_schemes = [RadiusUpdateSchemes.Simple, RadiusUpdateSchemes.Hei,
|
196 |
| - RadiusUpdateSchemes.Yuan, |
197 |
| - RadiusUpdateSchemes.Fan] |
| 196 | + RadiusUpdateSchemes.Yuan, RadiusUpdateSchemes.Fan, RadiusUpdateSchemes.Bastin] |
198 | 197 |
|
199 | 198 | for radius_update_scheme in radius_update_schemes
|
200 | 199 | sol = benchmark_immutable(ff, cu0, radius_update_scheme)
|
@@ -286,6 +285,18 @@ for p in 1.1:0.1:100.0
|
286 | 285 | @test ForwardDiff.derivative(g, p) ≈ 1 / (2 * sqrt(p))
|
287 | 286 | end
|
288 | 287 |
|
| 288 | +g = function (p) |
| 289 | + probN = NonlinearProblem{false}(f, csu0, p) |
| 290 | + sol = solve(probN, TrustRegion(radius_update_scheme = RadiusUpdateSchemes.Bastin), |
| 291 | + abstol = 1e-9) |
| 292 | + return sol.u[end] |
| 293 | +end |
| 294 | + |
| 295 | +for p in 1.1:0.1:100.0 |
| 296 | + @test g(p) ≈ sqrt(p) |
| 297 | + @test ForwardDiff.derivative(g, p) ≈ 1 / (2 * sqrt(p)) |
| 298 | +end |
| 299 | + |
289 | 300 | # Scalar
|
290 | 301 | f, u0 = (u, p) -> u * u - p, 1.0
|
291 | 302 |
|
@@ -344,6 +355,20 @@ for p in 1.1:0.1:100.0
|
344 | 355 | @test ForwardDiff.derivative(g, p) ≈ 1 / (2 * sqrt(p))
|
345 | 356 | end
|
346 | 357 |
|
| 358 | +g = function (p) |
| 359 | + probN = NonlinearProblem{false}(f, oftype(p, u0), p) |
| 360 | + sol = solve(probN, TrustRegion(radius_update_scheme = RadiusUpdateSchemes.Bastin), |
| 361 | + abstol = 1e-10) |
| 362 | + return sol.u |
| 363 | +end |
| 364 | + |
| 365 | +@test ForwardDiff.derivative(g, 3.0) ≈ 1 / (2 * sqrt(3.0)) |
| 366 | + |
| 367 | +for p in 1.1:0.1:100.0 |
| 368 | + @test g(p) ≈ sqrt(p) |
| 369 | + @test ForwardDiff.derivative(g, p) ≈ 1 / (2 * sqrt(p)) |
| 370 | +end |
| 371 | + |
347 | 372 | f = (u, p) -> p[1] * u * u - p[2]
|
348 | 373 | t = (p) -> [sqrt(p[2] / p[1])]
|
349 | 374 | p = [0.9, 50.0]
|
|
379 | 404 | @test gnewton(p) ≈ [sqrt(p[2] / p[1])]
|
380 | 405 | @test ForwardDiff.jacobian(gnewton, p) ≈ ForwardDiff.jacobian(t, p)
|
381 | 406 |
|
| 407 | +gnewton = function (p) |
| 408 | + probN = NonlinearProblem{false}(f, 0.5, p) |
| 409 | + sol = solve(probN, TrustRegion(radius_update_scheme = RadiusUpdateSchemes.Bastin)) |
| 410 | + return [sol.u] |
| 411 | +end |
| 412 | +@test gnewton(p) ≈ [sqrt(p[2] / p[1])] |
| 413 | +@test ForwardDiff.jacobian(gnewton, p) ≈ ForwardDiff.jacobian(t, p) |
| 414 | + |
382 | 415 | # Iterator interface
|
383 | 416 | f = (u, p) -> u * u - p
|
384 | 417 | g = function (p_range)
|
@@ -432,6 +465,11 @@ probN = NonlinearProblem(f, u0)
|
432 | 465 | @test solve(probN, TrustRegion(; radius_update_scheme = RadiusUpdateSchemes.Fan, autodiff = false)).u[end] ≈
|
433 | 466 | sqrt(2.0)
|
434 | 467 |
|
| 468 | +@test solve(probN, TrustRegion(radius_update_scheme = RadiusUpdateSchemes.Bastin)).u[end] ≈ |
| 469 | + sqrt(2.0) |
| 470 | +@test solve(probN, TrustRegion(; radius_update_scheme = RadiusUpdateSchemes.Bastin, autodiff = false)).u[end] ≈ |
| 471 | + sqrt(2.0) |
| 472 | + |
435 | 473 | for u0 in [1.0, [1, 1.0]]
|
436 | 474 | local f, probN, sol
|
437 | 475 | f = (u, p) -> u .* u .- 2.0
|
@@ -475,6 +513,17 @@ u = g(p)
|
475 | 513 | f(u, p)
|
476 | 514 | @test all(abs.(f(u, p)) .< 1e-10)
|
477 | 515 |
|
| 516 | +g = function (p) |
| 517 | + probN = NonlinearProblem{false}(f, u0, p) |
| 518 | + sol = solve(probN, TrustRegion(radius_update_scheme = RadiusUpdateSchemes.Bastin), |
| 519 | + abstol = 1e-10) |
| 520 | + return sol.u |
| 521 | +end |
| 522 | +p = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] |
| 523 | +u = g(p) |
| 524 | +f(u, p) |
| 525 | +@test all(abs.(f(u, p)) .< 1e-10) |
| 526 | + |
478 | 527 | # Test kwars in `TrustRegion`
|
479 | 528 | max_trust_radius = [10.0, 100.0, 1000.0]
|
480 | 529 | initial_trust_radius = [10.0, 1.0, 0.1]
|
@@ -542,6 +591,11 @@ for maxiters in maxiterations
|
542 | 591 | @test iip == oop
|
543 | 592 | end
|
544 | 593 |
|
| 594 | +for maxiters in maxiterations |
| 595 | + iip, oop = iip_oop(ff, ffiip, u0, RadiusUpdateSchemes.Bastin, maxiters) |
| 596 | + @test iip == oop |
| 597 | +end |
| 598 | + |
545 | 599 | # --- LevenbergMarquardt tests ---
|
546 | 600 |
|
547 | 601 | function benchmark_immutable(f, u0)
|
|
0 commit comments