File: TriangularSylvester.h

package info (click to toggle)
dynare 4.3.0-2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 40,640 kB
  • sloc: fortran: 82,231; cpp: 72,734; ansic: 28,874; pascal: 13,241; sh: 4,300; objc: 3,281; yacc: 2,833; makefile: 1,288; lex: 1,162; python: 162; lisp: 54; xml: 8
file content (115 lines) | stat: -rw-r--r-- 4,789 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/* $Header: /var/lib/cvs/dynare_cpp/sylv/cc/TriangularSylvester.h,v 1.1.1.1 2004/06/04 13:01:03 kamenik Exp $ */

/* Tag $Name:  $ */

#ifndef TRIANGULAR_SYLVESTER_H
#define TRIANGULAR_SYLVESTER_H

#include "SylvesterSolver.h"
#include "KronVector.h"
#include "QuasiTriangular.h"
#include "QuasiTriangularZero.h"
#include "SimilarityDecomp.h"

class TriangularSylvester : public SylvesterSolver {
	const QuasiTriangular* const matrixKK;
	const QuasiTriangular* const matrixFF;
public:
	TriangularSylvester(const QuasiTriangular& k, const QuasiTriangular& f);
	TriangularSylvester(const SchurDecompZero& kdecomp, const SchurDecomp& fdecomp);
	TriangularSylvester(const SchurDecompZero& kdecomp, const SimilarityDecomp& fdecomp);
	virtual ~TriangularSylvester();
	void print() const;
	void solve(SylvParams& pars, KronVector& d) const;

	void solvi(double r, KronVector& d, double& eig_min) const;
	void solvii(double alpha, double beta1, double beta2,
				KronVector& d1, KronVector& d2,
				double& eig_min) const;
	void solviip(double alpha, double betas,
				 KronVector& d, double& eig_min) const;
	/* evaluates:
	   |x1|   |d1| |alpha -beta1|                       |d1|
	   |  | = |  |+|            |\otimes F'...\otimes K |  |
	   |x2|   |d2| |beta2  alpha|                       |d2|
	*/
	void linEval(double alpha, double beta1, double beta2,
				 KronVector& x1, KronVector& x2,
				 const ConstKronVector& d1, const ConstKronVector& d2) const;
	void linEval(double alpha, double beta1, double beta2,
				 KronVector& x1, KronVector& x2,
				 const KronVector& d1, const KronVector& d2) const
		{linEval(alpha, beta1, beta2, x1, x2,
				 ConstKronVector(d1), ConstKronVector(d2));}

	/* evaluates:
	   |x1|   |d1|          |gamma -delta1|                       |d1|
	   |  | = |  | + 2alpha*|             |\otimes F'...\otimes K |  | +
	   |x2|   |d2|          |delta2  gamma|                       |d2|

                                     |gamma -delta1|^2                       |d1|
                   + (alpha^2+betas)*|             |\otimes F'2...\otimes K2 |  |
                                     |delta2  gamma|                         |d2|
	*/
	void quaEval(double alpha, double betas,
				 double gamma, double delta1, double delta2,
				 KronVector& x1, KronVector& x2,
				 const ConstKronVector& d1, const ConstKronVector& d2) const;
	void quaEval(double alpha, double betas,
				 double gamma, double delta1, double delta2,
				 KronVector& x1, KronVector& x2,
				 const KronVector& d1, const KronVector& d2) const
		{quaEval(alpha, betas, gamma, delta1, delta2, x1, x2,
				 ConstKronVector(d1), ConstKronVector(d2));}
private:
	/* returns square of size of minimal eigenvalue of the system solved,
	   now obsolete */ 
	double getEigSep(int depth) const;
	/* recursivelly calculates kronecker product of complex vectors (used in getEigSep) */
	static void multEigVector(KronVector& eig, const Vector& feig, const Vector& keig);
	/* auxiliary typedefs */
	typedef QuasiTriangular::const_diag_iter const_diag_iter;
	typedef QuasiTriangular::const_row_iter const_row_iter;
	/* called from solvi */
	void solviRealAndEliminate(double r, const_diag_iter di,
							   KronVector& d, double& eig_min) const;
	void solviComplexAndEliminate(double r, const_diag_iter di,
								  KronVector& d, double& eig_min) const;
	/* called from solviip */
	void solviipRealAndEliminate(double alpha, double betas,
								 const_diag_iter di, const_diag_iter dsi,
								 KronVector& d, double& eig_min) const;
	void solviipComplexAndEliminate(double alpha, double betas,
									const_diag_iter di, const_diag_iter dsi,
									KronVector& d, double& eig_min) const;
	/* eliminations */
	void solviEliminateReal(const_diag_iter di, KronVector& d,
							const KronVector& y, double divisor) const;
	void solviEliminateComplex(const_diag_iter di, KronVector& d,
							   const KronVector& y1, const KronVector& y2,
							   double divisor) const;
	void solviipEliminateReal(const_diag_iter di, const_diag_iter dsi,
							  KronVector& d,
							  const KronVector& y1, const KronVector& y2,
							  double divisor, double divisor2) const;
	void solviipEliminateComplex(const_diag_iter di, const_diag_iter dsi,
								 KronVector& d,
								 const KronVector& y1, const KronVector& y11,
								 const KronVector& y2, const KronVector& y22,
								 double divisor) const;
	/* Lemma 2 */
	void solviipComplex(double alpha, double betas, double gamma,
						double delta1, double delta2,
						KronVector& d1, KronVector& d2,
						double& eig_min) const;
	/* norms for what we consider zero on diagonal of F */
	static double diag_zero;
	static double diag_zero_sq; // square of diag_zero
};

#endif /* TRIANGULAR_SYLVESTER_H */


// Local Variables:
// mode:C++
// End: