数值分析之幂法及反幂法C语言程序实例

合集下载

幂法与反幂法

幂法与反幂法

幂法与反幂法1 功能 幂法是一种计算矩阵主特征值(矩阵按模最大的特征值)及对应特征向量的迭代方法, 特别是用于大型稀疏矩阵。

反幂法用来计算矩阵按模最小的特征值及其特征向量,也可用来计算对应与一个给定近似特征值的特征向量。

2算法描述2.1 幂法(1)取初始向量u)0((例如取u )0(=(1,1,…1)T ),置精度要求ε,置k=1. (2)计算v )(k =Au )1(-k ,m k =max(v )(k ), u )(k = v )(k / m k(3)若| m k = m 1-k |<ε,则停止计算(m k 作为绝对值最大特征值1λ,u)(k 作为相应的特征向量)否则置k=k+1,转(2) 2.2 反幂法(1)取初始向量u )0((例如取u )0(=(1,1,…1)T),置精度要求ε,置k=1. (2)对A 作LU 分解,即A=LU(3)解线性方程组 Ly)(k =u )1(-k ,Uv )(k =y )(k (4)计算m k =max(v )(k ), u )(k = v )(k / m k(5)若|m k =m 1-k |<ε,则停止计算(1/m k 作为绝对值最小特征值n λ,u)(k 作为相应的特征向量);否则置k=k+1,转(3).3 Matlab 程序的实现3.1 幂法function [m,u]=pow(A,ep,N)%A 为矩阵;ep 为精度要求;N 为最大迭代次数;m 为绝对值最大的特征值;u 为对应最大特征值的特征向量。

N=100;ep=1e-6;n=length(A);u=ones(n,1);index=0;k=0;m1=0;while k<=Nv=A*u;[vmax,i]=max(abs(v));m=v(i);u=v/m;if abs(m-m1)<epindex=1;break;endm1=m;k=k+1;end输入:A=[7 3 -2;3 4 -1;-2 -1 3];[m,u]=pow(A,1e-6) Enter结果:m = 9.6056u =1.00000.6056-0.39444.2 反幂法function[m ,u]=pow_inv(A,ep,N)%A为矩阵;ep为精度要求;N为最大迭代次数;m为绝对值最大的特征值;u为对应最大特征值的特征向量。

数值分析幂法和反幂法

数值分析幂法和反幂法

数值分析幂法和反幂法数值分析中的幂法和反幂法是求解矩阵最大特征值和最小特征值的常用方法。

这两种方法在许多数值计算问题中都有着广泛的应用,包括图像压缩、数据降维、谱聚类等。

幂法(Power Method)是一种迭代算法,通过不断迭代矩阵与一个向量的乘积,来逼近原矩阵的最大特征值和对应的特征向量。

其基本思想是,对于一个矩阵A和一维向量x,可以通过不断迭代计算Ax,Ax,Ax...,来使得向量x逼近最大特征值对应的特征向量。

具体的迭代过程如下:1.初始化一个向量x0(可以是单位向量或任意非零向量)2.令x1=Ax0,对向量进行归一化(即除以向量的范数)得到x13.重复步骤2,即令x2=Ax1,x3=Ax2...,直到收敛(即相邻迭代向量的差的范数小于一些阈值)为止4. 最终得到的向量xn就是A的最大特征值对应的特征向量在实际求解时,我们可以将迭代过程中的向量进行归一化,以防止数值溢出或下溢。

此外,为了提高迭代速度,我们可以选择使得xn与xn-1的内积大于0的方向作为迭代方向,这样可以使得特征值的模快速收敛到最大特征值。

幂法的收敛性是保证的,但收敛速度可能较慢,尤其是当最大特征值与其他特征值非常接近时。

此时可能需要使用一些改进的方法来加速收敛,例如Rayleigh商或位移策略。

相反,反幂法(Inverse Power Method)是求解矩阵的最小特征值和对应的特征向量的方法。

它的基本思想和幂法类似,但在每次迭代中,需要计算A和依其逆矩阵A-1的乘积。

迭代过程如下:1.初始化一个向量x0(可以是单位向量或任意非零向量)2.令x1=A-1x0,对向量进行归一化(即除以向量的范数)得到x13.重复步骤2,即令x2=A-1x1,x3=A-1x2...4. 最终得到的向量xn就是A的最小特征值对应的特征向量反幂法和幂法的区别在于迭代过程中乘以了A的逆矩阵,从而可以利用矩阵的特殊结构或性质来提高迭代速度。

同时,在实际求解时,可能需要将矩阵进行一些变换,以确保A-1存在或数值稳定性。

幂法及反幂法

幂法及反幂法

v2
Au1
A2v0 max(Av0 )
,
vk
Auk 1
maxA(Akvk01v0 )
,
v0 0
u1
u2
uk
(且1 0)
规范 化
u2
v1 Av0
max( v1 ) v2
max( v2 )
mmaaxAx((2AAv02vv00))
vk max(vk
)
Ak
nxnn) nxn 1
Ax1
2 Ax2
n
Axn
且其从1 x收中而1。当由说敛k假kl明速ki=m设2,度(,(3当由2,(1i2…k比).充k121值))时分k 0xr式,大2(vik|时| 1k1k[2121,A(,|确|v 1k有x|1定11,xnn2v(1。)k1kA,|k2n1所v即(0)k以1211xk)xkl|nk有i11m,x)n122k或|x,kkl1得imv0k1k|v,2越k1k n21ni来k(|x2越n11n11))kx接k(x1xin近n]2特,n(2征(,n.n2k4向)x.)3n )量)
结论:
定理 8 (1)设 A Rnn 有n个线性无关的特征向量; (2)设A特征值满足 | 1 || 2 | | n |, 且 Axi i xi (i 1,,n); (3){uk } 及 {vk }由改进幂法得到的规范化向量序列及迭代向量
序列((2.7)式),则有
(a)
lim
k
uk
x1 ; max( x1 )
,对应特征向量为
xi
(i
1,,
n),
xn } 线性无关。求矩阵A的主特
征值及对应的特征向量。 幂法的基本思想: 任取一个非零初始向量

