矩阵的三角分解的编程实现

矩阵的三角分解的编程实现

一. 课程设计目的:

1. 将高斯消去法改写为紧凑形式,可以直接从矩阵A 的元素得到计算L,U 元素的递推公式,而不需要任何中间的步骤。

2. 理解三角分解的具体方法。

3. 掌握对于矩阵的运算的c 语言代码。了解二维数组的运用。

4. 掌握Doolittle 分解。

二. 基本知识回顾:

若n 阶方阵 n *n A ∈C n 的各阶顺序主子式不等于零,即:

a 11a 12 a 1k

a 21a 22 a 2k ∆k =≠0, (k =1, 2, , n ), (2)

ak 1ak 2 akk

则A 的LU 分解A =L ⨯U 存在且唯一。

⎡a 11 a 1r a 1n ⎤⎢ ⎥ ⎢⎥A =⎢a r 1 a rr a rn ⎥=⎢⎥ ⎢⎥⎢⎣a n 1 a nr a nn ⎥⎦

⎡1⎤⎡U 11 U 1r ⎢ ⎥⎢ ⎢⎥⎢⎢L r 1 1⎥⎢U rr ⎢⎥⎢ ⎢⎥⎢⎢⎣L n 1 L nr 1⎥⎦⎢⎣U 1n ⎤⎥⎥ U rn ⎥=LU ⎥ ⎥U nn ⎥⎦ (3)

由矩阵的乘法原理, 可推导出LU 分解的迭代算法

U 0j =a 0j ,(j =0,1,2, , n -1),

l i 0=(4) a i 0,(i =0,1,2, , n -1), (5) u 00

a rj -∑l ik u kj

k =1r -1u rj =l rr

r -1=a rj -∑l rk u kj , k =1r -1 (6) (r =0,1, 2, , n -1; j =r , , n -1),

a ir -∑l ik u kr

k =1l ir =u rr , (7)

(r =0,1, 2, , n -1; i =r +1, , n -1)

矩阵的LU 分解是一个循环迭代的过程, U矩阵是从第1行迭代到第n 行, 而L 矩阵则是从第1列迭代到第n 列, 且U 矩阵先于L 矩阵

一个节拍。

三. 基本问题:

编程实现Doolittle 分解。

四. 算法描述:

1. 输入矩阵A;

3. 若能分解,进行LU 分解。L 为单位下三角矩阵,U 为上三角矩阵。

五. 程序实现:

#include

#define N 10

int main()

