#include<iostream>
using namespace std;
double test(double a, double b) //定义函数。求c=-sgn(A[r][r])d
{
double c;
if (a > 0)
{
c = -b;
}
else if (a == 0)
{
c = b;
}
else
{
c = b;
}
return c;
}
void Hessenberg(double A[10][10]) //以下为矩阵的拟上三角化An-1
{
int i, j, r;
double d = 0, c, h, t, v[10]{}, u[10]{}, p[10]{}, qT[10]{};//避免矩阵之间相乘,设定向量与矩阵相乘
//其中qT为行向量,其余为列向量
for (r = 0; r < 8; r++) //最外层大循环,循环8次
{
for (i = 0; i < 10; i++)
{
if (i < r + 1) { v[i] = 0; }
else { v[i] = A[i][r]; }
d += v[i] * v[i];
}
d = sqrt(d); //计算v[10]的模长
c = test(A[r + 1][r], d);
for (i = 0; i < 10; i++) //计算u[10]
{
if (i < r + 1) { u[i] = 0; }
else if (i = r + 1) { u[i] = A[i][r] - c; }
else { u[i] = A[i][r]; }
}
h = c * c - c * A[r + 1][r];//计算u[10]T*u[10]/2
for (i = 0; i < 10; i++)// p[10]=A[10][10]*u[10]/h
{
for (j = 0; j < 10; j++)
{
p[i] += A[i][j] * u[j];
}
p[i] = p[i] / h;
}
for (i = 0; i < 10; i++)//qT[10]=u[10]T*A[10][10]/h 。qT[10]为行向量
{
for (j = 0; j < 10; j++)
{
qT[i] += u[j] * A[j][i];
}
qT[i] = qT[i] / h;
}
t = 0;
for (i = 0; i < 10; i++) // t=u[10]T*A[10][10]*u[10]/h^2
{
t += u[i] * p[i];
}
t = t / h; //t是一个数
//计算Ar + 1;
for (i = 0; i < 10; i++) // Ar+1=Ar-(p*uT)-(u*qT)+(t*u*uT)
{
for (j = 0; j < 10; j++)
{
A[i][j] = A[i][j] - p[i] * u[j] - u[i] * qT[j] + t * u[i] * u[j];
}
}
}
}//拟上三角化
int main()
{
double arr[10][10]{};
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (i != j)
{
arr[i][j] = sin((0.5 * ((double)i + 1) + 0.2 * ((double)j + 1)));
}
else
{
arr[i][j] = 1.52 * cos((((double)i + 1) + 1.2 * ((double)j + 1)));
}
}
}//输入矩阵
Hessenberg(arr);
printf("输出拟上三角A(n-1)为:\n");
for(int i=0;i<10;i++)
{
for (int j = 0; j < 10; j++)
{
printf("%.12f", arr[i][j]);
}
}
fflush(stdout);
system("pause");
return 0;
}