杜立特尔法解方程组

试编出下列子程序:

(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;
}
时间: 2024-12-09 19:11:15

杜立特尔法解方程组的相关文章

高斯-塞德尔方法解方程组

#include <iostream> #include <cmath> using namespace std; int main() { double a[3][3]= {{9,-2,1},{1,-8,1},{2,-1,-8}};//系数矩阵 double b[3]= {6,-8,9};//方程组结果矩阵 double chg[3][3];//变换后的系数矩阵 double emax=0.0001;//精确度,根据要求更改 //变换系数矩阵,用以初始化chg[][]. for(

数学-线性代数-#1 表示及解方程组的新视角

线性代数-#1 表示及解方程组的新视角 学习线性代数之前,我们解n元一次方程组的方法(消元法)着眼于行,把每一行当成一个独立的整体进行处理,最后将各行联系起来求解. 而线性代数为我们提供了一个新视角:着眼于列. 以二元一次方程组为例,即把方程组表示为系数x乘以未知数x的系数组成的列向量v1与系数y乘以未知数y的系数组成的列向量v2通过平行四边形/三角形法则相加后得到方程组每一行的常数项所组成的列向量v3. 在这个视角下,我们可以发现: 1.代数学中的方程组可以通过向量的画法表示为几何学中的列图像

[NBUT 1224 Happiness Hotel 佩尔方程最小正整数解]连分数法解Pell方程

题意:求方程x2-Dy2=1的最小正整数解 思路:用连分数法解佩尔方程,关键是找出√d的连分数表示的循环节.具体过程参见:http://m.blog.csdn.net/blog/wh2124335/8871535 当d为完全平方数时无解 将√d表示成连分数的形式,例如: 当d不为完全平方数时,√d为无理数,那么√d总可以表示成: 记 当n为偶数时,x0=p,y0=q:当n为奇数时,x0=2p2+1,y0=2pq 求d在1000以内佩尔方程的最小正整数解的c++打表程序(正常跑比较慢,这个题需要离

回溯法解背包问题分析

先亮出题目: 一,背包问题 及 回溯法解其问题的伪代码 二,赋值后的具体实例 三,如何看懂伪代码 (1)真正了解回溯法的核心思想 我总结的回溯法解题步骤: <1>先找出第一个解 <2>回溯 (2)回溯法核心思想 + 伪代码 + 图9-5 树结构来分析 四,伪代码代入值解析 核心:先找到第一个解,再回溯. cw=0;//背包当前重量 初始值 cp=0;//背包当前价值 初始值 k=1;//第一个物品 n=8;//共8个物品 W=110 第一步:得出第1个可行解: (1)k=1 k=1

用二次规划法解带约束的线性回归

对于解带约束(线性约束)的线性回归通常的办法是,将约束直接表示在线性回归中,也就是减少一个变量(即回归到线性约束本身的自由变量数目).然而今天由于要解一个问题发现了另一种思路的解法,是比变换变量更为通用的办法,就是用二次规划法解带约束的线性回归. 二次规划法有如下一般形式: 各个部分为: 特别地如果约束条件为等号,则可以用拉格朗日乘子法直接求解.如果Q是不定矩阵,甚至有一个特征值是负数的,问题就是NP难问题.. 解决一个带约束的线性回归问题,形如: 需要求解最小化: 这个式子展开来写成矩阵形式就

艾尔法留学:去往马来西亚留学前,有需要哪些准备东西?

如果您已经准备好去马来西亚留学了,那么请提前做好出行准备,以免有备无患.那么去马来西亚留学前,需要整理一些什么呢?艾尔法留学中心为您做了如下整理,供您参考. 必备物品所有重要文件的备份.签证.护照和必须要复印,录取通知书备份.9张护照照片.(因为在国外要办很多的证件,例如学生证各种卡,都要照片 )双语词典.药不要带太多,小礼品不要太贵重. 衣物马来西亚一年四季都是夏天,冬装就没有必要带了,多带几件T恤衫,带两件薄的长袖外套!按照个人喜好,夏天穿什么带什么即可.长的短的裤子各带几条,虽然这边也有卖

用列主元消去法分别解方程组Ax=b,用MATLAB程序实现(最有效版)

数值分析里面经常会涉及到用MATLAB程序实现用列主元消去法分别解方程组Ax=b 具体的方法和代码以如下方程(3x3矩阵)为例进行说明: 用列主元消去法分别解方程组Ax=b,用MATLAB程序实现: (1) 1. 实现该方程的解的MATLAB代码可以分为两种,一种是入门级别的,只是简单地计算出这道题即可,第二种是一种通用的代码,可以实现很多3x3矩阵的方程解,写好以后只需要改不同矩阵里的元素即可算出相应的解,需要建立在对MATLAB比较熟悉的基础上,具体如下: 第一种代码实现-入门级: A=[3

Runge-Kutta法解微分方程

连续问题,微分方程或偏微分方程一定能表示.比如疾病传染.新闻传播等. 离散问题,可以用差分方程或者类似于差分的算法. 方程 $y'=cos t$ 代码 123456789 clear,clc; f = @(t,y) cos(t); tspan = [0,2*pi]; % 时间t范围y0 = 2; % y的初值,用来处理积分得到的C[t,y] = ode23(f,tspan,y0); % 注意调用格式plot(t,y);xlabel('t');ylabel('y'); @表示句柄,当把一个函数作为

三种迭代法解方程组(雅可比Jacobi、高斯-赛德尔Gaisi_saideer、逐次超松弛SOR)

分析用下列迭代法解线性方程组 4 -1 0 -1 0 0       0 -1 4 -1 0 -1 0        5 0 -1 4 -1 0 -1        -2 -1 0 -1 4 -1 0        5 0 -1 0 -1 4 -1        -2 0 0 -1 0 -1 4         6 的收敛性,并求出使||Xk+1-Xk||2<=0.0001的近似解及相应的迭代次数. (1)     雅可比迭代法: (2)     高斯-赛德尔迭代法: (3)     SOR迭代