数值计算方法实验指导Matlab版.docx
《数值计算方法实验指导Matlab版.docx》由会员分享,可在线阅读,更多相关《数值计算方法实验指导Matlab版.docx(54页珍藏版)》请在冰豆网上搜索。
![数值计算方法实验指导Matlab版.docx](https://file1.bdocx.com/fileroot1/2023-1/30/f510f1ea-71c4-44bd-bfb4-3da60a01e182/f510f1ea-71c4-44bd-bfb4-3da60a01e1821.gif)
数值计算方法实验指导Matlab版
《数值计算方法》
实验指导
(Matlab版)
肇庆学院数学与统计学学院
计算方法课程组
《数值计算方法》实验1报告
班级:
20xx级XXXXx班
学号:
20xx2409xxxx
姓名:
XXX
成绩:
1.实验名称
实验1算法设计原则验证(之相近数相减、大数吃小数和简化计算步骤)
2.实验题目
(1)取
,计算
和
,验证两个相近的数相减会造成有效数字的损失.
(2)按不同顺序求一个较大的数(123)与1000个较小的数(
)的和,验证大数吃小数的现象.
(3)分别用直接法和秦九韶算法计算多项式
在x=1.00037处的值.验证简化计算步骤能减少运算时间.
对于第(3)题中的多项式P(x),直接逐项计算需要
次乘法和n次加法,使用秦九韶算法
则只需要n次乘法和n次加法.
3.实验目的
验证数值算法需遵循的若干规则.
4.基础理论
设计数值算法时,应避免两个相近的数相减、防止大数吃小数、简化计算步骤减少运算次数以减少运算时间并降低舍入误差的积累.两相近的数相减会损失有效数字的个数,用一个大数依次加小数,小数会被大数吃掉,乘法运算次数太多会增加运算时间.
5.实验环境
操作系统:
Windowsxp;程序设计语言:
Matlab
6.实验过程
(1)直接计算并比较;
(2)法1:
大数逐个加1000个小数,法2:
先把1000个小数相加再与大数加;
(3)将由高次项到低次项的系数保存到数组A[n]中,其中n为多项式次数.
7.结果与分析
(1)计算的
=,
.
分析:
(2)123逐次加1000个
的和是,先将1000个
相加,再用这个和与123相加得.
分析:
(3)计算次的多项式:
直接计算的结果是,用时;
用秦九韶算法计算的结果是,用时.
分析:
8.附录:
程序清单
(1)两个相近的数相减.
%*************************************************************
%*程序名:
ex1_1.m*
%*程序功能:
验证两个相近的数相减会损失有效数字个数*
%*************************************************************
%x=;
%y=;
z=1e16;
x,y
======================================================================
(2)大数吃小数
%*************************************************************
%*程序名:
ex1_2.m*
%*程序功能:
验证大数吃小数的现象.*
%*************************************************************
clc;%清屏
clearall;%释放所有内存变量
formatlong;%按双精度显示浮点数
z=123;%大数
t=3e-15;%小数
x=z;%大数依次加小数
%重复1000次给x中加上t
y=0;%先累加小数
%重复1000次给y中加上t
y=z+y;%再加到大数
x,y
======================================================================
(3)秦九韶算法
%*************************************************************
%*程序名:
ex1_3.m*
%*程序功能:
验证秦九韶算法可节省运行时间.*
%*************************************************************
clc;%清屏
clearall;%释放所有内存变量
formatlong;%按双精度显示浮点数
A=[8,4,-1,-3,6,5,3,2,1,3,2,-1,4,3,1,-2,4,6,8,9,50,-80,12,35,7,-6,42,5,6,23,74,65,55,80,78,77,98,56];
A(10001)=0;%扩展到10001项,后面的都是分量0
%A为多项式系数,从高次项到低次项
x=1.00037;
n=9000;%n为多项式次数
%直接计算
begintime=clock;%开始执行的时间
%求x的i次幂
%累加多项式的i次项
endtime=clock;%结束执行的时间
time1=etime(endtime,begintime);%运行时间
disp('直接计算');
disp(['p(',num2str(x),')=',num2str(p)]);
disp(['运行时间:
',num2str(time1),'秒']);
%秦九韶算法计算
begintime=clock;%开始执行的时间
%累加秦九韶算法中的一项
endtime=clock;%结束执行的时间
time2=etime(endtime,begintime);%运行时间
disp('');
disp('秦九韶算法计算');
disp(['p(',num2str(x),')=',num2str(p)]);
disp(['运行时间:
',num2str(time2),'秒']);
《数值计算方法》实验1报告
班级:
20xx级XXXXx班
学号:
20xx2409xxxx
姓名:
XXX
成绩:
1.实验名称
实验1算法设计原则验证(之数值稳定性)
2.实验题目
计算定积分
,分别用教材例1-7推导出的算法A和B,其中:
算法A:
算法B:
验证算法不稳定时误差会扩大.
3.实验目的
验证数值算法需遵循的若干规则.
4.基础理论
设计数值算法时,应采用数值稳定性好的算法.数值稳定的算法,误差不会放大,甚至会缩小;而数值不稳定的算法会放大误差.
5.实验环境
操作系统:
Windowsxp;程序设计语言:
Matlab
6.实验过程
分别用数组IA[]和IB[]保存两种算法计算的结果.
7.结果与分析
运行结果:
(或拷屏)
n
算法A
算法B
精确值
0
1
2
3
4
5
6
7
8
9
10
分析:
8.附录:
程序清单
%*************************************************************
%*程序名:
ex1_4.m*
%*程序功能:
验证数值稳定性算法可控制误差.*
%*************************************************************
clc;%清屏
clearall;%释放所有内存变量
formatlong;%按双精度显示浮点数
I=[0.63212055882856,0.36787944117144,0.26424111765712,0.20727664702865,...
0.17089341188538,0.14553294057308,0.12680235656154,0.11238350406938,...
0.10093196744492,0.09161229300662,0.08387707010843];
%保留14位小数的精确值,…是Matlab中的续行符
%算法A
IA
(1)=0.6321;%Matlab下标从1开始,所以要用IA(n+1)表示原问题中的I(n)
%算法B
disp('n算法A算法B精确值');
forn=1:
11
fprintf('%2d%14.6f%14.6f%14.6f\n',n-1,IA(n),IB(n),I(n));
end
%n显示为2位整数,其它显示为14位其中小数点后显示6位的小数
《数值计算方法》实验1报告
班级:
20xx级XXXXx班
学号:
20xx2409xxxx
姓名:
XXX
成绩:
1.实验名称
实验1算法设计原则(除数绝对值不能太小)
2.实验题目
将线性方程组增广矩阵利用初等行变换可化为
由此可解得
.分别解增广矩阵为
和
的方程组,验证除数绝对值远小于被除数绝对值的除法会导致结果失真.
3.实验目的
验证数值算法需遵循的若干规则.
4.基础理论
设计数值算法时,应避免除数绝对值远小于被除数绝对值的除法,否则绝对误差会被放大,使结果失真.
5.实验环境
操作系统:
Windowsxp;程序设计语言:
Matlab
6.实验过程
用二维数组A和B存放方程组的增广矩阵,利用题目所给初等行变换求解方程组.
7.结果与分析
第1种顺序的方程组的解为x=,y=;
第2种顺序的方程组的解为x=,y=.
分析:
8.附录:
程序清单
%*************************************************************
%*程序名:
ex1_5.m*
%*程序功能:
验证除数的绝对值太小可能会放大误差.*
%*************************************************************
clc;
A=[1e-16,1,1;2,1,2];
B=[2,1,2;1e-16,1,1];%增广矩阵
%方程组A
%m=-a_{21}/a_{11}是第2行加第1行的倍数
%消去a_{21}
%m=-a_{12}/a_{22}是第1行加第2行的倍数
%消去a_{12},系数矩阵成对角线
%未知数x1的值
%未知数x2的值
disp(['方程组A的解:
x1=',num2str(A(1,3)),',x2=',num2str(A(2,3))]);
disp('');
%方程组B
%m=-b_{21}/b_{11}是第2行加第1行的倍数
%消去b_{21}
%m=-b_{12}/b_{22}是第1行加第2行的倍数
%消去b_{12},系数矩阵成对角线
%未知数x1的值
%未知数x2的值
disp(['方程组B的解:
x1=',num2str(B(1,3)),',x2=',num2str(B(2,3))]);
《数值计算方法》实验2报告
班级:
20xx级XXXXx班
学号:
20xx2409xxxx
姓名:
XXX
成绩:
1.实验名称
实验2非线性方程的迭代解法(之简单迭代法)
2.实验题目
用简单迭代法求方程
在区间[1,2]内的一个实根,取绝对误差限为
.
3.实验目的
掌握非线性方程的简单迭代法.
4.基础理论
简单迭代法:
将方程
改写成等价形式
,从初值
开始,使用迭代公式
可以得到一个数列,若该数列收敛,则其极限即为原方程的解.取数列中适当的项可作为近似解.
5.实验环境
操作系统:
Windowsxp;程序设计语言:
Matlab
6.实验过程
7.结果与分析
8.附录:
程序清单
《数值计算方法》实验2报告
班级:
20xx级XXXXx班
学号:
20xx2409xxxx
姓名:
XXX
成绩:
1.实验名称
实验2非线性方程的迭代解法(之Newton迭代法)
2.实验题目
用Newton迭代法求方程
在区间[1,2]内的一个实根,取绝对误差限为
.
3.实验目的
掌握求解非线性方程的Newton迭代法.
4.基础理论
Newton迭代法:
解方程
的Newton迭代公式为
.
5.实验环境
操作系统:
Windowsxp;程序设计语言:
Matlab
6.实验过程
7.结果与分析
8.附录:
程序清单
《数值计算方法》实验2报告
班级:
20xx级XXXXx班
学号:
20xx2409xxxx
姓名:
XXX
成绩:
1.实验名称
实验2非线性方程的迭代解法(之对分区间法)
2.实验题目
用对分区间法求方程
在区间[1,1.5]内的一个实根,取绝对误差限为
.
3.实验目的
掌握求解非线性方程的对分区间法.
4.基础理论
对分区间法:
取[a,b]的中点p,若f(p)≈0或b–a<ε,则p为方程
的近似解;
若f(a)f(p)<0,则说明根在区间取[a,p]中;否则,根在区间取[p,b]中.将新的有根区间记为[a1,b1],对该区间不断重复上述步骤,即可得到方程的近似根.
5.实验环境
操作系统:
Windowsxp;程序设计语言:
Matlab
6.实验过程
用宏定义函数f(x);
为了循环方便,得到的新的有根区间始终用[a,b]表示;
由于新的有根区间可能仍以a为左端点,这样会反复使用函数值f(a),为减少运算次数,将这个函数值保存在一个变量fa中;
同样在判断新的有根区间时用到函数值f(p),若新的有根区间以p为左端点,则下一次用到的f(a)实际上就是现在的f(p),为减少运算次数,将这个函数值保存在一个变量fp中.
算法的伪代码描述:
Input:
区间端点a,b;精度要求(即误差限)ε;函数f(x);最大对分次数N
Output:
近似解或失败信息
行号
伪代码
注释
1
n←1;
对分次数计数器
2
fa←f(a);
左端点的函数值
3
whilen≤Ndo
4
p←(a+b)/2;
区间中点
5
fp←f(p);
中点的函数值
6
iffp=0or(b-a)/2<εthen
函数值为0或半区间长不超ε
7
returnp;
输出近似解并退出程序
8
endif
9
n←n+1;
计数器加一
10
iffa·fp>0then
若中点与左端点函数值同号
11
a←p;
新区间取右半区间
12
fa←fp;
13
else
否则
14
b←p;
新区间取左右半区间
15
endif
16
enddo
17
return错误信息
输出错误信息并结束程序
7.结果与分析
8.附录:
程序清单
说明:
源程序中带有数字的空行,对应着算法描述中的行号
%**********************************************************
%*程序名:
Bisection.m*
%*程序功能:
使用二分法求解非线性方程.*
%**********************************************************
f=inline('x^3-x-1');%定义函数f(x)
a=input('有根区间左端点:
a=');
b=input('右端点:
b=');
epsilon=input('误差限:
epsilona=');
N=input('最大对分次数:
N=');
1%对分次数计数器n置1
2%左端点的函数值给变量fa
fprintf('\nkpf(p)a(k)f(a(k))');
fprintf('b(k)b-a\n');
%显示表头
fprintf('%2d%36.6f%12.6f%12.6f%12.6f\n',0,a,fa,b,b-a);
%占2位其中0位小数显示步数0,共12位其中小数6位显示各值
3%whilen≤N
4%取区间中点p
5%求p点函数值给变量fp
fprintf('%2d%12.6f%12.6f',n,p,fp);%输出迭代过程中的中点信息p和f(p)
6%如果f(p)=0或b-a的一半小于误差限ε
fprintf('\n\n近似解为:
%f\n',p);%则输出近似根p(7)
return;%并结束程序(7)
8
9%计数器加1
10%若f(a)与f(p)同号
11%则取右半区间为新的求根区间,即a取作p
12%保存新区间左端点的函数值
13%否则
14%左半区间为新的求根区间,即b取作p
15
fprintf('%12.6f%12.6f%12.6f%12.6f\n',a,fa,b,b-a);
%显示新区间端点及左端函数值、区间长度
16
fprintf('\n\n经过%d次迭代后未达到精度要求.\n',N);%输出错误信息(行17)
《数值计算方法》实验2报告
班级:
20xx级XXXXx班
学号:
20xx2409xxxx
姓名:
XXX
成绩:
1.实验名称
实验2非线性方程的迭代解法(之Aitken-Steffensen加速法)
2.实验题目
用Aitken-Steffensen加速法求方程
在区间[1,2]内的一个实根,取绝对误差限为
.
3.实验目的
熟悉求解非线性方程的Aitken-Steffensen加速法.
4.基础理论
将方程
改写成等价形式
,得到从初值
开始的迭代公式
后,基于迭代公式
的Aitken-Steffensen加速法是通过“迭代-再迭代-加速”完成迭代的,具体过程为
.
5.实验环境
操作系统:
Windowsxp;程序设计语言:
Matlab
6.实验过程
为了验证Aitken-Steffensen加速法可以把一些不收敛的迭代加速成迭代收敛,我们使用将方程组变形为
,取迭代函数
,并利用宏定义出迭代函数.
由于不用保存迭代过程,所以用x0表示初值同时也存放前一步迭代的值,y和z是迭代过程中产生的yk和zk,x存放新迭代的结果.
算法的伪代码描述:
Input:
初值x0;精度要求(即误差限)ε;迭代函数φ(x);最大迭代次数N
Output:
近似解或失败信息
行号
伪代码
注释
1
n←1;
迭代次数计数器
2
whilen≤Ndo
3
y←φ(x0);
迭代
4
z←φ(y);
再迭代
5
x←x0–(y-x0)2/(z-2y+x0)
加速
6
if|x–x0|<εthen
如果达到精度要求
7
returnx;
则输出近似值并退出程序
8
endif
9
n←n+1;
计数器加一
10
x0←x;
新近似值给x0做下次的初值
11
enddo
12
return错误信息
输出错误信息并结束程序
7.结果与分析
8.附录:
程序清单
%*************************************************************
%*程序名:
Aitken_Steffensen.m*
%*程序功能:
用Aitken-Steffensen加速法求方程.*
%*************************************************************
clc;
clearall;
phi=inline('0.5*sqrt(10-x^3)');%迭代函数
x0=input('初值:
x0=');
epsilon=input('误差限:
epsilon=');
N=input('最大迭代次数:
N=');
disp('n迭代中间值y(n-1)再迭代结构z(n-1)加速后的近似值x(n)');
fprintf('%2d%54.6f\n',0,x0);
%占2位整数显示步数0,为了对齐,占54位小数6位显示x0
1%n是计数器
2%whilen<=N
y=3;%迭代
z=3;%再迭代
x=3;%加速
%x0初值及前一步的近似值,y和z是中间变量,x是下一步的近似值
fprintf('%2d%18.6f%18.6f%18.6f\n',n,y,z,x);
%显示中间值和迭代近似值
6%如果与上一步近似解差的绝对值不超过误差限
fprintf('\n\n近似解x≈x(%d)≈%f\n',n,x);
%则输出近似根(7),可简略为:
fprintf('\n\n近似解x=%f',x);
return;%并结束程序(7)
8%相当于endif
9%计数器加1
10%新近似值x作为下一次迭代的初值
11
fprintf('\n迭代%d次还不满足误差要求.\n\n',N);%输出错误信息(12)
《数值计算方法》实验2报告
班级:
20xx级XXXXx班
学号:
20xx2409xxxx
姓名:
XXX
成绩:
1.实验名称
实验2非线性方程的迭代解法(之Newton下山法)
2.实验题目
用Newton下山法求方程
在区间[1,2]内的一个实根,取绝对误差限为
.
3.实验目的
熟悉非线性方程的Newton下山法.
4.基础理论
Newton下山法:
Newton下山法公式为
,使
,其中
.
5.实验环境
操作系统:
Windowsxp;程序设计语言:
Matlab
6.实验过程
定义函数f(x)和df(x),其中df(x)是f(x)的导函数.
每步迭代时先取下山因子为1,尝试迭代,判断尝试结果是否满足下山因