求助!怎樣求矩陣特徵值,要用household方法(有C語言程式最好)

2021-03-27 21:06:37 字數 5662 閱讀 6995

1樓:飲水思春

//數值計算程式-特徵值和特徵向量

//約化對稱矩陣為三對角對稱矩陣

//利用householder變換將n階實對稱矩陣約化為對稱三對角矩陣

//a-長度為n*n的陣列,存放n階實對稱矩陣

//n-矩陣的階數

//q-長度為n*n的陣列,返回時存放householder變換矩陣

//b-長度為n的陣列,返回時存放三對角陣的主對角線元素

//c-長度為n的陣列,返回時前n-1個元素存放次對角線元素

void eastrq(double a,int n,double q,double b,double c);

//求實對稱三對角對稱矩陣的全部特徵值及特徵向量

//利用變型qr方法計算實對稱三對角矩陣全部特徵值及特徵向量

//n-矩陣的階數

//b-長度為n的陣列,返回時存放三對角陣的主對角線元素

//c-長度為n的陣列,返回時前n-1個元素存放次對角線元素

//q-長度為n*n的陣列,若存放單位矩陣,則返回實對稱三對角矩陣的特徵向量組

// 若存放householder變換矩陣,則返回實對稱矩陣a的特徵向量組

//a-長度為n*n的陣列,存放n階實對稱矩陣

int ebstq(int n,double b,double c,double q,double eps,int l);

//約化實矩陣為赫申伯格(hessen berg)矩陣

//利用初等相似變換將n階實矩陣約化為上h矩陣

//a-長度為n*n的陣列,存放n階實矩陣,返回時存放上h矩陣

//n-矩陣的階數

void echbg(double a,int n);

//求赫申伯格(hessen berg)矩陣的全部特徵值

//返回值小於0表示超過迭代jt次仍未達到精度要求

//返回值大於0表示正常返回

//利用帶原點位移的雙重步qr方法求上h矩陣的全部特徵值

//a-長度為n*n的陣列,存放上h矩陣

//n-矩陣的階數

//u-長度為n的陣列,返回n個特徵值的實部

//v-長度為n的陣列,返回n個特徵值的虛部

//eps-控制精度要求

//jt-整型變數,控制最大迭代次數

int edqr(double a,int n,double u,double v,double eps,int jt);

//求實對稱矩陣的特徵值及特徵向量的雅格比法

//利用雅格比(jacobi)方法求實對稱矩陣的全部特徵值及特徵向量

//返回值小於0表示超過迭代jt次仍未達到精度要求

//返回值大於0表示正常返回

//a-長度為n*n的陣列,存放實對稱矩陣,返回時對角線存放n個特徵值

//n-矩陣的階數

//u-長度為n*n的陣列,返回特徵向量(按列儲存)

//eps-控制精度要求

//jt-整型變數,控制最大迭代次數

int eejcb(double a,int n,double v,double eps,int jt);

選自《徐世良數值計算程式集(c)>>

每個程式都加上了適當地註釋,陸陸續續幹了幾個月才整理出來的啊。

今天都給貼出來了

#include "stdio.h"

#include "math.h"

//約化對稱矩陣為三對角對稱矩陣

//利用householder變換將n階實對稱矩陣約化為對稱三對角矩陣

//a-長度為n*n的陣列,存放n階實對稱矩陣

//n-矩陣的階數

//q-長度為n*n的陣列,返回時存放householder變換矩陣

//b-長度為n的陣列,返回時存放三對角陣的主對角線元素

//c-長度為n的陣列,返回時前n-1個元素存放次對角線元素

void eastrq(double a,int n,double q,double b,double c)

}for (i=n-1; i>=1; i--)

}if (h+1.0==1.0)

b[i]=0.0;

}else

h=h-q[u]*c[i-1];

q[u]=q[u]-c[i-1];

f=0.0;

for (j=0; j<=i-1; j++)

if (j+1<=i-1)

}c[j-1]=g/h;

f=f+g*q[j*n+i];

}h2=f/(h+h);

for (j=0; j<=i-1; j++)

}b[i]=h;}}

b[0]=0.0;

for (i=0; i<=n-1; i++)

for (k=0; k<=i-1; k++)}}

u=i*n+i;

b[i]=q[u];

q[u]=1.0;

if (i-1>=0)}}

return;

//求實對稱三對角對稱矩陣的全部特徵值及特徵向量

//利用變型qr方法計算實對稱三對角矩陣全部特徵值及特徵向量

//n-矩陣的階數

//b-長度為n的陣列,返回時存放三對角陣的主對角線元素

//c-長度為n的陣列,返回時前n-1個元素存放次對角線元素

//q-長度為n*n的陣列,若存放單位矩陣,則返回實對稱三對角矩陣的特徵向量組

// 若存放householder變換矩陣,則返回實對稱矩陣a的特徵向量組

//a-長度為n*n的陣列,存放n階實對稱矩陣

int ebstq(int n,double b,double c,double q,double eps,int l)

m=j;

while ((m<=n-1)&&(fabs(c[m])>d))

if (m!=j)

it=it+1;

g=b[j];

p=(b[j+1]-g)/(2.0*c[j]);

r=sqrt(p*p+1.0);

if (p>=0.0)

else

h=g-b[j];

for (i=j+1; i<=n-1; i++)

f=f+h;

p=b[m];