4.2乘幂法和反乘幂法

4.2乘幂法和反乘幂法
(k )
2
k 2
rj cos( (k 2) )
再利用三角函数运算性质以及 1 , 2 复数表示,不难验证
xj

( k 2)
(1 2 ) x j
( k 1)
12 x j
(k )
0
p (1 2 )
q 12
由方程组
xj
( k 2)
k 1 k
(k )
[1v1 (1) 2v2 ]
(k ) k 1 1 1 1 k 1 k 1 1
x 1 x 2 v ( k 1) (k ) x 1 x 2 (1) 2v2
( k 1)
x( k 1) 1 x( k ) 当k无穷大时,可以用
n
必有
故只要k充分大,
(k )
x
[1v1 k ] 1v1
k 1 k 1
(k )
可把x 作为与1相应的特征向量 的近似。
由x
(k )
(1v1 k )
k 1
k
及 lim k 0
lim
k
x
(k ) k 1

1v1
即表明序列
x
(k ) k 1

越来越接近A的对应于
1的特征向量,也即当k 时
x
(k )
1 v1
k 1
主 特 征 值
1 ?(如何算)
由 x
( k 1)
v , 及 x
k 1 1 1 1
(k )
1v1
k 1
x 1 x
xi
(k )
( k 1) i (k ) i
(i 1, 2,...n)

幂法反幂法求解矩阵最大最小特征值及其对应的特征向量

幂法反幂法求解矩阵最大最小特征值及其对应的特征向量

幂法反幂法求解矩阵最大最小特征值及其对应的特征向量幂法和反幂法是求解矩阵最大最小特征值及其对应特征向量的常用方法。

在本文中,我们将详细介绍这两种方法的原理和具体实现。

一、幂法(Power Method)幂法是一种迭代算法,用于求解矩阵的最大特征值及其对应的特征向量。

