杜立特尔法解方程组

试编出下列子程序:

(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 
#include 
#include 
#include 
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<


你可能感兴趣的:(课程)