C求特征值.docx
- 文档编号:29258357
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:16
- 大小:17.33KB
C求特征值.docx
《C求特征值.docx》由会员分享,可在线阅读,更多相关《C求特征值.docx(16页珍藏版)》请在冰豆网上搜索。
C求特征值
#include
#include
#include
#include
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//classMatrix定义矩阵类
constintMax_xy=20;//矩阵的最大维数
classMatrix
{
private:
doubledata[Max_xy][Max_xy];
unsignedx,y;//x,y;
public:
Matrix();//默认构造函数
Matrix(constMatrix&source);//拷贝构造函数
voidcreat();//输入矩阵
voidinit();
voidtranspose();//矩阵转置
voidshow();//输入此矩阵
doublemode()const;//求一维矩阵的长度
voidcheck_shiduichen();//检查是否为是对称矩阵
voidcreat_unit(unsignedi);//生成i行单位矩阵
voidset_x(unsignedxx);//设置行数
voidset_y(unsignedyy);//设置列数
unsignedget_x();//得到行数
unsignedget_y();//得到列数
voidshucheng(doublechangshu);//数乘运算
voidsetdata(unsignedi,unsignedj,doublesource);//定位输入数据
doublegetdata(unsignedi,unsignedj);//定位得到数据
voidsturm();//求特征值
unsignedsturm_s(doublem);//计算sturm系列的同好数
Matrixoperator=(constMatrix&right);
friendMatrix&operator+(constMatrix&left,constMatrix&right);//重载+号
friendMatrix&operator-(constMatrix&left,constMatrix&right);//重载-号
friendMatrix&operator*(constMatrix&left,constMatrix&right);//重载乘号
friendostream&operator<<(ostream&os,constMatrix&source);//重载输出
friendvoidHouseholder(Matrix&source);//用Householde矩阵将实对称矩阵化为三对角矩阵
};
Matrixtemp_Matrix;//全局变量Matrix
//===================================================================
//--------------------默认构造函数
Matrix:
:
Matrix()
{
init();
}
//----------------------------拷贝构造函数
Matrix:
:
Matrix(constMatrix&source)
{
init();
x=source.x;
y=source.y;
for(unsignedi=0;i for(unsignedj=0;j data[i][j]=source.data[i][j]; } //------------------------------------------初始化矩阵元素 voidMatrix: : init() { x=y=0; for(unsignedi=0;i for(unsignedj=0;j data[i][j]=0; } //------------------------------矩阵转置 voidMatrix: : transpose() { doubletemp;intt; for(unsignedi=0;i for(unsignedj=0;j<=i;j++) { temp=data[i][j]; data[i][j]=data[j][i]; data[j][i]=temp; } t=x; x=y; y=t; } //--------------------------------------求一维矩阵的长度 doubleMatrix: : mode()const { doubles=0; unsignedi,j; if(x==1) for(i=0,j=0;j s+=data[i][j]*data[i][j]; elseif(y==1) for(i=0,j=0;i s+=data[i][j]*data[i][j]; else { cout<<"\n不是一维的! "; exit(0); } s=sqrt(s); return(s); } //----------------------------------------重载=号 MatrixMatrix: : operator=(constMatrix&source) { x=source.x; y=source.y; for(unsignedi=0;i for(unsignedj=0;j data[i][j]=source.data[i][j]; return*this; } //-------------------------------------------重载+号 Matrix&operator+(constMatrix&left,constMatrix&right) { if(left.x! =right.x||left.y! =right.y) { cout<<"\n维数不相等,不能相加! "; exit(0); } for(unsignedi=0;i for(unsignedj=0;j temp_Matrix.data[i][j]=right.data[i][j]+left.data[i][j]; temp_Matrix.x=right.x; temp_Matrix.y=right.y; returntemp_Matrix; } //---------------------------------------------重载+号 Matrix&operator-(constMatrix&left,constMatrix&right) { if(left.x! =right.x||left.y! =right.y) { cout<<"\n维数不相等,不能相减! "; exit(0); } for(unsignedi=0;i for(unsignedj=0;j temp_Matrix.data[i][j]=left.data[i][j]-right.data[i][j]; temp_Matrix.x=right.x; temp_Matrix.y=right.y; returntemp_Matrix; } //----------------------------------------重载乘号 Matrix&operator*(constMatrix&left,constMatrix&right) { if(left.y! =right.x) { cout<<"\n两个矩阵相乘错误."; exit(0); } temp_Matrix.init(); unsignedi,j,k; for(i=0;i for(j=0;j for(k=0;k temp_Matrix.data[i][j]+=left.data[i][k]*right.data[k][j]; temp_Matrix.x=left.x; temp_Matrix.y=right.y; returntemp_Matrix; } //-------------------------------------------输入矩阵 voidMatrix: : creat() { cout<<"输如行列式: "; cout<<"\n行数: "; cin>>x; cout<<"列数: "; cin>>y; for(unsignedi=0;i { cout<<"输入第"< "; for(unsignedj=0;j cin>>data[i][j]; } } //----------------------------------------------输出矩阵 voidMatrix: : show() { unsignedi,j; cout<<"\n\n矩阵表示如下: "; for(i=0;i { cout< for(j=0;j cout< : left)< } } //----------------------------------用Householder矩阵化为实对称矩阵 voidHouseholder(Matrix&source) { unsignedi,lenth,k,m,n,flag; doubletemp_lie_x[Max_xy],temp_lie_y[Max_xy],temp[Max_xy]; doubles; for(i=0;i { for(k=0;k {//初始化为0 temp_lie_x[k]=0; temp_lie_y[k]=0; temp[k]=0; } for(lenth=0;lenth+i+1 temp_lie_x[lenth]=source.data[lenth+i+1][i]; for(k=0,s=0;k s+=temp_lie_x[k]*temp_lie_x[k]; s=sqrt(s); temp_lie_y[0]=-s; for(k=1;k temp_lie_y[k]=0; for(k=0;k temp[k]=temp_lie_x[k]-temp_lie_y[k]; for(k=0,flag=0;k if(temp[k]! =0) { flag=1; break; } if(flag==0) continue; Matrixpart_h,I,x_y;//定义Matrix变量 I.creat_unit(lenth); x_y.x=lenth,x_y.y=1; //对x_y赋值 for(k=0;k x_y.data[k][0]=temp[k]; //求x_y的转置 Matrixzhuanzhi_x_y(x_y);//拷贝构造函数 zhuanzhi_x_y.transpose(); s=2.0/(x_y.mode()*x_y.mode()); x_y.shucheng(s); temp_Matrix=x_y*zhuanzhi_x_y; part_h=I-x_y*zhuanzhi_x_y; MatrixH; H.creat_unit(source.x); for(m=i+1;m for(n=i+1;n H.data[m][n]=part_h.data[m-i-1][n-i-1];//得到最后的Householder矩阵 source=source*H; source=H*source; } for(i=0;i for(k=0;k if(fabs(source.data[i][k])<1e-13) source.data[i][k]=0; } //------------------------------------检查是否为实对称矩阵 voidMatrix: : check_shiduichen() { if(x! =y) { cout<<"\n\n不是是对称矩阵(行列不相等)\n\n"; exit(0); } for(unsignedi=0;i for(unsignedj=0;j { if(data[i][j]! =data[j][i]) { cout<<"\n\n不是实对称矩阵! (不对称! )\n\n"; exit(0); } } } ostream&operator<<(ostream&os,constMatrix&source) { unsignedi,j; for(i=0;i { os<<"\n"; for(j=0;j os< : left)< } os< returnos; } voidMatrix: : set_x(unsignedxx)//设置行数 { x=xx; } voidMatrix: : set_y(unsignedyy)//设置列数 { y=yy; } unsignedMatrix: : get_x()//得到行数 { returnx; } unsignedMatrix: : get_y()//得到列数 { returny; } doubleMatrix: : getdata(unsignedi,unsignedj)//定位得到数据 { returndata[i][j]; } voidMatrix: : setdata(unsignedi,unsignedj,doublesource) { data[i][j]=source; if(x if(y } voidMatrix: : creat_unit(unsignedlenth)//生成i行单位矩阵 { init(); x=y=lenth; for(unsignedi=0;i data[i][i]=1; } voidMatrix: : shucheng(doublechangshu)//数乘运算 { unsignedi,j; for(i=0;i for(j=0;j data[i][j]*=changshu; } voidMatrix: : sturm() { doubles,r,maxhang,a,b;unsignedi,j,m; for(i=0,maxhang=0;i {for(s=0,j=0;j s+=fabs(data[i][j]); if(s>maxhang) maxhang=s; } a=-maxhang; b=maxhang; m=sturm_s(a)-sturm_s(b); for(i=1;i<=m;i++) { a=-maxhang; b=maxhang; do { r=0.5*(a+b); if(sturm_s(r)>=i) a=r; else b=r; } while(fabs(a-b)>1e-11); cout<<"\n特征值"< "< : left)< < : fixed)<<0.5*(a+b); } } unsignedMatrix: : sturm_s(doubler) { doublep[Max_xy+1]; inttemp[Max_xy+1]; unsignedm,i; p[0]=1; p[1]=data[0][0]-r; for(i=2;i<=x;i++) p[i]=(data[i-1][i-1]-r)*p[i-1]-data[i-2][i-1]*data[i-2][i-1]*p[i-2]; temp[0]=1; for(i=1;i<=x;i++) if(p[i]>1e-14) temp[i]=1; elseif(p[i]<-1e-14) temp[i]=-1; else temp[i]=temp[i-1]; for(i=1,m=0;i<=x;i++) if(temp[i]+temp[i-1]! =0) m++; returnm; } voidmain() { Matrixa; a.creat(); cout<<"输入的矩阵为: "; cout< a.check_shiduichen(); Householder(a); cout<<"用Householder化为实对称矩阵为: "; cout< a.sturm(); cout< }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 求特征值 特征值
![提示](https://static.bdocx.com/images/bang_tan.gif)