From 6ef4d483b21c7eba4c9b4f07ad0ab22e102647ed Mon Sep 17 00:00:00 2001
From: Johannes Pfeifer <jpfeifer@gmx.de>
Date: Sun, 27 Aug 2023 13:37:16 +0200
Subject: [PATCH] dynare_solve.m: fix logic of initial guess randomization
 which forgot case of imaginary numbers

(cherry picked from commit 7df3ff50599dc086f5d7bd14ab4c0cfbc7d48ba8)
---
 matlab/dynare_solve.m | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/matlab/dynare_solve.m b/matlab/dynare_solve.m
index 3527659419..82d96d0c36 100644
--- a/matlab/dynare_solve.m
+++ b/matlab/dynare_solve.m
@@ -105,7 +105,7 @@ if jacobian_flag
             tentative_number = tentative_number+1;
             x(idx) = rand(in0, 1)*10;
             [fvec, fjac] = feval(f, x, args{:});
-            wrong_initial_guess_flag = ~all(isfinite(fvec)) || any(isinf(fjac(:))) || any(isnan((fjac(:))));
+            wrong_initial_guess_flag = ~all(isfinite(fvec)) || any(isinf(fjac(:))) || any(isnan((fjac(:)))) || any(~isreal(fvec)) || any(~isreal(fjac(:)));
         end
         % If all previous attempts failed, try with real numbers.
         tentative_number = 0;
@@ -113,7 +113,7 @@ if jacobian_flag
             tentative_number = tentative_number+1;
             x(idx) = randn(in0, 1)*10;
             [fvec, fjac] = feval(f, x, args{:});
-            wrong_initial_guess_flag = ~all(isfinite(fvec)) || any(isinf(fjac(:))) || any(isnan((fjac(:))));
+            wrong_initial_guess_flag = ~all(isfinite(fvec)) || any(isinf(fjac(:))) || any(isnan((fjac(:)))) || any(~isreal(fvec)) || any(~isreal(fjac(:)));
         end
         % Last tentative, ff all previous attempts failed, try with negative numbers.
         tentative_number = 0;
@@ -121,7 +121,7 @@ if jacobian_flag
             tentative_number = tentative_number+1;
             x(idx) = -rand(in0, 1)*10;
             [fvec, fjac] = feval(f, x, args{:});
-            wrong_initial_guess_flag = ~all(isfinite(fvec)) || any(isinf(fjac(:))) || any(isnan((fjac(:))));
+            wrong_initial_guess_flag = ~all(isfinite(fvec)) || any(isinf(fjac(:))) || any(isnan((fjac(:)))) || any(~isreal(fvec)) || any(~isreal(fjac(:)));
         end
     end
 else
-- 
GitLab