北京信息科技大学
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京信息科技大学
实验报告
实验项目线性方程组求解
班级通信1003班
姓名/学号李叶林2010010422
实验日期2011-12-29
成绩
一、 实验内容
利用杜利特尔分解法求解线性方程组
实验要求
要求
❖编程实现杜利特尔分解法
❖输出矩阵L,U,中间向量y,并输出方程组的解x
实验题3
求解方程组
12312312324326225
x x x x x x x x x ++=⎧⎪
++=⎨⎪++=⎩
二、 实验原理
j u 1j
a 1=n
j ,,2,1Λ=U 的第一行11
1
1u a l i i =n
i ,,3,2Λ=L 的第一列
------(1)------(2)
∑-=-=11
r k kj
rk rj rj u l a u n r ,,2,1Λ=n
r j ,,Λ=U 的第r 行------(3)(逐行算出)
rr
r k kr
ik ir ir u u l a l ∑-=-=
1
1
1,,2,1-=n r Λn
r i ,,1Λ+=L 的第r 列------(4)
(逐列算出)
称上述(1) ~ (4)式所表示的分解过程为Doolittle 分解
三、 程序
#include
using namespace std; int main() {
double A[N+1][N+1]={{0,0,0,0},{0,2,1,1},{0,1,3,2},{0,1,2,2}}; double L[N+1][N+1]={0}; double U[N+1][N+1]={0}; double b[N+1]={0,4,6,5}; double y[N+1]; double x[N+1]; int i,j,k,p;
for(j=1;j<=N;j++)
U[1][j]=A[1][j];
L[1][1]=1;
for(i=2;i<=N;i++)
{L[i][1]=A[i][1]/U[1][1];
L[i][i]=1;
}
for(k=2;k<=N;k++)
{ for(j=k;j<=N;j++)
{double l=0;
for(p=1;p<=k-1;p++)
l+=L[k][p]*U[p][j];
U[k][j]=A[k][j]-l;
}
for(i=k+1;i<=N;i++)
{double l=0;
for(p=1;p<=k-1;p++)
l+=L[i][p]*U[p][k];
L[i][k]=(A[i][k]-l)/U[k][k];
}
}
y[1]=b[1];
for(k=2;k<=N;k++)
{ double l=0;
for(j=1;j<=k-1;j++)
l+=L[k][j]*y[j];
y[k]=b[k]-l;
}
x[N]=y[N]/U[N][N];
for(k=N-1;k>=1;k--)
{
double l=0;
for(j=k+1;j<=N;j++)
l+=U[k][j]*x[j];
x[k]=(y[k]-l)/U[k][k];
}
printf("向量y为:");
for(i=1;i<=N;i++)printf("%.1lf\t",y[i]);printf("\n"); cout<<"L:"< for(i=1;i<=N;i++) {for(j=1;j<=N;j++) cout< cout< cout< cout<<"U:"< for(i=1;i<=N;i++) {for(j=1;j<=N;j++) cout< cout< cout< cout<<"方程组的解:"< for(i=1;i<=N;i++) cout<<"x"< return 1; } 四、实验结果 五、实验心得 了解了如何利用杜利特尔分解法求解线性方程组,编程过程中应细心,善于发现问题