e=1.0;

s=0.0;

for (i=m-1; i>=j; i--)

else

p=e*b[i]-s*g;

b[i+1]=h+s*(e*g+s*b[i]);

for (k=0; k<=n-1; k++)

}c[j]=s*p;

b[j]=e*p;

}while (fabs(c[j])>d);

}b[j]=b[j]+f;

}for (i=0; i<=n-1; i++)

}if (k!=i)}}

return(1);

}//約化實矩陣為赫申伯格(hessen berg)矩陣

//利用初等相似變換將n階實矩陣約化為上h矩陣

//a-長度為n*n的陣列,存放n階實矩陣,返回時存放上h矩陣

//n-矩陣的階數

void echbg(double a,int n)

}if (fabs(d)+1.0!=1.0)

for (j=0; j<=n-1; j++)

}for (i=k+1; i<=n-1; i++)

for (j=0; j<=n-1; j++)}}

}return;

}//求赫申伯格(hessen berg)矩陣的全部特徵值

//利用帶原點位移的雙重步qr方法求上h矩陣的全部特徵值

//返回值小於0表示超過迭代jt次仍未達到精度要求

//返回值大於0表示正常返回

//a-長度為n*n的陣列,存放上h矩陣

//n-矩陣的階數

//u-長度為n的陣列,返回n個特徵值的實部

//v-長度為n的陣列,返回n個特徵值的虛部

//eps-控制精度要求

//jt-整型變數,控制最大迭代次數

int edqr(double a,int n,double u,double v,double eps,int jt)

ii=(m-1)*n+m-1;

jj=(m-1)*n+m-2;

kk=(m-2)*n+m-1;

ll=(m-2)*n+m-2;

if (l==m-1)

else if (l==m-2)

u[m-1]=(-b-xy*y)/2.0;

u[m-2]=c/u[m-1];

v[m-1]=0.0; v[m-2]=0.0;

}else

m=m-2;

it=0;

}else

it=it+1;

for (j=l+2; j<=m-1; j++)

for (j=l+3; j<=m-1; j++)

for (k=l; k<=m-2; k++)

}else

if ((fabs(p)+fabs(q)+fabs(r))!=0.0)

s=xy*sqrt(p*p+q*q+r*r);

if (k!=l)

e=-q/s;

f=-r/s;

x=-p/s;

y=-x-f*r/(p+s);

g=e*r/(p+s);

z=-x-e*q/(p+s);

for (j=k; j<=m-1; j++)

a[jj]=q;

a[ii]=p;

}j=k+3;

if (j>=m-1)

for (i=l; i<=j; i++)

a[jj]=q;

a[ii]=p;}}

}}}return(1);

}//求實對稱矩陣的特徵值及特徵向量的雅格比法

//利用雅格比(jacobi)方法求實對稱矩陣的全部特徵值及特徵向量

//返回值小於0表示超過迭代jt次仍未達到精度要求

//返回值大於0表示正常返回

//a-長度為n*n的陣列,存放實對稱矩陣,返回時對角線存放n個特徵值

//n-矩陣的階數

//u-長度為n*n的陣列,返回特徵向量(按列儲存)

//eps-控制精度要求

//jt-整型變數,控制最大迭代次數

int eejcb(double a,int n,double v,double eps,int jt)}}

while (1==1)}}

if (fmjt)

l=l+1;

u=p*n+q;

w=p*n+p;

t=q*n+p;

s=q*n+q;

x=-a[u];

y=(a[s]-a[w])/2.0;

omega=x/sqrt(x*x+y*y);

if (y<0.0)

sn=1.0+sqrt(1.0-omega*omega);

sn=omega/sqrt(2.0*sn);

**=sqrt(1.0-sn*sn);

fm=a[w];

a[w]=fm******+a[s]*sn*sn+a[u]*omega;

a[s]=fm*sn*sn+a[s]******-a[u]*omega;

a[u]=0.0;

a[t]=0.0;

for (j=0; j<=n-1; j++)

}for (i=0; i<=n-1; i++)

}for (i=0; i<=n-1; i++)

}return(1);}

這個矩陣的特徵值怎麼算這個矩陣的特徵值要怎麼算?

計算特徵值實際上就是求行列式 在這裡設特徵值為a,那麼 2 a 2 2 2 5 a 4 2 4 5 a r3 r2 2 a 2 2 2 5 a 4 0 a 1 1 a c2 c3 2 a 4 2 2 9 a 4 0 0 1 a 按第3行展開 1 a 2 a 9 a 8 1 a 2 10 a 0 顯然...

求下列矩陣的特徵值和特徵向量0 0 0

a 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 先求出特徵值,得到1,1 都是兩重 將特徵值1代入特徵方程 i a x 0 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 第4行,加上第1行 1 1 0 0 1 0 1 1 0 0 1 1 0 0 0 0 0 第3...

n n矩陣A的特徵值和A的共軛轉置的特徵值相等嗎?為什麼

a和a t永遠相似 a t和a h的特徵值差一個共軛,所以a和a h的特徵值也會相差一個共軛 矩陣的共軛轉置乘以自身得到的結果的特徵值是什麼 應該說沒有來太必然的聯絡。源 b的特徵值bai是a的奇du 異值的平方,但是a的奇異值和a的特zhi徵值沒有很必然的dao聯絡,除非a本身是hermite陣。...