第 PAGE 17 页 共 NUMPAGES 17 页

基于C语言实现大规模节点

方程的LU分解算法

班级 : 0403205班

学号 : 040320510

姓名 : 邵汉钦

完成日期 : 2006-03-25

基于C语言实现大规模节点方程的LU分解算法

[实验目的及主要内容]

通过编程实现基于C语言的大规模节点方程的LU分解算法,熟悉在电路仿真中运用的节点分析法计算机实现过程,对算法的收敛性、效率、计算过程中节省内存的手段和重要性有清晰的认识,从而能更好地运用商用大规模仿真软件或自己动手编写仿真软件。

[实验原理]

对复杂网络所建立的节点方程组,常常是高阶线性方程组,所以说,对线性电路的稳态分析,最终可归结为高阶线性方程组得求解问题。

线性方程组的解法很多,一般可以分为两大类:直接法和迭代法。直接法是通过对方程组直接进行一系列的运算而得到方程的解;迭代法是一开始就给出一个近似的解,然后通过逐次逼近来求LAE较好的近似解,迭代过程要一直进行到近似解达到预定的精度为止(即收敛到精确解)。直接法的两个基本方法是高斯消元法和LU分解法,它们也是稀疏矩阵技术的基础。

LU分解是矩阵三角化分解法之一,也称三角分解法。它是把方程中的系数矩阵分解成下三角矩阵L和上三角矩阵U的乘积

A=LU

式中,L为主对角线以上的元素均为零的下三角矩阵;U为主对角线以下的元素均为零,且主对角线元素均为1的上三角矩阵。上式展开就是:

=

则方程变为: AX=LUX=B

一旦A分解成功,我们就可以设UX=Y,方程就变成一个下三角形系统LY=B,解此方程可以用所谓“前代”的方法,即从第1个方程求出,进而从第2个方程求出,依次类推,直到求出,把,,…,代入第n个方程求出。然后求解上三角系统UX=Y,这样就可以用回代的方法求出X来。

LU分解法的优点主要表现在当系数矩阵A不变,即只是网络元件参数 不变,仅仅是右手边向量B变化时,即外加激励信号变化时,可以减少解方程的计算工作量。因为一旦系数矩阵分解成L和U的乘积,就可以把L,U存储起来,每次右手边向量变化时,只需做前代和回代,即可完成方程的求解。它在灵敏度计算中需要求转置的方程组时也方便得多。

下面推导对A矩阵进行LU分解的方法。

在以上推导过程中得到下式:

=

将其按矩阵乘法展开,就可以推导出

L矩阵的第1列元素

U矩阵的第1行元素

L矩阵的第2列元素

U矩阵的第2行元素

若按此方式对列和行依次交换计算下去,最终即将求出 L和U矩阵的全部元素,其通用公式为:

以上公式给出了对A矩阵进行LU分解的基本方法,在此基础上就可以编程实现LU分解法解线性方程组。

[程序设计]

按以上公式可以归纳出如下的求解线性代数方程组得LU分解算法:

输入:A,非奇异矩阵n×n。
令m=1。
计算L的第m列:
若m=n,则分解结束。
计算U的第m行:
m=m+1,返回第2步。
前代:
回代:
LU分解法的计算工作量约为。
由上述步骤可以得出如下的程序流程图:
输入
输入
A矩阵
开始
计算L的第k列
令k=1
计算U的第k行
k=k+1
k=n?
回代求Xk
前代求Yk
结束
N
Y
[程序源代码]
//********************************************************************************
//基于C语言实现大规模节点方程的LU分解算法
// 0403205班 040320510 邵汉钦
// 完成日期:2006年3月25日
//********************************************************************************
//程序功能描述:
//设n元线性方程组的矩阵形式为 AX=B
//输入矩阵A和B,根据LU分解法求解方程组,得到矩阵X
//********************************************************************************
//
#include 
#pragma hdrstop
#include "Unit1.h"
#include 
#include 
#include 
#include 
#include 
#include 
//
#pragma package(smart_init)
#pragma