其基本思想是通过多次迭代得到矩阵的一个特征值和特征向量的近似值,并使其逼近真实值。

幂法的原理如下:1.初始化一个非零向量b0作为初始特征向量;2.计算b0的归一化向量b0/,b0,得到新的向量b1;3.计算矩阵A和向量b1的乘积Ab1,得到新的向量b2;4.对b2进行归一化,得到新的向量b3;5.重复步骤3和步骤4,直到b的变化趋于稳定;6.计算矩阵A和向量b的乘积Ab,得到新的向量b;7.特征值的近似值λ=,Ab,/,b。

具体实现如下:1.初始化一个非零向量b0;2.迭代n次进行如下操作:a. 计算bn=A*bn-1;b. 将bn进行归一化,得到bn=bn/,bn;3. 计算特征值的近似值lambda=,A*bn,/,bn;4. 特征向量的近似值vbn=bn。

幂法的优点是计算简单、迭代次数少,但对于含有多个特征值接近的矩阵,可能会收敛到次大特征值。

二、反幂法(Inverse Power Method)反幂法是幂法的拓展,用于求解矩阵的最小特征值及其对应的特征向量。

其基本思想是通过多次迭代得到矩阵的一个特征值和特征向量的近似值,并使其逼近真实值。

反幂法的原理如下:1.初始化一个非零向量b0作为初始特征向量;2.计算b0的归一化向量b0/,b0,得到新的向量b1;3.计算矩阵A的逆矩阵Ai和向量b1的乘积Ai*b1,得到新的向量b2;4.对b2进行归一化,得到新的向量b3;5.重复步骤3和步骤4,直到b的变化趋于稳定;6.计算矩阵A的逆矩阵Ai和向量b的乘积Ai*b,得到新的向量b;7.特征值的近似值λ=,Ai*b,/,b。

具体实现如下:1.初始化一个非零向量b0;2.迭代n次进行如下操作:a. 计算bn=inv(A)*bn-1;b. 将bn进行归一化,得到bn=bn/,bn;3. 计算特征值的近似值lambda=,inv(A)*bn,/,bn;4. 特征向量的近似值vbn=bn。

《幂法和反幂法》课件

《幂法和反幂法》课件

应用范围比较
总结词
幂法适用于求解特征值和特征向量,而反幂法适用于求解线性方程组和最小二 乘问题。
详细描述
幂法主要用于求解特征值和特征向量,在物理、工程和科学计算等领域有广泛 应用。反幂法适用于求解线性方程组和最小二乘问题,在统计学、机器学习和 数据分析等领域有广泛应用。
优缺点比较
总结词
幂法的优点在于能够求解特征值和特征向量,但缺点是计算复杂度高;反幂法的优点在于计算复杂度低,但缺点 是可能存在数值不稳定性。
幂法的性质
01
02
03
幂法具有高效性
相对于直接计算矩阵的幂 ,幂法可以大大减少计算 量和存储空间。
幂法具有收敛性
在适当的条件下,幂法能 够收敛到正确的矩阵幂的 结果。
幂法具有稳定性
在计算过程中,幂法能够 保持数值的稳定性,避免 误差的累积。
幂法的应用场景
数值分析
用于求解线性方程组、特 征值问题等数值计算问题 。
详细描述
幂法的优点在于能够精确求解特征值和特征向量,适用于需要高精度计算的情况。然而,由于其计算复杂度高, 对于大规模数据集可能效率较低。反幂法的优点在于计算复杂度相对较低,适用于处理大规模数据集。然而,反 幂法可能存在数值不稳定性,对于某些问题可能需要额外的数值稳定化技术。
04
幂法和反幂法的实现
05
幂法和反幂法的应用实 例
幂法在密码学中的应用
加密算法
幂法常被用于构造加密算法,如RSA算法。通过使用幂法,可以 快速地计算大数的幂次,从而实现高效的加密和解密过程。
密钥交换
在Diffie-Hellman密钥交换协议中,幂法被用于生成共享密钥,确 保通信双方安全地交换密钥。
数字签名

