libQZ.neardist
author A.M. Thurnherr <athurnherr@yahoo.com>
Sat, 24 Jul 2021 09:38:16 -0400
changeset 46 70e566505a12
parent 17 4b7486d77b39
permissions -rw-r--r--
V7.3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
#======================================================================
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
#                    L I B Q Z . P L 
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Thu Mar 12 15:23:15 2015
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#                    dlm: Thu Mar 12 20:52:43 2015
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#                    (c) 2015 A.M. Thurnherr
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
#                    uE-Info: 36 0 NIL 0 0 72 2 2 4 NIL ofnI
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     7
#======================================================================
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     8
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     9
# adaptation of EISPACK routines
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
# www.netlib.org/eispack
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
sub eig($$)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
	my($aR,$bR) = @_;							# args passed as refs
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
	my($N) = scalar(@{aR});
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
	croak("eig(A,B): A & B must be matching square matrices\n")
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
		unless (@{bR} == $N) && (@{$aR->[0]} == $N) && (@{$bR->[0]} == $N);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
		ar = new double[n];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
		ai = new double[n];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
		beta = new double[n];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
		var A = (double[,])a.Clone();
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
		var B = (double[,])b.Clone();
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
	my($matZ) = 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
	my($iErr) = 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
	my(@Z);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
	QZhes($aR,$bR,\@Z);								# reduce A/B to upper Hessenberg/triangular forms
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
	QZit($aR,$bR,\@Z,\$iErr);						# reduce Hess A to quasi-triangular form
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
	QZval($aR,$bR,\@Z,\@alphaR,\@alphaI,\@beta);	# reduce A further
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
	QZvec($aR,$bR,\@Z,\@alphaR,\@alphaI,\@beta);	# compute eigenvectors & eigenvalues
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
	/// <summary>Returns the real parts of the alpha values.</summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
	public double[] RealAlphas
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
	{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
		get { return ar; }
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
	}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
	/// <summary>Returns the imaginary parts of the alpha values.</summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
	public double[] ImaginaryAlphas
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
	{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
		get { return ai; }
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
	}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
	/// <summary>Returns the beta values.</summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
	public double[] Betas
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
	{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
		get { return beta; }
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
	}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
	/// <summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
	///   Returns true if matrix B is singular.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
	/// </summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
	/// <remarks>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
	///   This method checks if any of the generated betas is zero. It
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
	///   does not says that the problem is singular, but only that one
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
	///   of the matrices of the pencil (A,B) is singular.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
	/// </remarks>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
	public bool IsSingular
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
	{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
		get
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
			for (int i = 0; i < n; i++)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
				if (beta[i] == 0)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
					return true;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
			return false;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
	}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
	/// <summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
	///   Returns true if the eigenvalue problem is degenerate (ill-posed).
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
	/// </summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
	public bool IsDegenerate
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
	{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
		get
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
			for (int i = 0; i < n; i++)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
				if (beta[i] == 0 && ar[i] == 0)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
					return true;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
			return false;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
	}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
	/// <summary>Returns the real parts of the eigenvalues.</summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
	/// <remarks>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
	///   The eigenvalues are computed using the ratio alpha[i]/beta[i],
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
	///   which can lead to valid, but infinite eigenvalues.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
	/// </remarks>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
	public double[] RealEigenvalues
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    95
	{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    96
		get
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    97
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    98
			// ((alfr+i*alfi)/beta)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    99
			double[] eval = new double[n];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   100
			for (int i = 0; i < n; i++)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   101
				eval[i] = ar[i] / beta[i];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
			return eval;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
	}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
	/// <summary>Returns the imaginary parts of the eigenvalues.</summary>  
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
	/// <remarks>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
	///   The eigenvalues are computed using the ratio alpha[i]/beta[i],
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
	///   which can lead to valid, but infinite eigenvalues.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
	/// </remarks>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
	public double[] ImaginaryEigenvalues
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112
	{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
		get
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   114
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
			// ((alfr+i*alfi)/beta)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
			double[] eval = new double[n];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   117
			for (int i = 0; i < n; i++)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   118
				eval[i] = ai[i] / beta[i];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   119
			return eval;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   121
	}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   122
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   123
	/// <summary>Returns the eigenvector matrix.</summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   124
	public double[,] Eigenvectors
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   125
	{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   126
		get
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   127
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   128
			return Z;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   129
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   130
	}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   131
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   132
	/// <summary>Returns the block diagonal eigenvalue matrix.</summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   133
	public double[,] DiagonalMatrix
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   134
	{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   135
		get
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   136
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   137
			double[,] x = new double[n, n];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   138
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   139
			for (int i = 0; i < n; i++)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   140
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   141
				for (int j = 0; j < n; j++)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   142
					x[i, j] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   143
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   144
				x[i, i] = ar[i] / beta[i];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   145
				if (ai[i] > 0)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   146
					x[i, i + 1] = ai[i] / beta[i];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   147
				else if (ai[i] < 0)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   148
					x[i, i - 1] = ai[i] / beta[i];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   149
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   150
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   151
			return x;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   152
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   153
	}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   154
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   155
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   156
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   157
	#region EISPACK Routines
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   158
	/// <summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   159
	///   Adaptation of the original Fortran QZHES routine from EISPACK.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   160
	/// </summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   161
	/// <remarks>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   162
	///   This subroutine is the first step of the qz algorithm
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   163
	///   for solving generalized matrix eigenvalue problems,
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   164
	///   siam j. numer. anal. 10, 241-256(1973) by moler and stewart.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   165
	///
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   166
	///   This subroutine accepts a pair of real general matrices and
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   167
	///   reduces one of them to upper hessenberg form and the other
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   168
	///   to upper triangular form using orthogonal transformations.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   169
	///   it is usually followed by  qzit,	qzval  and, possibly,  qzvec.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   170
	///  
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   171
	///   For the full documentation, please check the original function.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   172
	/// </remarks>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   173
	private static int qzhes(int n, double[,] a, double[,] b, bool matz, double[,] z)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   174
	{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   175
		int i, j, k, l;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   176
		double r, s, t;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   177
		int l1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   178
		double u1, u2, v1, v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   179
		int lb, nk1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   180
		double rho;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   181
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   182
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   183
		if (matz)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   184
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   185
			// If we are interested in computing the
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   186
			//	eigenvectors, set Z to identity(n,n)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   187
			for (j = 0; j < n; ++j)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   188
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   189
				for (i = 0; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   190
					z[i, j] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   191
				z[j, j] = 1.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   192
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   193
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   194
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   195
		// Reduce b to upper triangular form
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   196
		if (n <= 1) return 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   197
		for (l = 0; l < n - 1; ++l)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   198
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   199
			l1 = l + 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   200
			s = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   201
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   202
			for (i = l1; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   203
				s += (System.Math.Abs(b[i, l]));
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   204
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   205
			if (s == 0.0) continue;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   206
			s += (System.Math.Abs(b[l, l]));
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   207
			r = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   208
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   209
			for (i = l; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   210
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   211
				// Computing 2nd power
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   212
				b[i, l] /= s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   213
				r += b[i, l] * b[i, l];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   214
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   215
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   216
			r = Special.Sign(System.Math.Sqrt(r), b[l, l]);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   217
			b[l, l] += r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   218
			rho = r * b[l, l];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   219
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   220
			for (j = l1; j < n; ++j)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   221
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   222
				t = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   223
				for (i = l; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   224
					t += b[i, l] * b[i, j];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   225
				t = -t / rho;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   226
				for (i = l; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   227
					b[i, j] += t * b[i, l];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   228
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   229
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   230
			for (j = 0; j < n; ++j)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   231
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   232
				t = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   233
				for (i = l; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   234
					t += b[i, l] * a[i, j];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   235
				t = -t / rho;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   236
				for (i = l; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   237
					a[i, j] += t * b[i, l];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   238
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   239
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   240
			b[l, l] = -s * r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   241
			for (i = l1; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   242
				b[i, l] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   243
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   244
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   245
		// Reduce a to upper hessenberg form, while keeping b triangular
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   246
		if (n == 2) return 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   247
		for (k = 0; k < n - 2; ++k)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   248
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   249
			nk1 = n - 2 - k;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   250
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   251
			// for l=n-1 step -1 until k+1 do
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   252
			for (lb = 0; lb < nk1; ++lb)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   253
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   254
				l = n - lb - 2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   255
				l1 = l + 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   256
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   257
				// Zero a(l+1,k)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   258
				s = (System.Math.Abs(a[l, k])) + (System.Math.Abs(a[l1, k]));
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   259
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   260
				if (s == 0.0) continue;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   261
				u1 = a[l, k] / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   262
				u2 = a[l1, k] / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   263
				r = Special.Sign(Math.Sqrt(u1 * u1 + u2 * u2), u1);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   264
				v1 = -(u1 + r) / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   265
				v2 = -u2 / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   266
				u2 = v2 / v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   267
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   268
				for (j = k; j < n; ++j)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   269
				{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   270
					t = a[l, j] + u2 * a[l1, j];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   271
					a[l, j] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   272
					a[l1, j] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   273
				}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   274
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   275
				a[l1, k] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   276
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   277
				for (j = l; j < n; ++j)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   278
				{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   279
					t = b[l, j] + u2 * b[l1, j];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   280
					b[l, j] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   281
					b[l1, j] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   282
				}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   283
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   284
				// Zero b(l+1,l)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   285
				s = (System.Math.Abs(b[l1, l1])) + (System.Math.Abs(b[l1, l]));
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   286
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   287
				if (s == 0.0) continue;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   288
				u1 = b[l1, l1] / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   289
				u2 = b[l1, l] / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   290
				r = Special.Sign(Math.Sqrt(u1 * u1 + u2 * u2), u1);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   291
				v1 = -(u1 + r) / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   292
				v2 = -u2 / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   293
				u2 = v2 / v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   294
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   295
				for (i = 0; i <= l1; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   296
				{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   297
					t = b[i, l1] + u2 * b[i, l];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   298
					b[i, l1] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   299
					b[i, l] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   300
				}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   301
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   302
				b[l1, l] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   303
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   304
				for (i = 0; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   305
				{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   306
					t = a[i, l1] + u2 * a[i, l];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   307
					a[i, l1] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   308
					a[i, l] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   309
				}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   310
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   311
				if (matz)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   312
				{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   313
					for (i = 0; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   314
					{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   315
						t = z[i, l1] + u2 * z[i, l];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   316
						z[i, l1] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   317
						z[i, l] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   318
					}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   319
				}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   320
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   321
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   322
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   323
		return 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   324
	}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   325
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   326
	/// <summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   327
	///   Adaptation of the original Fortran QZIT routine from EISPACK.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   328
	/// </summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   329
	/// <remarks>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   330
	///   This subroutine is the second step of the qz algorithm
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   331
	///   for solving generalized matrix eigenvalue problems,
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   332
	///   siam j. numer. anal. 10, 241-256(1973) by moler and stewart,
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   333
	///   as modified in technical note nasa tn d-7305(1973) by ward.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   334
	///  
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   335
	///   This subroutine accepts a pair of real matrices, one of them
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   336
	///   in upper hessenberg form and the other in upper triangular form.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   337
	///   it reduces the hessenberg matrix to quasi-triangular form using
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   338
	///   orthogonal transformations while maintaining the triangular form
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   339
	///   of the other matrix.	it is usually preceded by  qzhes  and
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   340
	///   followed by  qzval  and, possibly,  qzvec.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   341
	///  
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   342
	///   For the full documentation, please check the original function.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   343
	/// </remarks>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   344
	private static int qzit(int n, double[,] a, double[,] b, double eps1, bool matz, double[,] z, ref int ierr)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   345
	{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   346
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   347
		int i, j, k, l = 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   348
		double r, s, t, a1, a2, a3 = 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   349
		int k1, k2, l1, ll;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   350
		double u1, u2, u3;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   351
		double v1, v2, v3;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   352
		double a11, a12, a21, a22, a33, a34, a43, a44;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   353
		double b11, b12, b22, b33, b34, b44;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   354
		int na, en, ld;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   355
		double ep;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   356
		double sh = 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   357
		int km1, lm1 = 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   358
		double ani, bni;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   359
		int ish, itn, its, enm2, lor1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   360
		double epsa, epsb, anorm = 0, bnorm = 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   361
		int enorn;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   362
		bool notlas;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   363
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   364
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   365
		ierr = 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   366
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   367
		#region Compute epsa and epsb
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   368
		for (i = 0; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   369
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   370
			ani = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   371
			bni = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   372
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   373
			if (i != 0)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   374
				ani = (Math.Abs(a[i, (i - 1)]));
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   375
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   376
			for (j = i; j < n; ++j)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   377
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   378
				ani += Math.Abs(a[i, j]);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   379
				bni += Math.Abs(b[i, j]);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   380
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   381
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   382
			if (ani > anorm) anorm = ani;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   383
			if (bni > bnorm) bnorm = bni;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   384
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   385
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   386
		if (anorm == 0.0) anorm = 1.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   387
		if (bnorm == 0.0) bnorm = 1.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   388
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   389
		ep = eps1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   390
		if (ep == 0.0)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   391
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   392
			// Use roundoff level if eps1 is zero
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   393
			ep = Special.Epslon(1.0);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   394
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   395
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   396
		epsa = ep * anorm;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   397
		epsb = ep * bnorm;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   398
		#endregion
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   399
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   400
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   401
		// Reduce a to quasi-triangular form, while keeping b triangular
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   402
		lor1 = 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   403
		enorn = n;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   404
		en = n - 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   405
		itn = n * 30;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   406
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   407
	// Begin QZ step
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   408
	L60:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   409
		if (en <= 1) goto L1001;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   410
		if (!matz) enorn = en + 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   411
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   412
		its = 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   413
		na = en - 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   414
		enm2 = na;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   415
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   416
	L70:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   417
		ish = 2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   418
		// Check for convergence or reducibility.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   419
		for (ll = 0; ll <= en; ++ll)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   420
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   421
			lm1 = en - ll - 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   422
			l = lm1 + 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   423
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   424
			if (l + 1 == 1)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   425
				goto L95;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   426
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   427
			if ((Math.Abs(a[l, lm1])) <= epsa)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   428
				break;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   429
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   430
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   431
	L90:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   432
		a[l, lm1] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   433
		if (l < na) goto L95;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   434
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   435
		// 1-by-1 or 2-by-2 block isolated
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   436
		en = lm1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   437
		goto L60;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   438
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   439
	// Check for small top of b
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   440
	L95:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   441
		ld = l;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   442
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   443
	L100:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   444
		l1 = l + 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   445
		b11 = b[l, l];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   446
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   447
		if (Math.Abs(b11) > epsb) goto L120;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   448
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   449
		b[l, l] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   450
		s = (Math.Abs(a[l, l]) + Math.Abs(a[l1, l]));
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   451
		u1 = a[l, l] / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   452
		u2 = a[l1, l] / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   453
		r = Special.Sign(Math.Sqrt(u1 * u1 + u2 * u2), u1);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   454
		v1 = -(u1 + r) / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   455
		v2 = -u2 / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   456
		u2 = v2 / v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   457
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   458
		for (j = l; j < enorn; ++j)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   459
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   460
			t = a[l, j] + u2 * a[l1, j];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   461
			a[l, j] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   462
			a[l1, j] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   463
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   464
			t = b[l, j] + u2 * b[l1, j];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   465
			b[l, j] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   466
			b[l1, j] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   467
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   468
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   469
		if (l != 0)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   470
			a[l, lm1] = -a[l, lm1];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   471
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   472
		lm1 = l;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   473
		l = l1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   474
		goto L90;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   475
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   476
	L120:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   477
		a11 = a[l, l] / b11;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   478
		a21 = a[l1, l] / b11;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   479
		if (ish == 1) goto L140;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   480
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   481
		// Iteration strategy
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   482
		if (itn == 0) goto L1000;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   483
		if (its == 10) goto L155;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   484
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   485
		// Determine type of shift
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   486
		b22 = b[l1, l1];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   487
		if (Math.Abs(b22) < epsb) b22 = epsb;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   488
		b33 = b[na, na];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   489
		if (Math.Abs(b33) < epsb) b33 = epsb;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   490
		b44 = b[en, en];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   491
		if (Math.Abs(b44) < epsb) b44 = epsb;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   492
		a33 = a[na, na] / b33;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   493
		a34 = a[na, en] / b44;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   494
		a43 = a[en, na] / b33;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   495
		a44 = a[en, en] / b44;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   496
		b34 = b[na, en] / b44;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   497
		t = (a43 * b34 - a33 - a44) * .5;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   498
		r = t * t + a34 * a43 - a33 * a44;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   499
		if (r < 0.0) goto L150;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   500
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   501
		// Determine single shift zeroth column of a
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   502
		ish = 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   503
		r = Math.Sqrt(r);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   504
		sh = -t + r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   505
		s = -t - r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   506
		if (Math.Abs(s - a44) < Math.Abs(sh - a44))
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   507
			sh = s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   508
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   509
		// Look for two consecutive small sub-diagonal elements of a.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   510
		for (ll = ld; ll + 1 <= enm2; ++ll)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   511
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   512
			l = enm2 + ld - ll - 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   513
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   514
			if (l == ld)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   515
				goto L140;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   516
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   517
			lm1 = l - 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   518
			l1 = l + 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   519
			t = a[l + 1, l + 1];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   520
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   521
			if (Math.Abs(b[l, l]) > epsb)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   522
				t -= sh * b[l, l];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   523
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   524
			if (Math.Abs(a[l, lm1]) <= (Math.Abs(t / a[l1, l])) * epsa)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   525
				goto L100;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   526
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   527
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   528
	L140:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   529
		a1 = a11 - sh;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   530
		a2 = a21;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   531
		if (l != ld)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   532
			a[l, lm1] = -a[l, lm1];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   533
		goto L160;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   534
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   535
	// Determine double shift zeroth column of a
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   536
	L150:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   537
		a12 = a[l, l1] / b22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   538
		a22 = a[l1, l1] / b22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   539
		b12 = b[l, l1] / b22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   540
		a1 = ((a33 - a11) * (a44 - a11) - a34 * a43 + a43 * b34 * a11) / a21 + a12 - a11 * b12;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   541
		a2 = a22 - a11 - a21 * b12 - (a33 - a11) - (a44 - a11) + a43 * b34;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   542
		a3 = a[l1 + 1, l1] / b22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   543
		goto L160;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   544
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   545
	// Ad hoc shift
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   546
	L155:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   547
		a1 = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   548
		a2 = 1.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   549
		a3 = 1.1605;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   550
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   551
	L160:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   552
		++its;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   553
		--itn;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   554
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   555
		if (!matz) lor1 = ld;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   556
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   557
		// Main loop
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   558
		for (k = l; k <= na; ++k)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   559
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   560
			notlas = k != na && ish == 2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   561
			k1 = k + 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   562
			k2 = k + 2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   563
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   564
			km1 = Math.Max(k, l + 1) - 1; // Computing MAX
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   565
			ll = Math.Min(en, k1 + ish);  // Computing MIN
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   566
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   567
			if (notlas) goto L190;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   568
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   569
			// Zero a(k+1,k-1)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   570
			if (k == l) goto L170;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   571
			a1 = a[k, km1];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   572
			a2 = a[k1, km1];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   573
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   574
		L170:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   575
			s = Math.Abs(a1) + Math.Abs(a2);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   576
			if (s == 0.0) goto L70;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   577
			u1 = a1 / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   578
			u2 = a2 / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   579
			r = Special.Sign(Math.Sqrt(u1 * u1 + u2 * u2), u1);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   580
			v1 = -(u1 + r) / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   581
			v2 = -u2 / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   582
			u2 = v2 / v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   583
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   584
			for (j = km1; j < enorn; ++j)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   585
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   586
				t = a[k, j] + u2 * a[k1, j];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   587
				a[k, j] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   588
				a[k1, j] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   589
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   590
				t = b[k, j] + u2 * b[k1, j];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   591
				b[k, j] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   592
				b[k1, j] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   593
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   594
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   595
			if (k != l)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   596
				a[k1, km1] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   597
			goto L240;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   598
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   599
			// Zero a(k+1,k-1) and a(k+2,k-1)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   600
		L190:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   601
			if (k == l) goto L200;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   602
			a1 = a[k, km1];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   603
			a2 = a[k1, km1];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   604
			a3 = a[k2, km1];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   605
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   606
		L200:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   607
			s = Math.Abs(a1) + Math.Abs(a2) + Math.Abs(a3);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   608
			if (s == 0.0) goto L260;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   609
			u1 = a1 / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   610
			u2 = a2 / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   611
			u3 = a3 / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   612
			r = Special.Sign(Math.Sqrt(u1 * u1 + u2 * u2 + u3 * u3), u1);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   613
			v1 = -(u1 + r) / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   614
			v2 = -u2 / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   615
			v3 = -u3 / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   616
			u2 = v2 / v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   617
			u3 = v3 / v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   618
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   619
			for (j = km1; j < enorn; ++j)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   620
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   621
				t = a[k, j] + u2 * a[k1, j] + u3 * a[k2, j];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   622
				a[k, j] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   623
				a[k1, j] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   624
				a[k2, j] += t * v3;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   625
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   626
				t = b[k, j] + u2 * b[k1, j] + u3 * b[k2, j];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   627
				b[k, j] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   628
				b[k1, j] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   629
				b[k2, j] += t * v3;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   630
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   631
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   632
			if (k == l) goto L220;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   633
			a[k1, km1] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   634
			a[k2, km1] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   635
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   636
		// Zero b(k+2,k+1) and b(k+2,k)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   637
		L220:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   638
			s = (Math.Abs(b[k2, k2])) + (Math.Abs(b[k2, k1])) + (Math.Abs(b[k2, k]));
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   639
			if (s == 0.0) goto L240;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   640
			u1 = b[k2, k2] / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   641
			u2 = b[k2, k1] / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   642
			u3 = b[k2, k] / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   643
			r = Special.Sign(Math.Sqrt(u1 * u1 + u2 * u2 + u3 * u3), u1);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   644
			v1 = -(u1 + r) / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   645
			v2 = -u2 / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   646
			v3 = -u3 / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   647
			u2 = v2 / v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   648
			u3 = v3 / v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   649
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   650
			for (i = lor1; i < ll + 1; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   651
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   652
				t = a[i, k2] + u2 * a[i, k1] + u3 * a[i, k];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   653
				a[i, k2] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   654
				a[i, k1] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   655
				a[i, k] += t * v3;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   656
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   657
				t = b[i, k2] + u2 * b[i, k1] + u3 * b[i, k];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   658
				b[i, k2] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   659
				b[i, k1] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   660
				b[i, k] += t * v3;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   661
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   662
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   663
			b[k2, k] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   664
			b[k2, k1] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   665
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   666
			if (matz)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   667
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   668
				for (i = 0; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   669
				{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   670
					t = z[i, k2] + u2 * z[i, k1] + u3 * z[i, k];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   671
					z[i, k2] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   672
					z[i, k1] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   673
					z[i, k] += t * v3;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   674
				}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   675
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   676
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   677
		// Zero b(k+1,k)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   678
		L240:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   679
			s = (Math.Abs(b[k1, k1])) + (Math.Abs(b[k1, k]));
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   680
			if (s == 0.0) goto L260;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   681
			u1 = b[k1, k1] / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   682
			u2 = b[k1, k] / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   683
			r = Special.Sign(Math.Sqrt(u1 * u1 + u2 * u2), u1);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   684
			v1 = -(u1 + r) / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   685
			v2 = -u2 / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   686
			u2 = v2 / v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   687
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   688
			for (i = lor1; i < ll + 1; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   689
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   690
				t = a[i, k1] + u2 * a[i, k];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   691
				a[i, k1] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   692
				a[i, k] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   693
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   694
				t = b[i, k1] + u2 * b[i, k];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   695
				b[i, k1] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   696
				b[i, k] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   697
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   698
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   699
			b[k1, k] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   700
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   701
			if (matz)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   702
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   703
				for (i = 0; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   704
				{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   705
					t = z[i, k1] + u2 * z[i, k];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   706
					z[i, k1] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   707
					z[i, k] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   708
				}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   709
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   710
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   711
		L260:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   712
			;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   713
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   714
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   715
		goto L70; // End QZ step
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   716
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   717
	// Set error -- all eigenvalues have not converged after 30*n iterations
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   718
	L1000:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   719
		ierr = en + 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   720
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   721
	// Save epsb for use by qzval and qzvec
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   722
	L1001:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   723
		if (n > 1)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   724
			b[n - 1, 0] = epsb;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   725
		return 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   726
	}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   727
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   728
	/// <summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   729
	///   Adaptation of the original Fortran QZVAL routine from EISPACK.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   730
	/// </summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   731
	/// <remarks>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   732
	///   This subroutine is the third step of the qz algorithm
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   733
	///   for solving generalized matrix eigenvalue problems,
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   734
	///   siam j. numer. anal. 10, 241-256(1973) by moler and stewart.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   735
	///  
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   736
	///   This subroutine accepts a pair of real matrices, one of them
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   737
	///   in quasi-triangular form and the other in upper triangular form.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   738
	///   it reduces the quasi-triangular matrix further, so that any
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   739
	///   remaining 2-by-2 blocks correspond to pairs of complex
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   740
	///   eigenvalues, and returns quantities whose ratios give the
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   741
	///   generalized eigenvalues.	it is usually preceded by  qzhes
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   742
	///   and  qzit  and may be followed by  qzvec.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   743
	///  
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   744
	///   For the full documentation, please check the original function.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   745
	/// </remarks>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   746
	private static int qzval(int n, double[,] a, double[,] b, double[] alfr, double[] alfi, double[] beta, bool matz, double[,] z)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   747
	{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   748
		int i, j;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   749
		int na, en, nn;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   750
		double c, d, e = 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   751
		double r, s, t;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   752
		double a1, a2, u1, u2, v1, v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   753
		double a11, a12, a21, a22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   754
		double b11, b12, b22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   755
		double di, ei;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   756
		double an = 0, bn;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   757
		double cq, dr;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   758
		double cz, ti, tr;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   759
		double a1i, a2i, a11i, a12i, a22i, a11r, a12r, a22r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   760
		double sqi, ssi, sqr, szi, ssr, szr;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   761
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   762
		double epsb = b[n - 1, 0];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   763
		int isw = 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   764
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   765
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   766
		// Find eigenvalues of quasi-triangular matrices.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   767
		for (nn = 0; nn < n; ++nn)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   768
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   769
			en = n - nn - 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   770
			na = en - 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   771
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   772
			if (isw == 2) goto L505;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   773
			if (en == 0) goto L410;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   774
			if (a[en, na] != 0.0) goto L420;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   775
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   776
		// 1-by-1 block, one real root
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   777
		L410:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   778
			alfr[en] = a[en, en];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   779
			if (b[en, en] < 0.0)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   780
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   781
				alfr[en] = -alfr[en];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   782
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   783
			beta[en] = (Math.Abs(b[en, en]));
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   784
			alfi[en] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   785
			goto L510;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   786
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   787
		// 2-by-2 block
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   788
		L420:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   789
			if (Math.Abs(b[na, na]) <= epsb) goto L455;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   790
			if (Math.Abs(b[en, en]) > epsb) goto L430;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   791
			a1 = a[en, en];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   792
			a2 = a[en, na];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   793
			bn = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   794
			goto L435;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   795
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   796
		L430:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   797
			an = Math.Abs(a[na, na]) + Math.Abs(a[na, en]) + Math.Abs(a[en, na]) + Math.Abs(a[en, en]);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   798
			bn = Math.Abs(b[na, na]) + Math.Abs(b[na, en]) + Math.Abs(b[en, en]);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   799
			a11 = a[na, na] / an;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   800
			a12 = a[na, en] / an;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   801
			a21 = a[en, na] / an;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   802
			a22 = a[en, en] / an;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   803
			b11 = b[na, na] / bn;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   804
			b12 = b[na, en] / bn;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   805
			b22 = b[en, en] / bn;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   806
			e = a11 / b11;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   807
			ei = a22 / b22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   808
			s = a21 / (b11 * b22);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   809
			t = (a22 - e * b22) / b22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   810
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   811
			if (Math.Abs(e) <= Math.Abs(ei))
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   812
				goto L431;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   813
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   814
			e = ei;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   815
			t = (a11 - e * b11) / b11;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   816
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   817
		L431:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   818
			c = (t - s * b12) * .5;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   819
			d = c * c + s * (a12 - e * b12);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   820
			if (d < 0.0) goto L480;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   821
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   822
			// Two real roots. Zero both a(en,na) and b(en,na)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   823
			e += c + Special.Sign(Math.Sqrt(d), c);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   824
			a11 -= e * b11;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   825
			a12 -= e * b12;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   826
			a22 -= e * b22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   827
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   828
			if (Math.Abs(a11) + Math.Abs(a12) < Math.Abs(a21) + Math.Abs(a22))
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   829
				goto L432;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   830
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   831
			a1 = a12;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   832
			a2 = a11;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   833
			goto L435;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   834
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   835
		L432:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   836
			a1 = a22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   837
			a2 = a21;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   838
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   839
		// Choose and apply real z
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   840
		L435:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   841
			s = Math.Abs(a1) + Math.Abs(a2);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   842
			u1 = a1 / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   843
			u2 = a2 / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   844
			r = Special.Sign(Math.Sqrt(u1 * u1 + u2 * u2), u1);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   845
			v1 = -(u1 + r) / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   846
			v2 = -u2 / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   847
			u2 = v2 / v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   848
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   849
			for (i = 0; i <= en; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   850
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   851
				t = a[i, en] + u2 * a[i, na];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   852
				a[i, en] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   853
				a[i, na] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   854
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   855
				t = b[i, en] + u2 * b[i, na];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   856
				b[i, en] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   857
				b[i, na] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   858
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   859
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   860
			if (matz)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   861
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   862
				for (i = 0; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   863
				{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   864
					t = z[i, en] + u2 * z[i, na];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   865
					z[i, en] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   866
					z[i, na] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   867
				}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   868
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   869
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   870
			if (bn == 0.0) goto L475;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   871
			if (an < System.Math.Abs(e) * bn) goto L455;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   872
			a1 = b[na, na];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   873
			a2 = b[en, na];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   874
			goto L460;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   875
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   876
		L455:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   877
			a1 = a[na, na];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   878
			a2 = a[en, na];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   879
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   880
		// Choose and apply real q
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   881
		L460:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   882
			s = System.Math.Abs(a1) + System.Math.Abs(a2);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   883
			if (s == 0.0) goto L475;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   884
			u1 = a1 / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   885
			u2 = a2 / s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   886
			r = Special.Sign(Math.Sqrt(u1 * u1 + u2 * u2), u1);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   887
			v1 = -(u1 + r) / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   888
			v2 = -u2 / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   889
			u2 = v2 / v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   890
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   891
			for (j = na; j < n; ++j)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   892
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   893
				t = a[na, j] + u2 * a[en, j];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   894
				a[na, j] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   895
				a[en, j] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   896
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   897
				t = b[na, j] + u2 * b[en, j];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   898
				b[na, j] += t * v1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   899
				b[en, j] += t * v2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   900
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   901
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   902
		L475:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   903
			a[en, na] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   904
			b[en, na] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   905
			alfr[na] = a[na, na];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   906
			alfr[en] = a[en, en];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   907
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   908
			if (b[na, na] < 0.0)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   909
				alfr[na] = -alfr[na];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   910
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   911
			if (b[en, en] < 0.0)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   912
				alfr[en] = -alfr[en];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   913
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   914
			beta[na] = (System.Math.Abs(b[na, na]));
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   915
			beta[en] = (System.Math.Abs(b[en, en]));
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   916
			alfi[en] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   917
			alfi[na] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   918
			goto L505;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   919
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   920
			// Two complex roots
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   921
		L480:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   922
			e += c;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   923
			ei = System.Math.Sqrt(-d);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   924
			a11r = a11 - e * b11;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   925
			a11i = ei * b11;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   926
			a12r = a12 - e * b12;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   927
			a12i = ei * b12;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   928
			a22r = a22 - e * b22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   929
			a22i = ei * b22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   930
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   931
			if (System.Math.Abs(a11r) + System.Math.Abs(a11i) +
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   932
				System.Math.Abs(a12r) + System.Math.Abs(a12i) <
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   933
				System.Math.Abs(a21) + System.Math.Abs(a22r)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   934
				+ System.Math.Abs(a22i))
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   935
				goto L482;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   936
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   937
			a1 = a12r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   938
			a1i = a12i;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   939
			a2 = -a11r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   940
			a2i = -a11i;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   941
			goto L485;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   942
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   943
		L482:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   944
			a1 = a22r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   945
			a1i = a22i;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   946
			a2 = -a21;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   947
			a2i = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   948
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   949
		// Choose complex z
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   950
		L485:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   951
			cz = System.Math.Sqrt(a1 * a1 + a1i * a1i);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   952
			if (cz == 0.0) goto L487;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   953
			szr = (a1 * a2 + a1i * a2i) / cz;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   954
			szi = (a1 * a2i - a1i * a2) / cz;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   955
			r = System.Math.Sqrt(cz * cz + szr * szr + szi * szi);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   956
			cz /= r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   957
			szr /= r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   958
			szi /= r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   959
			goto L490;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   960
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   961
		L487:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   962
			szr = 1.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   963
			szi = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   964
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   965
		L490:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   966
			if (an < (System.Math.Abs(e) + ei) * bn) goto L492;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   967
			a1 = cz * b11 + szr * b12;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   968
			a1i = szi * b12;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   969
			a2 = szr * b22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   970
			a2i = szi * b22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   971
			goto L495;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   972
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   973
		L492:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   974
			a1 = cz * a11 + szr * a12;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   975
			a1i = szi * a12;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   976
			a2 = cz * a21 + szr * a22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   977
			a2i = szi * a22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   978
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   979
		// Choose complex q
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   980
		L495:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   981
			cq = System.Math.Sqrt(a1 * a1 + a1i * a1i);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   982
			if (cq == 0.0) goto L497;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   983
			sqr = (a1 * a2 + a1i * a2i) / cq;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   984
			sqi = (a1 * a2i - a1i * a2) / cq;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   985
			r = System.Math.Sqrt(cq * cq + sqr * sqr + sqi * sqi);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   986
			cq /= r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   987
			sqr /= r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   988
			sqi /= r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   989
			goto L500;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   990
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   991
		L497:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   992
			sqr = 1.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   993
			sqi = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   994
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   995
		// Compute diagonal elements that would result if transformations were applied
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   996
		L500:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   997
			ssr = sqr * szr + sqi * szi;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   998
			ssi = sqr * szi - sqi * szr;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   999
			i = 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1000
			tr = cq * cz * a11 + cq * szr * a12 + sqr * cz * a21 + ssr * a22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1001
			ti = cq * szi * a12 - sqi * cz * a21 + ssi * a22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1002
			dr = cq * cz * b11 + cq * szr * b12 + ssr * b22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1003
			di = cq * szi * b12 + ssi * b22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1004
			goto L503;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1005
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1006
		L502:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1007
			i = 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1008
			tr = ssr * a11 - sqr * cz * a12 - cq * szr * a21 + cq * cz * a22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1009
			ti = -ssi * a11 - sqi * cz * a12 + cq * szi * a21;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1010
			dr = ssr * b11 - sqr * cz * b12 + cq * cz * b22;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1011
			di = -ssi * b11 - sqi * cz * b12;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1012
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1013
		L503:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1014
			t = ti * dr - tr * di;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1015
			j = na;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1016
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1017
			if (t < 0.0)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1018
				j = en;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1019
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1020
			r = Math.Sqrt(dr * dr + di * di);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1021
			beta[j] = bn * r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1022
			alfr[j] = an * (tr * dr + ti * di) / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1023
			alfi[j] = an * t / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1024
			if (i == 0) goto L502;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1025
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1026
		L505:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1027
			isw = 3 - isw;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1028
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1029
		L510:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1030
			;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1031
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1032
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1033
		b[n - 1, 0] = epsb;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1034
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1035
		return 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1036
	}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1037
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1038
	/// <summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1039
	///   Adaptation of the original Fortran QZVEC routine from EISPACK.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1040
	/// </summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1041
	/// <remarks>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1042
	///   This subroutine is the optional fourth step of the qz algorithm
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1043
	///   for solving generalized matrix eigenvalue problems,
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1044
	///   siam j. numer. anal. 10, 241-256(1973) by moler and stewart.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1045
	///  
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1046
	///   This subroutine accepts a pair of real matrices, one of them in
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1047
	///   quasi-triangular form (in which each 2-by-2 block corresponds to
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1048
	///   a pair of complex eigenvalues) and the other in upper triangular
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1049
	///   form.  It computes the eigenvectors of the triangular problem and
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1050
	///   transforms the results back to the original coordinate system.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1051
	///   it is usually preceded by  qzhes,  qzit, and	qzval.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1052
	///  
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1053
	///   For the full documentation, please check the original function.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1054
	/// </remarks>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1055
	private static int qzvec(int n, double[,] a, double[,] b, double[] alfr, double[] alfi, double[] beta, double[,] z)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1056
	{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1057
		int i, j, k, m;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1058
		int na, ii, en, jj, nn, enm2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1059
		double d, q;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1060
		double r = 0, s = 0, t, w, x = 0, y, t1, t2, w1, x1 = 0, z1 = 0, di;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1061
		double ra, dr, sa;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1062
		double ti, rr, tr, zz = 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1063
		double alfm, almi, betm, almr;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1064
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1065
		double epsb = b[n - 1, 0];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1066
		int isw = 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1067
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1068
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1069
		// for en=n step -1 until 1 do --
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1070
		for (nn = 0; nn < n; ++nn)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1071
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1072
			en = n - nn - 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1073
			na = en - 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1074
			if (isw == 2) goto L795;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1075
			if (alfi[en] != 0.0) goto L710;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1076
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1077
			// Real vector
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1078
			m = en;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1079
			b[en, en] = 1.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1080
			if (na == -1) goto L800;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1081
			alfm = alfr[m];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1082
			betm = beta[m];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1083
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1084
			// for i=en-1 step -1 until 1 do --
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1085
			for (ii = 0; ii <= na; ++ii)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1086
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1087
				i = en - ii - 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1088
				w = betm * a[i, i] - alfm * b[i, i];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1089
				r = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1090
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1091
				for (j = m; j <= en; ++j)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1092
					r += (betm * a[i, j] - alfm * b[i, j]) * b[j, en];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1093
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1094
				if (i == 0 || isw == 2)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1095
					goto L630;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1096
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1097
				if (betm * a[i, i - 1] == 0.0)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1098
					goto L630;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1099
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1100
				zz = w;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1101
				s = r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1102
				goto L690;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1103
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1104
			L630:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1105
				m = i;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1106
				if (isw == 2) goto L640;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1107
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1108
				// Real 1-by-1 block
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1109
				t = w;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1110
				if (w == 0.0)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1111
					t = epsb;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1112
				b[i, en] = -r / t;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1113
				goto L700;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1114
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1115
			// Real 2-by-2 block
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1116
			L640:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1117
				x = betm * a[i, i + 1] - alfm * b[i, i + 1];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1118
				y = betm * a[i + 1, i];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1119
				q = w * zz - x * y;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1120
				t = (x * s - zz * r) / q;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1121
				b[i, en] = t;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1122
				if (Math.Abs(x) <= Math.Abs(zz)) goto L650;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1123
				b[i + 1, en] = (-r - w * t) / x;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1124
				goto L690;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1125
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1126
			L650:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1127
				b[i + 1, en] = (-s - y * t) / zz;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1128
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1129
			L690:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1130
				isw = 3 - isw;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1131
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1132
			L700:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1133
				;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1134
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1135
			// End real vector
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1136
			goto L800;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1137
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1138
		// Complex vector
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1139
		L710:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1140
			m = na;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1141
			almr = alfr[m];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1142
			almi = alfi[m];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1143
			betm = beta[m];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1144
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1145
			// last vector component chosen imaginary so that eigenvector matrix is triangular
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1146
			y = betm * a[en, na];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1147
			b[na, na] = -almi * b[en, en] / y;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1148
			b[na, en] = (almr * b[en, en] - betm * a[en, en]) / y;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1149
			b[en, na] = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1150
			b[en, en] = 1.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1151
			enm2 = na;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1152
			if (enm2 == 0) goto L795;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1153
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1154
			// for i=en-2 step -1 until 1 do --
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1155
			for (ii = 0; ii < enm2; ++ii)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1156
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1157
				i = na - ii - 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1158
				w = betm * a[i, i] - almr * b[i, i];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1159
				w1 = -almi * b[i, i];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1160
				ra = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1161
				sa = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1162
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1163
				for (j = m; j <= en; ++j)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1164
				{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1165
					x = betm * a[i, j] - almr * b[i, j];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1166
					x1 = -almi * b[i, j];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1167
					ra = ra + x * b[j, na] - x1 * b[j, en];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1168
					sa = sa + x * b[j, en] + x1 * b[j, na];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1169
				}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1170
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1171
				if (i == 0 || isw == 2) goto L770;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1172
				if (betm * a[i, i - 1] == 0.0) goto L770;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1173
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1174
				zz = w;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1175
				z1 = w1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1176
				r = ra;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1177
				s = sa;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1178
				isw = 2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1179
				goto L790;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1180
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1181
			L770:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1182
				m = i;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1183
				if (isw == 2) goto L780;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1184
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1185
				// Complex 1-by-1 block
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1186
				tr = -ra;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1187
				ti = -sa;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1188
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1189
			L773:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1190
				dr = w;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1191
				di = w1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1192
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1193
				// Complex divide (t1,t2) = (tr,ti) / (dr,di)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1194
			L775:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1195
				if (Math.Abs(di) > Math.Abs(dr)) goto L777;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1196
				rr = di / dr;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1197
				d = dr + di * rr;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1198
				t1 = (tr + ti * rr) / d;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1199
				t2 = (ti - tr * rr) / d;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1200
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1201
				switch (isw)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1202
				{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1203
					case 1: goto L787;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1204
					case 2: goto L782;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1205
				}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1206
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1207
			L777:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1208
				rr = dr / di;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1209
				d = dr * rr + di;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1210
				t1 = (tr * rr + ti) / d;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1211
				t2 = (ti * rr - tr) / d;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1212
				switch (isw)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1213
				{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1214
					case 1: goto L787;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1215
					case 2: goto L782;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1216
				}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1217
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1218
			   // Complex 2-by-2 block
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1219
			L780:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1220
				x = betm * a[i, i + 1] - almr * b[i, i + 1];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1221
				x1 = -almi * b[i, i + 1];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1222
				y = betm * a[i + 1, i];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1223
				tr = y * ra - w * r + w1 * s;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1224
				ti = y * sa - w * s - w1 * r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1225
				dr = w * zz - w1 * z1 - x * y;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1226
				di = w * z1 + w1 * zz - x1 * y;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1227
				if (dr == 0.0 && di == 0.0)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1228
					dr = epsb;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1229
				goto L775;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1230
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1231
			L782:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1232
				b[i + 1, na] = t1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1233
				b[i + 1, en] = t2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1234
				isw = 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1235
				if (Math.Abs(y) > Math.Abs(w) + Math.Abs(w1))
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1236
					goto L785;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1237
				tr = -ra - x * b[(i + 1), na] + x1 * b[(i + 1), en];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1238
				ti = -sa - x * b[(i + 1), en] - x1 * b[(i + 1), na];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1239
				goto L773;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1240
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1241
			L785:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1242
				t1 = (-r - zz * b[(i + 1), na] + z1 * b[(i + 1), en]) / y;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1243
				t2 = (-s - zz * b[(i + 1), en] - z1 * b[(i + 1), na]) / y;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1244
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1245
			L787:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1246
				b[i, na] = t1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1247
				b[i, en] = t2;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1248
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1249
			L790:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1250
				;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1251
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1252
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1253
			// End complex vector
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1254
		L795:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1255
			isw = 3 - isw;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1256
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1257
		L800:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1258
			;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1259
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1260
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1261
		// End back substitution. Transform to original coordinate system.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1262
		for (jj = 0; jj < n; ++jj)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1263
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1264
			j = n - jj - 1;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1265
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1266
			for (i = 0; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1267
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1268
				zz = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1269
				for (k = 0; k <= j; ++k)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1270
					zz += z[i, k] * b[k, j];
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1271
				z[i, j] = zz;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1272
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1273
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1274
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1275
		// Normalize so that modulus of largest component of each vector is 1.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1276
		// (isw is 1 initially from before)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1277
		for (j = 0; j < n; ++j)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1278
		{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1279
			d = 0.0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1280
			if (isw == 2) goto L920;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1281
			if (alfi[j] != 0.0) goto L945;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1282
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1283
			for (i = 0; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1284
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1285
				if ((Math.Abs(z[i, j])) > d)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1286
					d = (Math.Abs(z[i, j]));
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1287
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1288
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1289
			for (i = 0; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1290
				z[i, j] /= d;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1291
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1292
			goto L950;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1293
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1294
		L920:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1295
			for (i = 0; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1296
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1297
				r = System.Math.Abs(z[i, j - 1]) + System.Math.Abs(z[i, j]);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1298
				if (r != 0.0)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1299
				{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1300
					// Computing 2nd power
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1301
					double u1 = z[i, j - 1] / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1302
					double u2 = z[i, j] / r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1303
					r *= Math.Sqrt(u1 * u1 + u2 * u2);
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1304
				}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1305
				if (r > d)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1306
					d = r;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1307
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1308
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1309
			for (i = 0; i < n; ++i)
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1310
			{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1311
				z[i, j - 1] /= d;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1312
				z[i, j] /= d;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1313
			}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1314
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1315
		L945:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1316
			isw = 3 - isw;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1317
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1318
		L950:
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1319
			;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1320
		}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1321
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1322
		return 0;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1323
	}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1324
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1325
	#endregion
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1326
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1327
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1328
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1329
	#region ICloneable Members
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1330
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1331
	private GeneralizedEigenvalueDecomposition()
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1332
	{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1333
	}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1334
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1335
	/// <summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1336
	///   Creates a new object that is a copy of the current instance.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1337
	/// </summary>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1338
	/// <returns>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1339
	///   A new object that is a copy of this instance.
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1340
	/// </returns>
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1341
	public object Clone()
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1342
	{
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1343
		var clone = new GeneralizedEigenvalueDecomposition();
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1344
		clone.ai = (double[])ai.Clone();
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1345
		clone.ar = (double[])ar.Clone();
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1346
		clone.beta = (double[])beta.Clone();
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1347
		clone.n = n;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1348
		clone.Z = (double[,])Z.Clone();
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1349
		return clone;
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1350
	}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1351
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1352
	#endregion
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1353
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1354
}
4b7486d77b39 V6.0 release candidate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
  1355