{ float l[N][N]={0};

float u[N][N]={0};

float y[N]={0};

float x[N]={0};

float a[N][N];

float b[N];

float sum=0;

int i,j,k;

int n;

int flag=1;

while(flag)

{

printf("请输入系数矩阵的大小:");

scanf("%d", &n);

if(n>N){

printf("矩阵过大!\n");

continue;

}

flag=0;

}

printf("请输入系数矩阵值:\n");

for(i=0; i

{

for(j=0; j

{

printf("a[%d][%d]: ", i, j);

scanf("%f", &a[i][j]);

}

}

printf("\n原始矩阵:\n");

for(i=0; i

{

for(j=0; j

printf("%0.3f ",a[i][j]);

printf("\n");

}

printf("\n\n");

for(i=0; i

{

for(j=0; j

{

if(i==j) l[i][j] = 1;

}

}

for(i=0; i

{

u[0][i] = (float)(a[0][i]/l[0][0]);

}

for(i=0; i

{

for(j=i+1; j

{

for(k=0,sum=0; k

{

if(k != i) sum += l[j][k]*u[k][i]; }

l[j][i] = (float)((a[j][i]-sum)/u[i][i]); }

for(j=i+1; j

{

for(k=0,sum=0; k

{

if(k != i+1) sum += l[i+1][k]*u[k][j]; }

u[i+1][j] = (float)((a[i+1][j]-sum)); }

}

printf("矩阵L :\n");

for(i=0; i

{

for(j=0; j

{

printf("%0.3f ", l[i][j]);

}

printf("\n");

}

printf("\n矩阵U :\n"); for(i=0; i

{

for(j=0; j

printf("%0.3f ", u[i][j]); }

}

}

printf("\n");

矩阵的三角分解的编程实现

一. 课程设计目的:

1. 将高斯消去法改写为紧凑形式,可以直接从矩阵A 的元素得到计算L,U 元素的递推公式,而不需要任何中间的步骤。

2. 理解三角分解的具体方法。

3. 掌握对于矩阵的运算的c 语言代码。了解二维数组的运用。

4. 掌握Doolittle 分解。

二. 基本知识回顾:

若n 阶方阵 n *n A ∈C n 的各阶顺序主子式不等于零,即:

a 11a 12 a 1k

a 21a 22 a 2k ∆k =≠0, (k =1, 2, , n ), (2)

ak 1ak 2 akk

则A 的LU 分解A =L ⨯U 存在且唯一。

⎡a 11 a 1r a 1n ⎤⎢ ⎥ ⎢⎥A =⎢a r 1 a rr a rn ⎥=⎢⎥ ⎢⎥⎢⎣a n 1 a nr a nn ⎥⎦

⎡1⎤⎡U 11 U 1r ⎢ ⎥⎢ ⎢⎥⎢⎢L r 1 1⎥⎢U rr ⎢⎥⎢ ⎢⎥⎢⎢⎣L n 1 L nr 1⎥⎦⎢⎣U 1n ⎤⎥⎥ U rn ⎥=LU ⎥ ⎥U nn ⎥⎦ (3)

由矩阵的乘法原理, 可推导出LU 分解的迭代算法

U 0j =a 0j ,(j =0,1,2, , n -1),

l i 0=(4) a i 0,(i =0,1,2, , n -1), (5) u 00

a rj -∑l ik u kj

k =1r -1u rj =l rr

r -1=a rj -∑l rk u kj , k =1r -1 (6) (r =0,1, 2, , n -1; j =r , , n -1),

a ir -∑l ik u kr

k =1l ir =u rr , (7)

(r =0,1, 2, , n -1; i =r +1, , n -1)

矩阵的LU 分解是一个循环迭代的过程, U矩阵是从第1行迭代到第n 行, 而L 矩阵则是从第1列迭代到第n 列, 且U 矩阵先于L 矩阵

一个节拍。

三. 基本问题:

编程实现Doolittle 分解。

四. 算法描述:

1. 输入矩阵A;

3. 若能分解,进行LU 分解。L 为单位下三角矩阵,U 为上三角矩阵。

五. 程序实现:

#include

#define N 10

int main()

{ float l[N][N]={0};

float u[N][N]={0};

float y[N]={0};

float x[N]={0};

float a[N][N];

float b[N];

float sum=0;

int i,j,k;

int n;

int flag=1;

while(flag)

{

printf("请输入系数矩阵的大小:");

scanf("%d", &n);

if(n>N){

printf("矩阵过大!\n");

continue;

}

flag=0;

}

printf("请输入系数矩阵值:\n");

for(i=0; i

{

for(j=0; j

{

printf("a[%d][%d]: ", i, j);

scanf("%f", &a[i][j]);

}

}

printf("\n原始矩阵:\n");

for(i=0; i

{

for(j=0; j

printf("%0.3f ",a[i][j]);

printf("\n");

}

printf("\n\n");

for(i=0; i

{

for(j=0; j

{

if(i==j) l[i][j] = 1;

}

}

for(i=0; i

{

u[0][i] = (float)(a[0][i]/l[0][0]);

}

for(i=0; i

{

for(j=i+1; j

{

for(k=0,sum=0; k

{

if(k != i) sum += l[j][k]*u[k][i]; }

l[j][i] = (float)((a[j][i]-sum)/u[i][i]); }

for(j=i+1; j

{

for(k=0,sum=0; k

{

if(k != i+1) sum += l[i+1][k]*u[k][j]; }

u[i+1][j] = (float)((a[i+1][j]-sum)); }

}

printf("矩阵L :\n");

for(i=0; i

{

for(j=0; j

{

printf("%0.3f ", l[i][j]);

}

printf("\n");

}

printf("\n矩阵U :\n"); for(i=0; i

{

for(j=0; j

printf("%0.3f ", u[i][j]); }

}

}

printf("\n");


相关文章

  • 数值分析课程设计(最终版)
  • 本文主要通过Matlab 软件,对数值分析中的LU 分解法.最小二乘法.复化Simpon 积分.Runge-Kutta 方法进行编程,并利用这些方法在MATLAB 中对一些问题进行求解,并得出结论. 实验一线性方程组数值解法中,本文选取LU ...查看


  • 矩阵分解及无约束最优化方法
  • 矩阵分解及无约束最优化 方法的原理和应用简介 --最优化方法课程实验报告 学 院:数学与统计学院 班 级:硕2041班 姓 名:王彭 学 号:指导教师:阮小娥 同 组 人:陈莹 钱东东 矩阵分解及无约束最优化方法的原理和应用简介 矩阵分解及 ...查看


  • 连续时间信号的频谱分析仪
  • 郑州轻工业学院 课程设计说明书 题目:基于MATLAB 的连续时间信号的频域分析 姓 名: 院 (系): 电气信息工程学院 专业班级: 学 号: 指导教师: 成 绩: 郑州轻工业学院 课 程 设 计 任 务 书 题目 基于MATLAB 的连 ...查看


  • 数值分析学习心得体会
  • 数值分析学习感想 一个学期的数值分析,在老师的带领下,让我对这门课程有了深刻的理解和感悟.这门 课程是一个十分重视算法和原理的学科,同时它能够将人的思维引入数学思考的模式,在处 理问题的时候,可以合理适当的提出方案和假设.他的内容贴近实际, ...查看


  • 下三角复矩阵求逆的ASIC设计及实现
  • 下三角复矩阵求逆的ASIC设计及实现 熊洋 郑建宏 重庆邮电大学 400065 摘要:本论文提出了一种便于ASIC实现的矩阵求逆算法,可以完成对1到16维下三角复矩阵的求逆运算,并用Verilog硬件描述语言进行实现.利用SMIC 0.13 ...查看


  • 20世纪十大算法
  • 20世纪十大算法 本世纪初,美国物理学会(AmericanInstitute of Physics)和IEEE计算机社团(IEEE Computer Society)的一本联合刊物<科学与工程中的计算>发表了由田纳西大学的Jac ...查看


  • matlab实现线性卷积和循环卷积
  • 编号: 数字信号处理 实训 (论文) 说明书 题 目: 用matlab 实现两信号的卷积 院 (系): 应用科技学院 专 业: 电子信息工程 学生姓名: 蒋耀华 学 号: 0801130215 指导教师: 严素清 童有为 纪元法 2011 ...查看


  • 房屋测绘专业毕业论文
  • 远程与继续教育学院 本科毕业论文(设计) 题目:<控制测量简易平差程序设计> 学习中心: 浙江分院 学 号: 姓 名: 专 业: 指导教师: 2014 年 3 月 5 日 中国地质大学(武汉)远程与继续教育学院 本科毕业论文(设 ...查看


  • 线性方程组的解法
  • 线性方程组的解法 1 引言 在科学研究和大型工程设计中出现了越来越多的数学问题,而这些问题往往需要求数值解.在进行数值求解时,经离散后,常常归结为求解形如Ax= b的大型线性方程组.而如插值公式,拟合公式等的建立,微分方程差分格式的构造等, ...查看


热门内容