100分 用雅可比求实对称矩阵的特征值和特征向量
public int jcbi(Double[,] A, int n, Double[,] v, Double eps,int jt)//A存放n阶实对称矩阵,返回时对角线上存放n个特征值,n实对称矩阵A的阶数,V[n,n]返回特征向量,eps控制精度要求,jt控制最大迭代次数, int jcbi()方法返回标志值
{
int i, j, p, q, u, w, t, s, l;
p = 0; q = 0;
Double fm, cn, sn, omega, x, y, d;
l = 1;
for (i = 0; i <= n - 1; i++)
{
v[i,i] = 1.0;
for (j = 0; j <= n - 1; j++)
{
if (i != j) v[i ,j] = 0.0;
}
}
while (l == 1)
{
fm = 0.0;
for (i = 1; i <= n - 1; i++)
{
for (j = 0; j <= i - 1; j++)
{
d = Math.Abs(A[i, j]);
if ((i != j) && (d > fm))
{
fm = d; p = i; q = j;
}
}
}
if (fm < eps) return 1;
if (l > jt) return -1;
l = l + 1;
u = p * n + q;
w = p * n + p;
t = q * n + p;
s = q * n + q;
x =0-A[p,q];
y = (A[q,q] - A[p,p])/2.0;
omega = x / Math.Sqrt(x * x + y * y);
if (y < 0.0) omega = 0-omega;
sn = 1.0 + Math.Sqrt(1.0 - omega * omega);
sn = omega / Math.Sqrt(2.0 * sn);
cn = Math.Sqrt(1.0 - sn * sn);
fm = A[p,p];
A[p,p] = fm * cn * cn + A[q,q] * sn * sn + A[p,q] * omega;
A[q,q] = fm * sn * sn + A[q,q] * cn * cn - A[p,q] * omega;
A[p,q] = 0.0;
A[q,p] = 0.0;
for (j = 0; j <= n - 1; j++)
{
if ((j != p) && (j != q))
{
u = p * n + j;
w = q * n + j;
fm = A[p,j];
A[p,j] = fm * cn + A[q,j] * sn;
A[q,j] = -fm * sn + A[q,j] * cn;
}
}
for (i = 0; i <= n - 1; i++)
{
if ((i != p) && (i != q))
{
u = i * n + p;
w = i * n + q;
fm = A[i,p];
A[i,p] = fm * cn + A[i,q] * sn;
A[i,q] = -fm * sn + A[i,q] * cn;
}
}
for(i=0;i<=n-1;i++)
{
u=i*n+p;
w=i*n+q;
fm=v[i,p];
v[i,p]=fm*cn+v[i,q]*sn;
v[i,q]=-fm*sn+v[i,q]*cn;
}
}
return 1;
}
这是从徐士良书上改编成C#的,不知道哪里有错,哪位高手帮我看一下