数值计算方法实验报告Word文档格式.docx
《数值计算方法实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《数值计算方法实验报告Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
![数值计算方法实验报告Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/21/e7e5d28f-3fb7-4795-9129-a2f75fd00564/e7e5d28f-3fb7-4795-9129-a2f75fd005641.gif)
whileabs(xk-x0)>
eps
k=k+1
p=xk
xk=(sin(x0)+12*(x0)-1)^(1/3)
x0=p
end
4.调试:
x=roots(3.1415926,0.000001)
k=
1
xk=
3.3232
2
p=
x0=
5.实验小结:
基本掌握了简单迭代法求解非线性方程组的方法,对matlap程序有了初步了解。
实验二
解线性方程组的直接法
1.掌握高斯(Gauss)消元法及选列主元素的技术
2.掌握追赶法
用追赶法求求下述三对角线性方程组的解
追赶法求解线性方程组。
2.算法描述:
对三对角线矩阵的LU分解。
functionx=zgf(a,b,c,d)
x=d;
n=length(x);
forj=1:
n-1
mu=a(j)/b(j);
b(j+1)=b(j+1)-mu*c(j);
x(j+1)=x(j+1)-mu*x(j);
x(n)=x(n)/b(n);
forj=n-1:
-1:
1
x(j)=(x(j)-c(j)*x(j+1))/b(j);
4.调试:
-0.2667-0.2000-0.1333-0.0667
5.实验小结:
掌握了追赶法解决三对角线性方程的基本解法。
实验三
解线性方程组的迭代法
1.理解迭代法的基本原理及特点。
2.掌握jacobi迭代和Gauss-Seidel迭代格式的分量形式,矩阵形式及其各自特点。
3.掌握jacobi迭代和Gauss-Seidel迭代算法的程序实现方法。
用雅可比迭代法求下述线性方程组的解
要求:
选取不同初值x0,对于给定精度ε=10-6,用三种迭代法计算,观察迭代次数并分析计算结果给出结论。
雅克比迭代。
Ax=b,A=L+D+U,迭代公式:
x=-D-1(L+U)x+D-1b
x=-D-1(L+U)x+D-1
functionx=jacobiff(a,b,eps)
n=length(a);
d=diag(diag(a));
l=tril(a,-1);
u=triu(a,1);
x0=diag(zeros(n));
x=-inv(d)*(l+u)*x0+inv(d)*b
whilenorm(x-x0)>
eps;
p=x;
x=-inv(d)*(l+u)*x+inv(d)*b
x0=p;
4.调试:
>
a=[-3-100;
-12-10;
0-12-1;
00-12];
b=[1000]'
;
jacobiff(a,b,0.000001)
k=1
x=-0.3333
0
k=2
-0.1667
k=3
x=-0.2778
-0.0833
k=4
-0.1806
-0.0417
k=5
x=-0.2731
-0.1111
k=6
-0.1921
-0.0556
k=7
x=-0.2693
-0.1238
k=8
-0.1966
-0.0619
k=9
x=-0.2678
-0.1292
k=10
-0.1985
-0.0646
k=11
x=-0.2672
-0.1316
k=12
-0.1994
-0.0658
k=13
x=-0.2669
-0.1326
k=14
-0.1997
-0.0663
k=15
x=-0.2668
-0.1330
k=16
-0.1999
-0.0665
k=17
x=-0.2667
-0.1332
k=18
-0.1332
-0.0666
k=19
-0.1333
k=20
-0.2000
k=21
k=22
-0.0667
k=23
k=24
k=25
k=26
k=27
k=28
k=29
k=30
ans=-0.2667
5.实验小结:
实现了实验目的,掌握了雅克比迭代的基本算法。
实验四
插值法与曲线拟合
1.掌握拉格朗日(Lagrange)插值法及余项公式
2.
掌握Newton插值多项式的构造与应用,差商、差分的计算及基本性质。
3.掌握曲线拟合的最小二乘法
用牛顿插值多项式求x分别在0.5,0.85,1.05三点处的函数值。
y=f(x)的函数表
x
0.4
0.55
0.65
0.8
0.9
y
0.4175
0.57815
0.69657
0.88811
1.02652
1.设计思路:
利用已给函数表,结合牛顿差值多项式求解问题。
2.算法描述:
列出均差表,求出牛顿插值多项式,从而得到所求点的函数值。
#include<
iostream>
usingnamespacestd;
voidNewton(doublea[],doubleb[],intn)
{doubleg[5];
inti,j;
for(i=1;
i<
n;
i++)
{g[0]=b[i];
for(j=0;
j<
i;
j++)
{
g[j+1]=(g[j]-b[j])/(a[i]-a[j]);
b[i]=g[i];
}
}
return;
main()
{
inti,n=4;
doublea[]={0.4,0.55,0.65,0.8,0.9},b[]={0.4175,0.57815,0.69657,0.88811,1.02652};
doublex,y;
cout<
<
"
请输入x:
endl;
cin>
x;
Newton(a,b,n);
y=b[4];
for(i=n-1;
i>
=0;
i--)
y=y*(x-a[i])+b[i];
printf("
y=%f"
y);
return0;
}0.5219250.9564381.267565
6.实验小结:
利用c语言便写了算法,思路更直接,易懂。
实验五
数值积分
1.理解数值积分的基本思想、基本方法和基本理论
2.掌握数值积分公式的导出方法
3.掌握构造插值型求导公式的步骤、牛顿-柯特斯公式和变步长求积和龙贝格算法
4.了解高斯(Gauss)型求积公式的概念及导出方法以及数值微分机械求导法和插值求导公式
用复化梯形求积公式,求定积分
的值,要求误差不超过
。
用复化梯形求积公式求定积分的值。
=(h/2)(3*ln1+3*ln2+2*3*ln(xk))
functionTrapezia(a,b,fx,E,N)
h=(b-a)/2;
a=a+E/10;
T0=h*(subs(fx,a)+subs(fx,b));
T=0;
form=1:
N
F=0;
fork=1:
2^(m-1)
F=F+subs(fx,a+(2*k-1)*h);
end
T=0.5*T0+h*F;
ifabs(det(T-T0))<
3*E
break;
else
h=h/2;
T0=T;
fprintf('
k=%d\th=%f\tI=%f\n'
m,h,T);
fprintf('
\n***********end*************\n'
);
1.15888
5.实验小结:
实验六
常微分方程初值问题的数值解法
1.掌握常微分方程数值的基本解法、构造方法的基本思想及其各方法的异同点。
2.掌握Euler法和改进欧拉法、隐式欧拉法和梯形方法的基本公式和构造方法。
给定的初值问题
,
按梯形法,改进的欧拉法及欧拉法,步长h=0.05,
h=0.01求解上述初值问题。
*编写秦九韶算法程序,并用该程序计算多项式
在
的值
#definen5
doublex[n];
doubleb[n];
doublex0;
inti;
cout<
由高到低输入系数"
for(i=0;
cin>
x[i];
输入求值点x0"
x0;
b[0]=x[0];
for(i=1;
b[i]=b[i-1]*x0+x[i];
输出求值结果:
b[n-1]<
3.调试:
9.4035111.272313.7039
4.实验小结:
%用来就数值积分
%fx是由syms定义的函数表达式
\n***********start*************\n'
%用来减少出现除数为零的情况
%比如对含有1/x的函数积分且积分区间从0开始
%在梯形公式及Simpson公式算法中必然出现除数为零的情况
%当然我们可以在这之前就对被积函数做一定变形处理比如分部积分将分母移走
%不过我更愿意采用更简单的做法将积分下限加一个非常小的数使之不等于零
%这种处理方法对于精度要求几乎没有影响
%当然who有更好的方法欢迎交流一下!