⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 研究生期间上《数值计算方法》课的作业
💻 CPP
字号:
#include <iostream>
#include <stdlib.h>
#include <math.h>
#define MaxD 10

using namespace std;

float Matrix[MaxD][MaxD];
float Q[MaxD][MaxD];
float tempQ[MaxD][MaxD];
float R[MaxD][MaxD];
float H[MaxD][MaxD];   //QR分解时的H矩阵 
int N;

int sgn(float Number)
{
    int retVal = 1;
    if(Number<0) 
        retVal = -1;
    return retVal;    
}

float MultHM(int row, int col)
{
    float retVal = 0;
    for(int i=0; i<N; i++)
    {
        retVal += H[row][i]*Matrix[i][col];
    }
    return retVal;
}

float MultQH(int row, int col)
{
    float retVal = 0;
    for(int i=0; i<N; i++)
    {
        retVal += Q[row][i]*H[i][col];
    }
    return retVal;
}

void MultRQtoMatix()
{
    int i=0,j=0,k=0;
    float temp = 0.0;
    for(i=0; i<N; i++)
    {
        for(j=0; j<N; j++)
        {
            temp = 0.0;
            for(k=0; k<N; k++)
            {
                temp += Matrix[i][k]*Q[k][j];
            }
            R[i][j] = temp;
        }
    }
    
    for(i=0; i<N; i++)
    {
        for(j=0; j<N; j++)
        {
            Matrix[i][j] = R[i][j];
        }
    }
}

void QRAnalyze()
{
    int i=0,j=0,k=0;

    float V[MaxD];         //QR分解时的v向量 
    float a;               //a = sgn(a11)|a1| 
    float b;               //b = a(a+a11) 
    
    for(i=0; i<N-1; i++)   //用i来控制列 
    {
        a = 0;
        for(j=0; j<N; j++)
        {
            V[j] = Matrix[j][i];
        }
        
        for(j=i; j<N; j++)
        {
            a += V[j]*V[j];
        }
        
        a = sqrt(a);
        a *= sgn(V[i]);
        b = a*(a + V[i]);
        
        V[i] = V[i] + a;
        
        for(j=0; j<N; j++)
        {
            for(k=0; k<N; k++)
            {
                H[j][k] = 0.0;                
            }
        }
        
        for(j=i; j<N; j++)
        {
            for(k=i; k<N; k++)
            {
                H[j][k] = V[j]*V[k]*(-1/b);
            }
        }
        
        for(j=0; j<N; j++)
        {
            H[j][j] += 1;
        }

        //Ai = Hi * Ai-1
        for(j=0; j<N; j++)
        {
            for(k=0; k<N; k++)
            {
                R[j][k] = MultHM(j,k);
                tempQ[j][k] = MultQH(j,k);
            }
        }
        for(j=0; j<N; j++)
        {
            for(k=0; k<N; k++)
            {
                Matrix[j][k] = R[j][k];
                Q[j][k] = tempQ[j][k];
            }
        }
    }
}

int main(int argc, char *argv[])
{
    int i=0,j=0;
    do
    {
        printf("请输入矩阵维数 不大于10\n");
        scanf("%d",&N);
    }while(N > 10);
    
    printf("请输入矩阵元素:\n");
    for(i=0; i<N; i++)
    {
        for(j=0; j<N; j++)
        {
            printf("Matrix[%d][%d]=",i,j);
            scanf("%f",&Matrix[i][j]);
        }
    }
    
    /*  测试数据 
    Matrix[0][0]=1.0;
    Matrix[0][1]=2.0;
    Matrix[0][2]=3.0;
    Matrix[1][0]=2.0;
    Matrix[1][1]=3.0;
    Matrix[1][2]=4.0;
    Matrix[2][0]=2.0;
    Matrix[2][1]=1.0;
    Matrix[2][2]=4.0;
    */
    for(int num=0; num<10; num++)
    {
        for(i=0; i<N; i++)
        {
            for(j=0; j<N; j++)
            {
                Q[i][j] = 0;
                R[i][j] = 0;
            }
            Q[i][i] = 1;
        }
        QRAnalyze();
        //Matrix = R*Q;
        MultRQtoMatix();
    }
    printf("矩阵的特征值为:\n");
    for(i=0; i<N; i++)
    {
        printf("a[%d] = %5f\n",i,Matrix[i][i]);
    }

    system("PAUSE");	
    return 0;
}

⌨️ 快捷键说明

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