杜立特尔法解方程组

试编出下列子程序:

(1)实现矩阵三角分解A=LU;

(2)利用分解因子L,U解方程组AX=b(即先求解LY=b 再求解UX=Y)的子程序。

利用上述子程序解线性方程组AX=bk(k=1,2,…,10),其中

A=1  2 4  7  11  16

  2 3  5  8 12  17

  4 5  6  9 13  18

  7 8  9  10 14 19

  11 12 13 14 15  20

  16 17 18 19 20  21

b1为任一非零的六元向量;若记Xk为AX= bk的解向量,则取bk+1=Xk/||Xk||.请输出结果:L;U;bk;Xk     (k=1,2,…,10).并认真观察之,能发现什么有趣的现象. 


还是计算方法的作业,按照书中的公式和流程图实现一下

input

6
1 2 4 7 11 16
2 3 5 8 12 17
4 5 6 9 13 18
7 8 9 10 14 19
11 12 13 14 15 20
16 17 18 19 20 21

b向量任意:6个1就行

1 1 1 1 1 1


#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <math.h>
using namespace std;
const int MAXN=1000;

int N;
double A[MAXN][MAXN];
double b[MAXN];
double x[MAXN];
double y[MAXN];
//double L[MAXN][MAXN];
//double U[MAXN][MAXN];

void initA(){
    printf("输入矩阵A的阶数:");
    cin>>N;
    printf("输入矩阵A\n");
    for(int i=1;i<=N;i++){
        for(int j=1;j<=N;j++){
            cin>>A[i][j];
        }
    }
}

void initb(){
    printf("输入b向量\n");
    for(int i=1;i<=N;i++){
        cin>>b[i];
    }
}

void duliteer(){//紧凑格式得到A=LU
    double sum;
    for(int i=2;i<=N;i++){
        A[i][1]=A[i][1]/A[1][1];
    }

    for(int k=2;k<=N;k++){
        for(int i=k;i<=N;i++){
            sum=0;
            for(int j=1;j<=k-1;j++){
                sum+=A[k][j]*A[j][i];
            }
            A[k][i]=A[k][i]-sum;
        }
        for(int i=k+1;i<=N;i++){
            sum=0;
            for(int j=1;j<=k-1;j++){
                sum+=A[i][j]*A[j][k];
            }
            A[i][k]=(A[i][k]-sum)/A[k][k];
        }

    }
}

void gety(){
    y[1]=b[1];
    double sum;
    for(int k=2;k<=N;k++){
        sum=0;
        for(int j=1;j<=k-1;j++){
            sum+=A[k][j]*y[j];
        }
        y[k]=b[k]-sum;
    }
}

void getx(){
    double sum,M;
    x[N]=y[N]/A[N][N];
    x[0]=fabs(x[N]);
    for(int k=N-1;k>=1;k--){
        sum=0;
        for(int j=k+1;j<=N;j++){
            sum+=A[k][j]*x[j];
        }
        x[k]=(y[k]-sum)/A[k][k];
        x[0]=max(x[0],fabs(x[k]));
    }
}

void xianshi(){
    cout<<endl;
    printf("L和U分别为:\n");
    for(int i=1;i<=N;i++){
        for(int j=1;j<=N;j++){
            if(i==j){
                cout<<setw(5)<<1;
                cout<<"         ";
            }
            cout<<setw(5)<<A[i][j]<<" ";
        }
        cout<<endl;
    }

}

void output(){

    printf("b向量为:\n");
    for(int i=1;i<=N;i++){
        cout<<b[i]<<" ";
    }
    cout<<endl;
    printf("x向量为:\n");
    for(int i=1;i<=N;i++){
        cout<<x[i]<<" ";
    }
    cout<<endl;
}

int main(){
    while(1){
        initA();
        initb();
        duliteer();
        gety();
        getx();
        xianshi();
        for(int i=1;i<=10;i++){
            cout<<endl;
            printf("第(%d)种:\n",i);
            output();
            for(int j=1;j<=N;j++){
                b[j]=x[j]/x[0];
            }
            gety();
            getx();
        }

        cout<<endl;
    }
    return 0;
}


你可能感兴趣的:(杜立特尔法解方程组)