From 8d7883a3b79e6cd208f1a29ffb9e884556a45ca2 Mon Sep 17 00:00:00 2001 From: Daisuke Oyama Date: Wed, 25 Oct 2017 22:32:29 +0900 Subject: [PATCH] FIX: Remove 0.0 from `candidates` in `solve_discrete_riccati` (#185) * FIX: Remove 0.0 from `candidates` in `solve_discrete_riccati` QuantEcon/QuantEcon.py#364 * FIX: Replace `isfinite(cn)` with `cn * eps() < 1` in solve_discrete_riccati QuantEcon/QuantEcon.py#361 --- src/matrix_eqn.jl | 4 ++-- test/test_matrix_eqn.jl | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/matrix_eqn.jl b/src/matrix_eqn.jl index 5d2a9bf4..bdf2cf0c 100644 --- a/src/matrix_eqn.jl +++ b/src/matrix_eqn.jl @@ -115,14 +115,14 @@ function solve_discrete_riccati(A::ScalarOrArray, B::ScalarOrArray, I = eye(k) current_min = Inf - candidates = [0.0, 0.01, 0.1, 0.25, 0.5, 1.0, 2.0, 10.0, 100.0, 10e5] + candidates = [0.01, 0.1, 0.25, 0.5, 1.0, 2.0, 10.0, 100.0, 10e5] BB = B' * B BTA = B' * A for gamma in candidates Z = getZ(R, gamma, BB) cn = cond(Z) - if isfinite(cn) + if cn * eps() < 1 Q_tilde = -Q + N' * (Z \ (N + gamma .* BTA)) + gamma .* I G0 = B * (Z \ B') A0 = (I - gamma .* G0) * A - B * (Z \ N) diff --git a/test/test_matrix_eqn.jl b/test/test_matrix_eqn.jl index 666cab3f..b52aafad 100644 --- a/test/test_matrix_eqn.jl +++ b/test/test_matrix_eqn.jl @@ -1,6 +1,6 @@ @testset "Testing matrix_eqn.jl" begin rough_kwargs = Dict(:atol => 1e-7, :rtol => 1e-7) - + @testset "simple test where X is all zero" begin A = eye(4) .* .95 B = zeros(4, 4) @@ -38,14 +38,14 @@ @testset "testing ricatti golden_num_float" begin val = solve_discrete_riccati(1.0, 1.0, 1.0, 1.0) gold_ratio = (1 + sqrt(5)) / 2. - @test val[1] == (gold_ratio) + @test isapprox(val[1], gold_ratio; rough_kwargs...) end @testset "testing ricatti golden_num_2d" begin A, B, R, Q = eye(2), eye(2), eye(2), eye(2) gold_diag = eye(2) .* (1 + sqrt(5)) ./ 2. val = solve_discrete_riccati(A, B, Q, R) - @test val == (gold_diag) + @test isapprox(val, gold_diag; rough_kwargs...) end @testset "test tjm 1" begin