c语言n的幂次方表示

c语言n的幂次方表示n的幂次方是指n与自身连乘的结果。

在C语言中,可以使用循环结构和变量来实现n的幂次方运算。

下面将介绍如何使用C语言实现n的幂次方运算,并给出代码示例。

我们需要定义一个函数来计算n的幂次方。

函数的定义如下:```cdouble power(double n, int exp) {double result = 1.0;int i;for (i = 0; i < exp; i++) {result *= n;}return result;}```上述函数定义了一个名为power的函数,接受两个参数:n和exp。

其中,n为底数,exp为指数。

函数内部使用一个循环结构来实现连乘运算,循环的次数为指数exp的值。

每次循环都将底数n与结果result相乘,并将结果赋值给result。

接下来,我们可以在主函数中调用power函数来计算n的幂次方。

代码示例如下:```c#include <stdio.h>int main() {double n;int exp;printf("请输入底数n:");scanf("%lf", &n);printf("请输入指数exp:");scanf("%d", &exp);double result = power(n, exp);printf("%.2lf的%d次幂为%.2lf\n", n, exp, result);return 0;}```上述代码中,首先定义了两个变量n和exp,用于存储用户输入的底数和指数。

然后,通过调用power函数来计算n的幂次方,并将结果赋值给result变量。

最后,使用printf函数将计算结果输出到屏幕上。

在程序运行时,用户需要输入底数n和指数exp。

程序将根据用户的输入计算n的幂次方,并将结果输出到屏幕上。

c语言幂次方

c语言幂次方C语言幂次方C语言是一种高级编程语言,它是一种通用编程语言,被广泛用于系统和应用程序的开发。

在C语言中,幂次方是常用的数学运算之一,在数学中用符号x的n次方表示,而在C语言中,需要使用另外的语法来表示幂次方。

C语言中表示幂次方的关键字是“^”,即一个数的n次方可以使用“x^n”的形式来表达,其中x为底数,n为指数。

例如,2的3次方可以表示为“2^3”,即。

int a = 2;int b = 3;int result = pow(a,b);在这个例子中,使用了C语言中的pow函数来计算2的3次方。

其中,pow函数是C语言中提供的一个数学函数,用于计算一个数的幂次方。

它的参数是底数和指数,返回值是幂次方运算的结果。

在这个例子中,使用了变量a和b来分别存储底数和指数,并将计算结果存储到变量result中,最终输出结果就是8。

除了pow函数之外,C语言中还有其他计算幂次方的方法,例如使用循环来实现幂次方运算。

int power(int x, int n) {int result = 1;for (int i = 0; i < n; i++) {result *= x;}return result;}在这个例子中,定义了一个名为power的函数,它接受两个参数,分别是底数x和指数n。

在函数中,使用for循环来累乘x,即实现了x 的n次方运算,最终将结果存储到变量result中并返回该值。

使用循环计算幂次方的方法不仅可以帮助我们更好地理解数学上的幂次方定义,还可以使代码更加清晰易懂,以及更加灵活地应对各种复杂情况。

总结在C语言中,幂次方是常用的数学运算之一,使用关键字“^”来表示。

C语言中提供了pow函数来计算幂次方,还可以使用for循环等方法来实现幂次方运算。

计算幂次方是程序开发中常见的数学运算,掌握好幂次方的计算方法可以帮助我们更好地解决实际问题。

北航数值分析-lec7-幂法和反幂法

