数值计算实验报告Word下载.docx
《数值计算实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《数值计算实验报告Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
a.为函数方程f(x)=0构造一个等价方程x=g(x)
b.从某个近似根x0出发,构造迭代格式x=g(x)n+1c.判断g(x)收敛,若收敛,则可解得最终答案。
三、主要仪器设备
VisualStudio2010
位计算机64
四、结构程序设计
1.程序代码
1.1二分法:
#includestdio.h
#includemath.h
voidmain()
{inti=0,n;
//定义for循环的条件,i为循环次数,n为二分法达到精度所需次数。
intp=2,q=200000;
//计算n需要对log底数与对数的赋值。
floata,b,t;
//定义所求x的初始区间以及中间数t。
a=1;
b=2;
t=(a+b)/2;
printf(
=%f\n,log(q)/log(p));
//计算并输出n。
n=(int)(log(q)/log(p)+1);
//根据log的换底公式logN(a)=log(a)/log(N)求二分法在精//度范围内需要计算的次数。
牰湩晴尨二分法计算次数为n=%d\n,n);
//对n取整表示二分法在精度范围内需要计算的次数。
for(i=0;
i<
=n;
i++)
{t=(a+b)/2;
if(t*t*t+4*t*t-10>
0)//二分法取上限条件。
b=t;
elsea=t;
//二分法取下限条件。
牰湩晴尨?
?
氥屦湜?
※//输出每次计算求得的x。
}
}
1.2迭代法:
{inti;
//定义迭代次数
floata,x,t;
//a为初始值,x为迭代的x,t为过程量
牰湩晴尨输入初始值x0:
);
scanf(%f,&
a);
牰湩晴尨へ┽屦湜?
※//输入初始值x0
x=a;
i=0;
do{
t=x;
x=(float)(sqrt(10/(4+x)));
//迭代格式
i++;
※
}while(fabs(x-t)>
(1/2/100000));
//在精度要求内迭代并输出每个x的值
结果输出//x%d=%f\n,a,i-1,x);
所求方程的近似根为,时x0=%f当牰湩晴尨
五、实验结果与分析
迭代法实验结果二分法实验结果
:
*-5*n,|<
(b-a)/2-x-x|<
10,故二分法用公式精度满足结果分析[1本题目求根区间为,2],|x|xnn可求得二分次数并输出每次结果。
对迭代法首先要求建立迭代格式。
迭代格式经计算已输入程序之中,故直接给初值便可利用迭代法求出精度下的解。
六、讨论、心得
每次的实验都是对已学过的理论知识的一种实战。
通过本次实验,我将二分法与迭代法的思路清晰化并且将其变成计算机设计语言编写出来,运用到了实际解决问题上感觉很好。
我自认为本次跟其他同学比较的优点在于我在二分法实现的时候首先利用换底公式将需要的二分次输输出,如此便很清晰明了的知道接下来每一步的意思。
迭代法给我的感觉便是高度的便捷简化,仅用几行代码便可以同样解决问题。
相比较二分法来说,我更喜欢迭代的思路。
实验二线性方程组的直接解法
1.目的要求:
分解法、追赶法求解方程组LUGauss消元法、合理利用并任选
1.实验题目:
合理利用Gauss消元法、LU分解法、追赶法求解下列方程组:
123x14?
1?
①8x012?
2?
13x241?
3
2.实验原理:
求解线性方程组的一种方法是消元与回带。
如果在消元过程中A的主元素不为零(即矩阵A的各阶顺序主子式不为零),则可通过高斯消元法求出Ax=b的解。
3.算法:
a.判断系数矩阵A各阶顺序主子式是否为零
b.消元将增广矩阵变成上三角矩阵;
c.回代求解
#include<
stdio.h>
#include<
math.h>
#defineN20
{
intk,n,i,j;
doublea[N][N],b[N],sum,x[N],l;
//定义a[N][N]为系数矩阵,b[N]为结果,
//sum用作回代,x[N]为方程组解,l为消元系数
牰湩晴尨输入线性方程组元数n:
//输入线性方程组的元数n
scanf(%d,&
n);
牰湩晴尨请按行输入初始增广矩阵:
\n);
//输入初始的增广矩阵
for(i=0;
n;
{
for(j=0;
j<
j++)
scanf(%lf,&
a[i][j]);
b[i]);
牰湩晴尨你输入的初始增广矩阵为:
//输出初始的增广矩阵
i++);
for(i=0;
printf(%f,a[i][j]);
printf(%f\n,b[i]);
printf(\
for(k=0;
k<
n-1;
k++)
for(i=k+1;
i++)//消元过程
l=a[i][k]/a[k][k];
//计算消元系数l;
for(j=k;
j++)//将系数矩阵变成上三角矩阵
a[i][j]=a[i][j]-a[k][j]*l;
b[i]=b[i]-b[k]*l;
牰湩晴尨第%d次消元后的结果\n,k+1);
//每次消元后的矩阵输出
j++)printf(%f,a[i][j]);
牰湩晴尨回代求解如下:
利用矩阵乘法公式变形的回代过程//x[n-1]=b[n-1]/a[n-1][n-1];
for(k=n-2;
k>
=0;
k--)
sum=0;
for(j=k+1;
j++)sum=sum+a[k][j]*x[j];
x[k]=(b[k]-sum)/a[k][k];
潦?
牰湩晴尨學搥?
春尠椬砬楛?
※牰湩晴尨屜屮?
尠尯输出解向量x
结果
结果分析:
如上图所示,输入线性方程组元数n=3,则会要求输入3*3的系数矩阵A与向量b构成的增广矩阵。
根据算法需要将系数矩阵A消元成上三角矩阵。
随后根据矩阵乘法公式变形做对应的回代。
本次实验在编写时候感觉还好,感觉将思路变成了程序设计语言,得以实现题目的要求。
但是在运行以及结果分析的时候,感觉到了本实验的一些不足之处:
就是我的实验虽然可以实现不同的元数的线性方程组求解,但是缺少了分析初始条件——主元素不能为零。
故可以在消元的循环代码中加一条判断语句,以作改进。
其他问题上,在编写的时候遇到了定义变量困难的问题。
这点经分析是个人程序设计语言素养还不纯熟,也可归结于对算法的实现还处在初步认识阶段。
不过经过本次实践,我确实深刻认识到了课上的理论概念,相信在未来的考试中可以很好的掌握。
实验三线性方程组的迭代解法
使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。
10x?
x?
2x?
7.2?
321?
8.3?
5x?
4.2?
123
312?
1322.实验原理:
设有线性方程组Ax=b,将方程组变形为:
x=Bx+f,由初始解逐步迭代即可得到方程组的解。
#include<
stdlib.h>
intmain()
intk,n,i,j;
doublea[N][N],b[N],sum,x[3]={0,0,0};
//定义a[N][N]为系数矩阵,b[N]为结果
//sum用作回代,x[N]为每步迭代解
牰湩晴尨输入线性方程组元数n:
scanf(%d,&
牰湩晴尨请输入x的初始解:
//给x[i]定义初值都是0
{scanf(%lf,&
x[i]);
牰湩晴尨你输入x解为:
//输出x[i]
{printf(%f,x[i]);
请按行输入初始增广矩阵:
//输入原始增广矩阵
{for(j=0;
牰湩晴尨你输入的初始增光矩阵为:
//输出原始增广矩阵
牰湩晴尨雅可比迭代法求解:
for(k=0;
8;
sum=0;
sum用作公式回代
for(j=0;
j<
j++)
if(i==j)continue;
sum=sum+a[i][j]*x[j];
x[i]=(b[i]-sum)/a[i][i];
牰湩晴尨第%d次迭代:
′\n,k+1);
for(i=0;
i<
i++)
printf(%f\t,x[i]);
printf(\
本次实验给我感觉来说比较简单。
可能是由于经过了上一个实验,即对线性方程组求解的编程,因此思路还是比较清晰的。
对线性方程组的迭代解法如雅可比解法,其重点在于迭代收敛判断、公式以及精度的设置。
由于本题给出了直接是严格对角优势矩阵,故没有判断收敛。
这也是本实验不足的地方。
实验五代数插值
使用拉格朗日插值法或牛顿插值法求解:
已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。
x0.400.550.650.800.901.05
1.25386
0.69675
1.02652
0.88811
0.41075
f(x)
0.57815
二、实验内容和原理
个点的函数值如下表所示,运在6使用拉格朗日插值法或牛顿插值法求解:
已知f(x)的近似值。
用插值方法,求f(0.596)0.400.550.650.800.901.05X
2.实验原理:
以线性插值为基本导出:
已知函数y=f(x)在给定互异点x0,x1上的值为y0=f(x0),y1=f(x1)线性插值就是构造一个一次多项式P1(x)=ax+b,使它满足条件P1(x0)=y0P1
(x1)=y1。
其几何解释就是一条直线,通过已知点A(x0,y0),B(x1,y1)。
拉格朗日代数差值需要构建基函数L(x)。
代入公式计算Ln(x),最后再求误差(插值余项)即可。
#defineN100
inta,n,i,j;
doublex[N],y[N],x0=0,m=1,l=0;
牰湩晴尨请输入已知的点数n\n);
//输入给定点数
for(i=1;
i++)//给点的(x,y)赋值
牰湩晴尨请输入X[%d],Y[%d]:
i,i);
scanf(%lf%lf,&
x[i],&
y[i]);
牰湩晴尨學搥?
氥?
孹搥?
學嵩椬礬楛?
牰湩晴尨请输入要测得值\n);
x0);
//拉格朗日代数插值思路
for(j=1;
if(i!
=j)
m=m*((x0-x[j])/(x[i]-x[j]));
//每一项基函数代公式运算
else;
l+=(y[i]*m);
m=1;
牰湩晴尨拉格朗日插值法的结果为%lf,l);
return0;
该算法主要考虑的便是点的输入与点的代入问题。
点的输入根据设置数组以及循环便可以轻松解决。
而点的代入则根据不同的算法公式进行。
在拉格朗日插值算法中,需要将点代入公式。
公式的输入是不需要怎么逻辑的。
因此本实验很容易通过。
总体来讲本次实验很顺利。
我对此比较感兴趣,因为感觉这个是解决实际问题很有效的思路。
以后可以大量用到。