C#,码海拾贝(33)——约化“一般实矩阵”为“赫申伯格矩阵”的“初等相似变换法”之C#源代码,《C#数值计算算法编程》源代码升级改进版
// C#码海拾贝(33)——约化“一般实矩阵”为“赫申伯格矩阵”的“初等相似变换法”
using System;
class Program{
static void Main()
{
// 定义一个3x3的一般实矩阵 double[,] A = { {1,2,3 }, {4,5,6 }, {7,8,9 } };
// 调用函数将A约化为赫申伯格矩阵 Hessenberg(A);
// 打印约化后的赫申伯格矩阵 Console.WriteLine("赫申伯格矩阵:");
for (int i =0; i < A.GetLength(0); i++)
{
for (int j =0; j < A.GetLength(1); j++)
{
Console.Write(A[i, j] + " ");
}
Console.WriteLine();
}
}
// 初等相似变换法将一般实矩阵约化为赫申伯格矩阵 static void Hessenberg(double[,] A)
{
int n = A.GetLength(0);
for (int k =0; k < n -2; k++)
{
// 计算Householder变换矩阵 double[] v = new double[n - k -1];
double beta =0;
for (int i = k +1; i < n; i++)
{
v[i - k -1] = A[i, k];
beta += v[i - k -1] * v[i - k -1];
}
beta = Math.Sqrt(beta);
if (v[k +1] >0)
{
beta = -beta;
}
v[k +1] -= beta;
// 应用Householder变换矩阵 for (int j = k +1; j < n; j++)
{
double gamma =0;
for (int i = k +1; i < n; i++)
{
gamma += v[i - k -1] * A[i, j];
}
gamma /= beta;
for (int i = k +1; i < n; i++)
{
A[i, j] -= gamma * v[i - k -1];
}
for (int i =0; i < n; i++)
{
gamma =0;
for (int j = k +1; j < n; j++)
{
gamma += A[i, j] * v[j - k -1];
}
gamma /= beta;
for (int j = k +1; j < n; j++)
{
A[i, j] -= gamma * v[j - k -1];
}
}
}
}
}
}
//本程序实现了初等相似变换法将一般实矩阵约化为赫申伯格矩阵的功能。通过计算Householder变换矩阵和应用Householder变换矩阵,可以将一般实矩阵约化为赫申伯格矩阵。