数值方法实验报告_精品文档Word格式.doc
《数值方法实验报告_精品文档Word格式.doc》由会员分享,可在线阅读,更多相关《数值方法实验报告_精品文档Word格式.doc(12页珍藏版)》请在冰豆网上搜索。
![数值方法实验报告_精品文档Word格式.doc](https://file1.bdocx.com/fileroot1/2022-10/14/d5b8cea9-a3d6-425e-a00d-be1f38731c5c/d5b8cea9-a3d6-425e-a00d-be1f38731c5c1.gif)
再通过简单方程组的最后一个方程求出一个根,再回代到其他的方程求出另一个根,依次回代求出方程的根的过程称为回代过程。
列主元消去法就是高斯消去法,主要思想是在系数矩阵A的第一列选绝对值最大的为主元,如,当然,将增广矩阵第一行与第i行对调,之后构造Frobcius矩阵L1,第二步,在第二列及其以下选主元,如,则将增广矩阵的第k行与第一行对调,之后后遭Frobcius矩阵L2,直至进行n-1步后完成消元。
得到上三角方程组,再进行回代过程。
【实验环境】
Visualc++6.0
二、实验内容:
【实验方案】
1.追赶法求方程组的根:
设方程组为Ax=b,其中A=。
(1)将A分解为A=LU
L=,U=
(2)解Ly=b
(3)解Ux=y
2.高斯消去法解线性方程组:
方程组的系数矩阵为A=
(1)对A进行初等行变换将A变成上三角矩阵B,转化为简单方程组,此过程称为消元过程。
(2)通过简单方程组的最后一个方程先求出,再将回代到倒数第二个只含有和方程,求出,一次求出,此过程为回代过程。
列主元消去法解线性方程组:
设方程组为Ax=b,系数矩阵A为非奇异矩阵,A的增广矩阵为
第一步(k=1):
首先在A的第一行选取绝对值最大的元素,作为第一步的主元素:
,然后再交换A与b的第一行元素,再进行消元计算。
设列主元消去法已完成第一步与第k-1步,交换两行,消元计算得到与原方程组等价的方程组
第k步计算如下:
对于k=1,2,……,n-1
(1)按列选主元,确定t满足。
(2)如果,交换的第t行和第k行元素。
(3)消元计算。
消元乘数满足:
(4)回代求解:
【实验过程】
(实验步骤、记录、数据、分析)
1追赶法解方程组
打开visualc++后,新建一个名为1.c的源文件,在程序编辑器中输入附录程序1,调试源程序,出现报错依次如下:
(1)原因#include<
iostream>
这是c++文件,因为是C语言程序故改为#include<
iostream.h>
。
(2)将文件名1.c改成1.cpp
调试通过后,运行源程序得到正确的实验结果。
2,高斯法解线性方程组
打开visualc++后,新建一个名为2.c的源文件,在程序编辑器中输入附录程序2,调试源程序,出现报错依次如下:
(1)原因是#include<
stdio>
是c++的文件,编写纯c文件应该为#include<
stdio.h>
(2)原因是未声明变量,将float[4][4]改为floatA[4][4],float[4]={0.4043,0.1550,0.4240,-0.2557}
改为floatb[4]={0.4043,0.1550,0.4240,-0.2557},float[4]={0}改为floatx[4]={0}。
调试通过后运行程序得出正确实验结果。
列主元消去法街线性方程组:
打开visualc++后,新建一个名为3.c的源文件,在程序编辑器中输入附录程序3,调试源程序,出现报错如下:
原因没有声明变量float,将float[n][n]改为floata[n][n],将float[n]={0.4043,0.1550,0.4240,-0.2557},k,x[n+1],y[n+1];
改为floatb[n]={0.4043,0.1550,0.4240,-0.2557},k,x[n+1],y[n+1];
源程序调试通过后,开始运行,得出实验结果。
【实验结果】
1.追赶法求方程组的根实验结果:
2.
高斯消去法的实验结果
列主元消去法的实验结果:
高斯法和列主元消去法的比较:
列主元素消去法就是高斯消去法,但是列主元消去法比高斯消去法得到的结果更精确。
在计算机执行消去法时,要将一行是第一个元素化为1,即该行各元素同除以第一个非零元素,如果这个元素的绝对值非常小,就会导致该行其它元素变得绝对值非常大,在与其它行对应元素执行加减运算时会把其它行的元素忽略不计,使得误差增大,为了避免出现这种情况,编制程序的时候增加了选主元的步骤。
这主要是因为计算机进行的是近似计算,如果是用准确数运算,选主元的步骤是不必要的。
【实验小结】
(收获体会)
这次上机内容是关于求线性方程组的几个直接解法,包括追赶法、高斯消去法和列主元消去法。
直接法是经过有限步算术运算即可求得方程组精确解的方法(若计算过程中没有舍入误差),但实际计算中由于舍入误差的存在和影响,这种方法也只能求得线性方程组的近似解。
高斯消去法是降低阶稠密矩阵方程组的有效方法,用逐次消去未知数的方法把原来方程组化为与其等价的三角方程组,从而转化为求简单方程组的问题。
列主元消去法本质上是高斯消去法的变形,用它得到的结果比高斯消去法要更精确。
追赶法公式实际上就是把高斯消去法用到求解三对角方程组上去的结果,此时由于系数矩阵比较简单,因此使得求解计算公式也非常简单,而且计算公式中不会出现中间结果数量及的巨大增长和舍入误差的严重累积。
这次上机,让我运用所学计算机语言解决实际数学问题,不仅巩固了C语言编程的基本技能和技巧,同时对直接法求解线性方程组有了更深层次的认识和了解。
清晰地写出算法的每一步,准确无误的输入程序,仔细认真地调试,最后运行出结果,这是用计算机编程成功解决数学问题的重要步骤和保证。
三、指导教师评语及成绩:
评语
评语等级
优
良
中
及格
不及格
1.实验报告按时完成,字迹清楚,文字叙述流畅,逻辑性强
2.实验方案设计合理
3.实验过程(实验步骤详细,记录完整,数据合理,分析透彻)
4实验结论正确.
成绩:
指导教师签名:
批阅日期:
附录:
源程序
程序1:
#include<
#include<
math.h>
voidZhuigan(float*c,intn,floatx[])
{
inti,j;
floatp;
for(i=0;
i<
n-1;
i++)
{
p=(*(c+(i+1)*(n+1)+i)/(*(c+i*(n+1)+i)));
for(j=i;
j<
i+2;
j++)
{
*(c+(i+1)*(n+1)+j)-=(*(c+i*(n+1)+j)*p);
}
*(c+(i+1)*(n+1)+n)-=(*(c+i*(n+1)+n)*p);
}for(i=n-1;
i>
0;
i--)
p=(*(c+(i-1)*(n+1)+i)/(*(c+i*(n+1)+i)));
*(c+(i-1)*(n+1)+i)=0;
(*(c+(i-1)*(n+1)+n))-=(*(c+i*(n+1)+n)*p);
}
n;
{
x[i]=(*(c+i*(n+1)+n))/(*(c+i*(n+1)+i));
}
}
voidmain()
{
inti;
floatx[5];
floatc[5][6]={2,-1,0,0,0,1,
-1,2,-1,0,0,0,
0,-1,2,0,0,0,
0,0,-1,2,-1,0,
0,0,0,-1,2,0
};
Zhuigan(c[0],5,x);
5;
i++)
cout<
<
"
x["
]="
x[i]<
endl;
}
程序2:
高斯消去法C程序:
intmain(void)
{
floatA[4][4]={{0.4096,0.1234,0.3678,0.2943},
{0.2246,0.3872,0.4015,0.1129},{0.3645,0.1920,0.3781,0.0643},
{0.1784,0.4002,0.2786,0.3927}};
floatb[4]={0.4043,0.1550,0.4240,-0.2557};
floatx[4]={0};
floatAik,S;
inti,j,k;
intsize=4;
printf("
A[][]\n"
);
size;
i++)
{
for(j=0;
j++)
printf("
%f"
A[i][j]);
printf("
\n"
b[]\n"
for(i=0;
b[i]);
\n\n"
//消去过程
for(k=0;
k<
size-1;
k++)
{
if(!
A[k][k])
return-1;
for(i=k+1;
{
Aik=A[i][k]/A[k][k];
for(j=k;
{
A[i][j]=A[i][j]-Aik*A[k][j];
}
b[i]=b[i]-Aik*b[k];
}//消