0;i--)
{
temp=0;
for(t=i+1;t<=min(i+S,N);t++)
temp+=A[i-t+S][t-1]*u[t-1];
u[i-1]=(y[i-1]-temp)/A[S][i-1];
}
}
double Det_matrix()//求矩阵行列式值
{
int i;
double det=1;
Init_matrix_A();
Resolve_LU();
for(i=0;i>>λi%d=%.13e\n",k,k,value_s);
}
}
void main()
{
float cond;
double value_det;
printf("Contact me: [email protected]\n");
Init_matrix_A();//初始化矩阵A
The_value();//获取绝对值最大的特征值λ_501
The_Other_value();//获取特征值λ_1
printf("λ1=%.13e\n",value_1);
printf("λ501=%.13e\n",value_N);
value_det=Det_matrix();//求矩阵行列式值
Value_min();//反幂法求绝对值最小的特征值
printf("λs=%.13e\n",value_s);
cond=Get_cond_A();//求矩阵条件数
Value_translation_min();//偏移条件下反幂法求特征值
printf("cond_A=%.13e\n",cond);
printf("value_det=%.13e\n",value_det);
}
3、程序运行结果:
4、迭代初始向量的选取对计算结果的影响:
本次计算实习求矩阵A的具有某些特征的特征值,主要用到的方法是幂法和反幂法,这两种方法从原理上看都是迭代法,因此迭代初始向量的选择对计算结果会产生一定影响,主要表现在收敛速度上。
通过实际调试发现,对某些特殊的迭代初始值,确实对收敛结果及收敛速度产生影响,具体如下所列:
以下结论建立在float数据类型基础之上;
1.迭代初始值u[i]=c(i=1,2,…,501)且c的绝对值值极大(例如1.0e12以上),收敛结果可以稳定但收敛速度减慢,其原因为c的数量级与矩阵A中元素数量级差距过大,导致迭代次数以及运算量增大;
2.迭代初始值u[i]=c(i=1,2,…,501)且c的绝对值值极小(例如1.0e-12以下),收敛结果并不稳定,且收敛速度减慢,其原因是计算机舍入误差将会影响计算结果;
3.迭代初始值u[i] (i=1,2,…,501)之间数量级偏差很大(例如1.0e12倍以上),收敛结果亦不稳定,且收敛速度减慢,其原因是人为使迭代过程中的权重发生较大区别,使迭代复杂化。
结论,对于迭代初始值的选取应尽量与矩阵A中元素数量级保持相近,且应保证相近的数量级。
PS:Further details please Contact me: [email protected]
2011-11-15