数学建模作业
计算机学院信计1102班姜圣涛
(1)幂法求矩阵最大特征值及特征向量:
程序为:
#include<iostream>
#include<math.h>
using namespace std;
#define n 3 //三阶矩阵
#define N 20
#define err 0.0001
//幂法求特征值特征向量
void main(){
cout<<"**********幂法求矩阵最大特征值及特征向量***********"<<endl; int i,j,k;
double A[n][n],X[n],u,y[n],max;
cout<<"请输入矩阵:\n";
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>A[i][j]; //输入矩阵
cout<<"请输入初始向量:\n";
for(i=0;i<n;i++)
cin>>X[i]; //输入初始向量
k=1;
u=0;
while(1){
max=X[0];
for(i=0;i<n;i++)
{
if(max<X[i]) max=X[i]; //选择最大值 }
for(i=0;i<n;i++)
y[i]=X[i]/max;
for(i=0;i<n;i++)
{
X[i]=0;
for(j=0;j<n;j++)
X[i]+=A[i][j]*y[j]; //矩阵相乘}
if(fabs(max-u)<err)
{
cout<<"A的特征值是 :"<<endl;
cout<<max<<endl;
cout<<"A的特征向量为:"<<endl;
for(i=0;i<n;i++)
cout<<X[i]/(X[0]+X[1]+X[2])<<" ";
cout<<endl;
break;
}
else
{
if(k<N) {k=k+1;u=max;}
else {
cout<<"运行错误\n";
break;
}
}
}
}
程序结果为:
(2)和法求矩阵最大特征值及特征向量
程序为:
#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
#define n 3 //三阶矩阵#define N 20
void main(){
int i,j,k;
double A[n][n],w[n],M[n],u[n],W[n][n],max;
cout<<"********和法求矩阵的特征根及特征向量*******"<<endl; cout<<"请输入矩阵:\n";
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>A[i][j]; //输入矩阵
//计算每一列的元素和
M[0]=0;M[1]=0;M[2]=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
M[i]+=A[j][i];
}
//将每一列向量归一化
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
W[j][i]=A[j][i]/M[i];
}
//输出按列归一化之后的矩阵W
cout<<"按列归一化后的矩阵为:"<<endl;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cout<<W[i][j]<<" ";
if(j==2)
cout<<endl;
}
//求特征向量
w[0]=0;w[1]=0;w[2]=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
w[i]+=W[i][j];
}
cout<<"特征向量为:"<<endl;
for(i=0;i<n;i++)
{
u[i]=w[i]/(w[0]+w[1]+w[2]); cout<<u[i]<<" "<<endl;
}
//求最大特征值
max=0;
for(i=0;i<n;i++)
{
w[i] = 0;
for(j=0;j<n;j++)
{
w[i] += A[i][j]*u[j];
}
}
for(i = 0;i < n;i++)
{
max += w[i]/u[i];
}
cout<<"最大特征根为:"<<endl;
cout<<max/n<<endl;
}
运行结果为:
(3)根法求矩阵最大特征值及特征向量:
程序为:
#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
#define n 3 //三阶矩阵
#define N 20
void main(){
int i,j;
double A[n][n],w[n],M[n],u[n],W[n][n],max;
cout<<"********根法求矩阵的特征根及特征向量*******"<<endl; cout<<"请输入矩阵:\n";
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>A[i][j]; //输入矩阵
//计算每一列的元素和
M[0]=0;M[1]=0;M[2]=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
M[i]+=A[j][i];
}
//将每一列向量归一化
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
W[j][i]=A[j][i]/M[i];
}
//输出按列归一化之后的矩阵W
cout<<"按列归一化后的矩阵为:"<<endl;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cout<<W[i][j]<<" ";
if(j==2)
cout<<endl;
}
//求特征向量
//w[0]=A[0][0];w[1]=A[0][1];w[2]=A[0][2]; w[0]=1;w[1]=1;w[2]=1;
for(i=0;i<n;i++) {
for(j=0;j<n;j++)
{
w[i]=w[i]*W[i][j];
}
w[i]=pow(w[i], 1.0/3);
}
cout<<"特征向量为:"<<endl;
for(i=0;i<n;i++)
{
u[i]=w[i]/(w[0]+w[1]+w[2]); cout<<u[i]<<" "<<endl;
}
//求最大特征值
max=0;
for(i=0;i<n;i++)
{
w[i] = 0;
for(j=0;j<n;j++)
{
w[i] += A[i][j]*u[j];
}
}
for(i = 0;i < n;i++)
{
max += w[i]/u[i];
}
cout<<"最大特征值为:"<<endl; cout<<max/n;
}
运行结果为:。