数值计算方法实验报告.docx
- 文档编号:3313245
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:14
- 大小:30.62KB
数值计算方法实验报告.docx
《数值计算方法实验报告.docx》由会员分享,可在线阅读,更多相关《数值计算方法实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
数值计算方法实验报告
09-10
(2)信计08级
数值计算方法课程设计实验报告
姓名:
王超
班级:
信计08-2班
学号:
200811011076
成绩:
实验一
实验名称:
非线性方程(组)求解
实验目的:
1.掌握二分法,迭代法,牛顿迭代法求方程近似根的基本思想与原理。
2.掌握常用迭代算法的程序实现。
实验题目:
求方程f(x)=x^3-sinx-12x=1的全部实根,
eps=0.000001
实验过程:
1.设计思路:
用简单迭代法求解。
找到收敛的迭代公式,用迭代公式求解问题。
2.算法描述;由题目f(x)=x^3-sinx-12x=1得到收敛公式
x(k+1)=(sin(xk)+12xk-1)^(1/3)
3.程序清单:
functionx=roots(x0,eps)
k=1
xk=(sin(x0)+12*(x0)-1)^(1/3)
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
k=
2
p=
3.3232
xk=
3.3232
x0=
3.3232
5.实验小结:
基本掌握了简单迭代法求解非线性方程组的方法,对matlap程序有了初步了解。
实验二
实验名称:
解线性方程组的直接法
实验目的:
1.掌握高斯(Gauss)消元法及选列主元素的技术
2.掌握追赶法
实验题目:
用追赶法求求下述三对角线性方程组的解
实验过程:
1.设计思路:
追赶法求解线性方程组。
2.算法描述:
对三对角线矩阵的LU分解。
3.程序清单:
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);
end
x(n)=x(n)/b(n);
forj=n-1:
-1:
1
x(j)=(x(j)-c(j)*x(j+1))/b(j);
end
4.调试:
-0.2667-0.2000-0.1333-0.0667
5.实验小结:
掌握了追赶法解决三对角线性方程的基本解法。
实验三
实验名称:
解线性方程组的迭代法
实验目的:
1.理解迭代法的基本原理及特点。
2.掌握jacobi迭代和Gauss-Seidel迭代格式的分量形式,矩阵形式及其各自特点。
3.掌握jacobi迭代和Gauss-Seidel迭代算法的程序实现方法。
实验题目:
用雅可比迭代法求下述线性方程组的解
要求:
选取不同初值x0,对于给定精度ε=10-6,用三种迭代法计算,观察迭代次数并分析计算结果给出结论。
实验过程:
1.设计思路:
雅克比迭代。
Ax=b,A=L+D+U,迭代公式:
x=-D-1(L+U)x+D-1b
2.算法描述:
Ax=b,A=L+D+U,迭代公式:
x=-D-1(L+U)x+D-1
3.程序清单:
functionx=jacobiff(a,b,eps)
n=length(a);
d=diag(diag(a));
l=tril(a,-1);
u=triu(a,1);
x0=diag(zeros(n));
k=1
x=-inv(d)*(l+u)*x0+inv(d)*b
whilenorm(x-x0)>eps;
k=k+1
p=x;
x=-inv(d)*(l+u)*x+inv(d)*b
x0=p;
end
4.调试:
>>a=[-3-100;-12-10;0-12-1;00-12];
>>b=[1000]';
>>jacobiff(a,b,0.000001)
k=1
x=-0.3333
0
0
0
k=2
x=-0.3333
-0.1667
0
0
k=3
x=-0.2778
-0.1667
-0.0833
0
k=4
x=-0.2778
-0.1806
-0.0833
-0.0417
k=5
x=-0.2731
-0.1806
-0.1111
-0.0417
k=6
x=-0.2731
-0.1921
-0.1111
-0.0556
k=7
x=-0.2693
-0.1921
-0.1238
-0.0556
k=8
x=-0.2693
-0.1966
-0.1238
-0.0619
k=9
x=-0.2678
-0.1966
-0.1292
-0.0619
k=10
x=-0.2678
-0.1985
-0.1292
-0.0646
k=11
x=-0.2672
-0.1985
-0.1316
-0.0646
k=12
x=-0.2672
-0.1994
-0.1316
-0.0658
k=13
x=-0.2669
-0.1994
-0.1326
-0.0658
k=14
x=-0.2669
-0.1997
-0.1326
-0.0663
k=15
x=-0.2668
-0.1997
-0.1330
-0.0663
k=16
x=-0.2668
-0.1999
-0.1330
-0.0665
k=17
x=-0.2667
-0.1999
-0.1332
-0.0665
k=18
x=-0.2667
-0.1999
-0.1332
-0.0666
k=19
x=-0.2667
-0.1999
-0.1333
-0.0666
k=20
x=-0.2667
-0.2000
-0.1333
-0.0666
k=21
x=-0.2667
-0.2000
-0.1333
-0.0666
k=22
x=-0.2667
-0.2000
-0.1333
-0.0667
k=23
x=-0.2667
-0.2000
-0.1333
-0.0667
k=24
x=-0.2667
-0.2000
-0.1333
-0.0667
k=25
x=-0.2667
-0.2000
-0.1333
-0.0667
k=26
x=-0.2667
-0.2000
-0.1333
-0.0667
k=27
x=-0.2667
-0.2000
-0.1333
-0.0667
k=28
x=-0.2667
-0.2000
-0.1333
-0.0667
k=29
x=-0.2667
-0.2000
-0.1333
-0.0667
k=30
x=-0.2667
-0.2000
-0.1333
-0.0667
ans=-0.2667
-0.2000
-0.1333
-0.0667
>>
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.算法描述:
列出均差表,求出牛顿插值多项式,从而得到所求点的函数值。
3.程序清单:
#include
usingnamespacestd;
voidNewton(doublea[],doubleb[],intn)
{doubleg[5];
inti,j;
for(i=1;i {g[0]=b[i]; for(j=0;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: "< 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; 4.调试: }0.5219250.9564381.267565 6.实验小结: 利用c语言便写了算法,思路更直接,易懂。 实验五 实验名称: 数值积分 实验目的: 1.理解数值积分的基本思想、基本方法和基本理论 2.掌握数值积分公式的导出方法 3.掌握构造插值型求导公式的步骤、牛顿-柯特斯公式和变步长求积和龙贝格算法 4.了解高斯(Gauss)型求积公式的概念及导出方法以及数值微分机械求导法和插值求导公式 实验题目: 用复化梯形求积公式,求定积分 的值,要求误差不超过 。 实验过程: 1.设计思路: 用复化梯形求积公式求定积分的值。 2.算法描述: =(h/2)(3*ln1+3*ln2+2*3*ln(xk)) 3.程序清单: 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; end fprintf('k=%d\th=%f\tI=%f\n',m,h,T); end fprintf('\n***********end*************\n'); end 4.调试: 1.15888 5.实验小结: 实验六 实验名称: 常微分方程初值问题的数值解法 实验目的: 1.掌握常微分方程数值的基本解法、构造方法的基本思想及其各方法的异同点。 2.掌握Euler法和改进欧拉法、隐式欧拉法和梯形方法的基本公式和构造方法。 实验题目: 给定的初值问题 , 按梯形法,改进的欧拉法及欧拉法,步长h=0.05, h=0.01求解上述初值问题。 *编写秦九韶算法程序,并用该程序计算多项式 在 的值 实验过程: 1.设计思路: 2.算法描述: 3.程序清单: #include #definen5 usingnamespacestd; main() { doublex[n]; doubleb[n]; doublex0; inti; cout<<"由高到低输入系数"< for(i=0;i cin>>x[i]; cout<<"输入求值点x0"< cin>>x0; b[0]=x[0]; for(i=1;i b[i]=b[i-1]*x0+x[i]; cout<<"输出求值结果: "< return0; } 3.调试: 9.4035111.272313.7039 4.实验小结: %用来就数值积分 %fx是由syms定义的函数表达式 functionTrapezia(a,b,fx,E,N) fprintf('\n***********start*************\n'); h=(b-a)/2; a=a+E/10;%用来减少出现除数为零的情况 %比如对含有1/x的函数积分且积分区间从0开始 %在梯形公式及Simpson公式算法中必然出现除数为零的情况 %当然我们可以在这之前就对被积函数做一定变形处理比如分部积分将分母移走 %不过我更愿意采用更简单的做法将积分下限加一个非常小的数使之不等于零 %这种处理方法对于精度要求几乎没有影响 %当然who有更好的方法欢迎交流一下! 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; end fprintf('k=%d\th=%f\tI=%f\n',m,h,T); end fprintf('\n***********end*************\n'); end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 计算方法 实验 报告