线性方程组求解
迭代收敛性
反幂法在求解特征值问题中的应用
特征值问题
反幂法主要用于求解矩阵的特征值和特征向量问题。通过迭代过程,反幂法能够找到矩阵的所有特征 值和对应的特征向量。
数值稳定性
反幂法在求解特征值问题时,需要关注数值稳定性问题。由于计算机浮点运算的误差累积,反幂法可 能会产生数值不稳定的解。因此,需要采取适当的策略来提高数值稳定性。
误差分析比较
幂法
由于幂法是通过连续的矩阵乘法来计算矩阵的幂,因此误差会随着计算的次数逐渐 累积。为了减小误差,需要选择合适的计算精度和减少计算次数。
反幂法
反幂法是通过求解线性方程组来计算矩阵的逆和行列式,因此误差主要来自于线性 方程组的求解精度。为了减小误差,需要选择合适的求解方法和提高求解精度。
202X
北航数值分析-lec7-幂法 和反幂法
单击此处添加副标题内容
汇报人姓名 汇报日期
目 录幂法介绍Fra bibliotek反幂法介绍
幂法和反幂法的比较
幂法和反幂法的实现细节
幂法和反幂法的实际应用案例
单击此处输入你的正文,文字是
您思想的提炼,请尽量言简意赅
的阐述观点
contents
单击此处输入你的正文,文字是 您思想的提炼,请尽量言简意赅 的阐述观点
反幂法的实现细节
反幂法是一种迭代算法,用 于求解线性方程组的近似逆。
反幂法的收敛速度取决于矩阵的谱 半径,如果矩阵的谱半径较小,则 反幂法收敛速度较快。
ABCD
反幂法的实现步骤包括:选择初始 矩阵、计算迭代矩阵、更新解矩阵 和判断收敛性。
在实际应用中,反幂法通常用于 求解大规模稀疏线性系统的预处 理和后处理问题。
01

北航数值分析计算实习题目一 幂法 反幂法 求矩阵特征值

《数值分析》计算实习题目第一题:1. 算法设计方案(1)1λ,501λ和s λ的值。

1)首先通过幂法求出按模最大的特征值λt1,然后根据λt1进行原点平移求出另一特征值λt2,比较两值大小,数值小的为所求最小特征值λ1,数值大的为是所求最大特征值λ501。

2)使用反幂法求λs ,其中需要解线性方程组。

因为A 为带状线性方程组,此处采用LU 分解法解带状方程组。

(2)与140k λλμλ-5011=+k 最接近的特征值λik 。

通过带有原点平移的反幂法求出与数k μ最接近的特征值 λik 。

(3)2cond(A)和det A 。

1)1=nλλ2cond(A),其中1λ和n λ分别是按模最大和最小特征值。

2)利用步骤(1)中分解矩阵A 得出的LU 矩阵,L 为单位下三角阵,U 为上三角阵,其中U 矩阵的主对角线元素之积即为det A 。

由于A 的元素零元素较多,为节省储存量,将A 的元素存为6×501的数组中,程序中采用get_an_element()函数来从小数组中取出A 中的元素。

