@@ -312,6 +312,23 @@ function to_multivariate_time_variant(system::LinearUnivariateTimeVariant{Fl}) w
312
312
end
313
313
314
314
to_multivariate_time_variant (system:: LinearMultivariateTimeVariant ) = system
315
+ ispossemdef (M:: Matrix{Fl} ) where Fl = all (i -> i >= 0.0 , eigvals (M))
316
+
317
+ function cholesky_decomposition (M:: Matrix{Fl} ) where Fl
318
+ if isposdef (M)
319
+ return cholesky (M)
320
+ elseif ispossemdef (M)
321
+ size_matrix = size (M, 1 )
322
+ chol_M = cholesky (M .+ I (size_matrix) .* floatmin (Fl))
323
+ chol_M. L[:, :] = round .(chol_M. L; digits = 10 )
324
+ chol_M. U[:, :] = round .(chol_M. U; digits = 10 )
325
+ chol_M. UL[:, :] = round .(chol_M. UL; digits = 10 )
326
+
327
+ return chol_M
328
+ else
329
+ @error (" Matrix is not positive definite or semidefinite. Cholesky decomposition cannot be performed." )
330
+ end
331
+ end
315
332
316
333
# Functions for simulations
317
334
function simulate (
@@ -325,7 +342,7 @@ function simulate(
325
342
alpha = Matrix {Fl} (undef, n + 1 , m)
326
343
# Sampling errors
327
344
chol_H = sqrt (sys. H)
328
- chol_Q = cholesky (sys. Q)
345
+ chol_Q = cholesky_decomposition (sys. Q)
329
346
standard_ε = randn (n)
330
347
standard_η = randn (n + 2 , size (sys. Q, 1 ))
331
348
@@ -357,7 +374,7 @@ function simulate(
357
374
alpha = Matrix {Fl} (undef, n + 1 , m)
358
375
# Sampling errors
359
376
chol_H = cholesky (sys. H)
360
- chol_Q = cholesky (sys. Q)
377
+ chol_Q = cholesky_decomposition (sys. Q)
361
378
standard_ε = randn (n, size (sys. H, 1 ))
362
379
standard_η = randn (n + 2 , size (sys. Q, 1 ))
363
380
0 commit comments