exercise_7.cpp

来自「牛顿下山法求解非线性方程组问题」· C++ 代码 · 共 72 行

CPP
72
字号
/*
幂法求矩阵的特征值和特征向量
1.	初始化矩阵,向量,误差
2.	置u=0。
3.	求xr=>λ
4.	计算  
    Y=X/λ,X=AY
5.	若|λ-u|<ε,输出λ,X,停机;
*/
#include<iostream>
#include<cmath>
using namespace std;
const int n=3;
const int m=4;
int main()
{   
	int i,j;
	double Xr,err=0.00001,u,T=0;
	double A[n][n]={{5,-4,1},{-4,6,-4},{1,-4,7}},
		B[m][m]={{25,-41,10,-6},{-41,68,-17,10},{10,-17,5,-3},{-6,10,-3,2}};
	double X[n]={1,1,1},Y[n];
	double U[m]={1,1,1,1},V[m];
	do
	{
	u=T;
	for(i=0;i<n-1;i++)
	{
	  Xr=X[0];
		if(X[i+1]>X[i])Xr=X[i+1];
		else continue;
	}
    T=Xr;
	for(i=0;i<n;i++)Y[i]=X[i]/T;	
	for(i=0;i<n;i++)X[i]=0; 	
	for(i=0;i<n;i++) 
		for(j=0;j<n;j++)
		   X[i]+=A[i][j]*Y[j];
	}
	while(fabs(T-u)>err);

	cout<<"矩阵A最大特征值T:"<<endl;
	cout<<T<<endl;
	cout<<"对应的特征向量为:"<<endl;
	for(i=0;i<n;i++) 
        cout<<X[i]<<endl;
	cout<<endl;
	do
	{
	u=T;
	for(i=0;i<m-1;i++)
	{
	  Xr=U[0];
		if(U[i+1]>U[i])Xr=U[i+1];
		else continue;
	}
    T=Xr;
	for(i=0;i<m;i++)V[i]=U[i]/T;	
	for(i=0;i<m;i++)U[i]=0; 	
	for(i=0;i<m;i++) 
		for(j=0;j<m;j++)
		   U[i]+=B[i][j]*V[j];
	}
	while(fabs(T-u)>err);

	cout<<"矩阵B最大特征值T:"<<endl;
	cout<<T<<endl;
	cout<<"对应的特征向量为:"<<endl;
	for(i=0;i<m;i++) 
        cout<<U[i]<<endl;
		return 0;
	}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?