2.全部源程序#include <stdio.h>#include <math.h>void init_a();//初始化Adouble get_an_element(int,int);//取A 中的元素函数double powermethod(double);//原点平移的幂法double inversepowermethod(double);//原点平移的反幂法int presolve(double);//三角LU 分解int solve(double [],double []);//解方程组int max(int,int);int min(int,int);double (*u)[502]=new double[502][502];//上三角U 数组double (*l)[502]=new double[502][502];//单位下三角L 数组double a[6][502];//矩阵Aint main(){int i,k;double lambdat1,lambdat2,lambda1,lambda501,lambdas,mu[40],det;double lambda[40];init_a();//初始化Alambdat1=powermethod(0);lambdat2=powermethod(lambdat1);lambda1=lambdat1<lambdat2?lambdat1:lambdat2;lambda501=lambdat1>lambdat2?lambdat1:lambdat2;presolve(0);lambdas=inversepowermethod(0);det=1;for(i=1;i<=501;i++)det=det*u[i][i];for (k=1;k<=39;k++){mu[k]=lambda1+k*(lambda501-lambda1)/40;presolve(mu[k]);lambda[k]=inversepowermethod(mu[k]);}printf("------------所有特征值如下------------\n");printf("λ=%1.11e λ=%1.11e\n",lambda1,lambda501);printf("λs=%1.11e\n",lambdas);printf("cond(A)=%1.11e\n",fabs(lambdat1/lambdas));printf("detA=%1.11e \n",det);for (k=1;k<=39;k++){printf("λi%d=%1.11e ",k,lambda[k]);if(k % 3==0) printf("\n");} delete []u;delete []l;//释放堆内存return 0;}void init_a()//初始化A{int i;for (i=3;i<=501;i++) a[1][i]=a[5][502-i]=-0.064;for (i=2;i<=501;i++) a[2][i]=a[4][502-i]=0.16;for (i=1;i<=501;i++) a[3][i]=(1.64-0.024*i)*sin(0.2*i)-0.64*exp(0.1/i); }double get_an_element(int i,int j)//从A中节省存储量的提取元素方法{if (fabs(i-j)<=2) return a[i-j+3][j];else return 0;}double powermethod(double offset)//幂法{int i,x1;double u[502],y[502];double beta=0,prebeta=-1000,yita=0;for (i=1;i<=501;i++)u[i]=1,y[i]=0;//设置初始向量u[]for (int k=1;k<=10000;k++){yita=0;for (i=1;i<=501;i++) yita=sqrt(yita*yita+u[i]*u[i]);for (i=1;i<=501;i++) y[i]=u[i]/yita;for (x1=1;x1<=501;x1++){u[x1]=0;for (int x2=1;x2<=501;x2++)u[x1]=u[x1]+((x1==x2)?(get_an_element(x1,x2)-offset):get_an_element(x1,x2))*y[x2] ;}prebeta=beta;beta=0;for (i=1;i<=501;i++) beta=beta+ y[i]*u[i];if (fabs((prebeta-beta)/beta)<=1e-12) {printf("offset=%f lambda=%f err=%e k=%d\n",offset,(beta+offset),fabs((prebeta-beta)/beta),k);break;};//输出中间过程,包括偏移量,误差,迭代次数}return (beta+offset);}double inversepowermethod(double offset)//反幂法{int i;double u[502],y[502];double beta=0,prebeta=0,yita=0;for (i=1;i<=501;i++)u[i]=1,y[i]=0; //设置初始向量u[]for (int k=1;k<=10000;k++){yita=0;for (i=1;i<=501;i++) yita=sqrt(yita*yita+u[i]*u[i]);for (i=1;i<=501;i++) y[i]=u[i]/yita;solve(u,y);prebeta=beta;beta=0;for (i=1;i<=501;i++) beta=beta+ y[i]*u[i];beta=1/beta;if (fabs((prebeta-beta)/beta)<=1e-12) {printf("offset=%f lambda=%f err=%e k=%d\n",offset,(beta+offset),fabs((prebeta-beta)/beta),k);break;};//输出中间过程,包括偏移量,误差,迭代次数}return (beta+offset);int presolve(double offset)//三角LU分解{int i,k,j,t;double sum;for (k=1;k<=501;k++)for (j=1;j<=501;j++){u[k][j]=l[k][j]=0;if (k==j) l[k][j]=1;} //初始化LU矩阵for (k=1;k<=501;k++){for (j=k;j<=min(k+2,501);j++){sum=0;for (t=max(1,max(k-2,j-2)) ; t<=(k-1) ; t++)sum=sum+l[k][t]*u[t][j];u[k][j]=((k==j)?(get_an_element(k,j)-offset):get_an_element(k,j))-sum;}if (k==501) continue;for (i=k+1;i<=min(k+2,501);i++){sum=0;for (t=max(1,max(i-2,k-2));t<=(k-1);t++)sum=sum+l[i][t]*u[t][k];l[i][k]=(((i==k)?(get_an_element(i,k)-offset):get_an_element(i,k))-sum)/u[k][k];}}return 0;}int solve(double x[],double b[])//解方程组{int i,t;double y[502];double sum;y[1]=b[1];for (i=2;i<=501;i++){sum=0;for (t=max(1,i-2);t<=i-1;t++)sum=sum+l[i][t]*y[t];y[i]=b[i]-sum;}x[501]=y[501]/u[501][501];for (i=500;i>=1;i--){sum=0;for (t=i+1;t<=min(i+2,501);t++)sum=sum+u[i][t]*x[t];x[i]=(y[i]-sum)/u[i][i];}return 0;}int max(int x,int y){return (x>y?x:y);}int min(int x,int y){return (x<y?x:y);}3.计算结果结果如下图所示:部分中间结果:给出了偏移量(offset),误差(err),迭代次数(k)4.讨论迭代初始向量的选取对计算结果的影响,并说明原因使用u[i]=1(i=1,2,...,501)作为初始向量进行迭代,可得出以上结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数值分析之幂法及反幂法C 语言程序实例
1、算法设计方案:
①求1λ、501λ和s λ的值:
s λ:s λ表示矩阵的按模最小特征值,为求得s λ直接对待求矩阵A 应用反幂法即可。

1λ、501λ:已知矩阵A 的特征值满足关系 1n λλ<<,要求1λ、及501λ时,可按如下方法求解:
a . 对矩阵A 用幂法,求得按模最大的特征值1m λ。

b . 按平移量1m λ对矩阵A 进行原点平移得矩阵1m B
A I λ=+,对矩阵
B 用反幂法求得B 的按模最小特征值2m λ。

c . 321m m m λλλ=-
则:113min(,)m m λλλ=,13max(,)n m m λλλ=即为所求。

②求和A 的与数5011
140k k λλμλ-=+最接近的特征值ik λ(k=0,1,…39):
求矩阵A 的特征值中与k μ最接近的特征值的大小,采用原点平移的方法: 先求矩阵 B=A-k μI 对应的按模最小特征值k β,则k β+k μ即为矩阵A 与k μ最接近的特征值。

重复以上过程39次即可求得
ik λ(k=0,1,…39)的值。

③求A 的(谱范数)条件数2cond()A 和行列式det A :
在(1)中用反幂法求矩阵A 的按模最小特征值时,要用到Doolittle 分解方法,在Doolittle 分解完成后得到的两个矩阵分别为L 和U ,则A 的行列式可由U 阵求出,即:det(A)=det(U)。

求得det(A)不为0,因此A 为非奇异的实对称矩阵,则: max 2()s
cond A λλ=,max λ和s λ分别为模最大特征值与模最小特征值。

2、程序源代码:
#include<>
#include<>
#include<>
#define N 501 3e\n",k,k,value_s);
}
}
void main()
{
float cond;
double value_det;
printf("Contact me\n");
Init_matrix_A(); 3e\n",value_1);
printf("λ501=%.13e\n",value_N);
value_det=Det_matrix(); 3e\n",value_s);
cond=Get_cond_A(); 3e\n",cond);
printf("value_det=%.13e\n",value_det); }
3、程序运行结果:
4、迭代初始向量的选取对计算结果的影响:
本次计算实习求矩阵A的具有某些特征的特征值,主要用到的方法是幂法和反幂法,这两种方法从原理上看都是迭代法,因此迭代初始向量的选择对计算结果会产生一定影响,主要表现在收敛速度上。

通过实际调试发现,对某些特殊的迭代初始值,确实对收敛结果及收敛速度产生影响,具体如下所列:
以下结论建立在float数据类型基础之上;
1.迭代初始值u[i]=c(i=1,2,…,501)且c的绝对值值极大(例如以上),收敛结果可以稳定但收敛速度减慢,其原因为c的数量级与矩阵A中元素数量级差距过大,导致迭代次数以及运算量增大;
2.迭代初始值u[i]=c(i=1,2,…,501)且c的绝对值值极小(例如以下),收敛结果并不稳定,且收敛速度减慢,其原因是计算机舍入误差将会影响计算结果;
3.迭代初始值u[i] (i=1,2,…,501)之间数量级偏差很大(例如倍以上),收敛结果亦不稳定,且收敛速度减慢,其原因是人为使迭代过程中的权重发生较大区别,使迭代复杂化。

结论,对于迭代初始值的选取应尽量与矩阵A中元素数量级保持相近,且应保证相近的数量级。

PS: F urther details please Contact me:
2011-11-15。

相关文档
最新文档