数值计算方法实验指导(Matlab版)汇总

更新时间:2023-10-27 14:48:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《数值计算方法》

实验指导

(Matlab版)

肇庆学院 数学与统计学学院

计算方法课程组

1

《数值计算方法》实验1报告

班级: 20xx级XXXXx班 学号: 20xx2409xxxx 姓名: XXX 成绩:

1. 实验名称

实验1 算法设计原则验证(之相近数相减、大数吃小数和简化计算步骤) 2. 实验题目

(1) 取z?10,计算z?1?有效数字的损失.

(2) 按不同顺序求一个较大的数(123)与1000个较小的数(3?10数吃小数的现象.

(3) 分别用直接法和秦九韶算法计算多项式

?1516z和1/(z?1?z),验证两个相近的数相减会造成

)的和,验证大

P(x)?a0xn?a1xn?1???an?1x?an

在x=1.00037处的值.验证简化计算步骤能减少运算时间.

对于第(3)题中的多项式P(x),直接逐项计算需要n?(n?1)???2?1?和n次加法,使用秦九韶算法

n?1次乘法2P(x)?(((a0x?a1)x?a2)x??an?1)x?an

则只需要n次乘法和n次加法. 3. 实验目的

验证数值算法需遵循的若干规则. 4. 基础理论

设计数值算法时,应避免两个相近的数相减、防止大数吃小数、简化计算步骤减少运算次数以减少运算时间并降低舍入误差的积累.两相近的数相减会损失有效数字的个数,用一个大数依次加小数,小数会被大数吃掉,乘法运算次数太多会增加运算时间. 5. 实验环境

操作系统:Windows xp; 程序设计语言:Matlab

6. 实验过程

(1) 直接计算并比较;

(2) 法1:大数逐个加1000个小数,法2:先把1000个小数相加再与大数加; (3) 将由高次项到低次项的系数保存到数组A[n]中,其中n为多项式次数.

7. 结果与分析

(1) 计算的z?1?分析:

(2) 123逐次加1000个3?10的和是 ,先将1000个3?10相加,

2

?6?6z= ,1/(z?1?z) .

再用这个和与123相加得 . 分析:

(3) 计算 次的多项式:

直接计算的结果是 ,用时 ;

用秦九韶算法计算的结果是 ,用时 . 分析:

8. 附录:程序清单

(1) 两个相近的数相减.

%************************************************************* %* 程 序 名:ex1_1.m * %* 程序功能:验证两个相近的数相减会损失有效数字个数 * %*************************************************************

z=1e16;

x,y

====================================================================== (2) 大数吃小数

%************************************************************* %* 程 序 名:ex1_2.m * %* 程序功能:验证大数吃小数的现象. * %*************************************************************

clc; % 清屏

clear all; % 释放所有内存变量 format long; % 按双精度显示浮点数

z=123; % 大数 t=3e-15; % 小数

x=z; % 大数依次加小数

3

% x = z?1?z; % y = 1/(z?1?z); % 重复1000次给x中加上t

y=0; % 先累加小数 y=z + y; % 再加到大数

x,y

======================================================================

(3) 秦九韶算法

%************************************************************* %* 程 序 名:ex1_3.m * %* 程序功能:验证秦九韶算法可节省运行时间. * %*************************************************************

clc; % 清屏

clear all; % 释放所有内存变量 format long; % 按双精度显示浮点数

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次幂

% 重复1000次给y中加上t

endtime=clock; % 结束执行的时间 time1=etime(endtime,begintime); % 运行时间 disp('直接计算');

disp(['p(',num2str(x),')=',num2str(p)]);

disp([' 运行时间: ',num2str(time1),'秒']);

4

% 累加多项式的i次项

% 秦九韶算法计算

begintime=clock; % 开始执行的时间

% 累加秦九韶算法中的一项

endtime=clock; % 结束执行的时间 time2=etime(endtime,begintime); % 运行时间 disp(' ');

disp('秦九韶算法计算');

disp(['p(',num2str(x),')=',num2str(p)]);

disp([' 运行时间: ',num2str(time2),'秒']);

5

9 10 11 12 n ← n + 1; x0 ← x; enddo return 错误信息 计数器加一 新近似值给x0做下次的初值 输出错误信息并结束程序

7. 结果与分析

8. 附录:程序清单

%************************************************************* %* 程 序 名:Aitken_Steffensen.m * %* 程序功能:用Aitken-Steffensen加速法求方程. * %************************************************************* clc;

clear all;

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('-T.6f\\n',0,x0);

% 占2位整数显示步数0, 为了对齐, 占54位小数6位显示x0

1 % n是计数器 2 % while n<=N y= 3 ; % 迭代 z= 3 ; % 再迭代 x= 3 ; % 加速

% x0初值及前一步的近似值, y和z是中间变量, x是下一步的近似值

fprintf('-.6f.6f.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)

16

《数值计算方法》实验2报告

班级: 20xx级XXXXx班 学号: 20xx2409xxxx 姓名: XXX 成绩:

1. 实验名称

实验2 非线性方程的迭代解法(之Newton下山法) 2. 实验题目

用Newton下山法求方程x?4x?10?0在区间[1,2]内的一个实根,取绝对误差限为

3210?4.

3. 实验目的

熟悉非线性方程的Newton下山法. 4. 基础理论

Newton下山法:Newton下山法公式为xk?1?xk??k其中0??k?1.

5. 实验环境

操作系统:Windows xp; 程序设计语言:Matlab 6. 实验过程

定义函数f(x)和df(x),其中df(x)是f(x)的导函数.

每步迭代时先取下山因子为1,尝试迭代,判断尝试结果是否满足下山因子,若满足则作为这步的迭代结果;否则将下山因子减半,然后再尝试.为防止当前的xk是极小值点,附近不会有满足下述条件的其它点,使尝试陷入死循环,同时计算机中能表示出的浮点数也有下界,因此我们设置了最大尝试次数.当超过最大尝试次数时,不再进行下山尝试.

由于反复尝试迭代且要判断下山条件,所以f(x0)和f?(x0)会反复使用,为避免重复计算浪费运行时间,将这两个值分别保存在变量fx0和dfx0.

而尝试产生的节点,判断下山条件时要用到它的函数值,若尝试成功,这个点会作为下一步的初值再使用,所以把该点的函数值也保存在变量fx中.

算法的伪代码描述:

Input:初值x0;精度要求(即误差限)ε;函数及其导函数f(x)和f?(x);最大迭代次数N;K下山尝试最大次数

Output:近似解或失败信息 行号 1 2 3 4 5 6 7

f(xk),使|f(xk?1)|?|f(xk)|,

f'(xk)伪代码 n ← 1; F0 ← f(x0); while n ≤ N do F0? ← f?(x0); if F0?= 0 then return False; endif 17

注释 迭代次数计数器 若该点导数为0 则无法进行迭代,结束程序 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

lambda ← 1; k ← 1; while k ≤ K do x ← x0 –lambda*F0 / F0? Fx ← f(x); if |Fx| < |F0| then break; endif lambda ←lambda/2; k ← k+1; endwhile if k > K then return False; endif if | x – x0 | <ε then return x; endif x0 ← x; F0 ← Fx; n ← n + 1; enddo return 错误信息 下山因子λ从1试起 尝试次数计数器 Newton下山公式 判断下山条件 退出尝试循环 下山因子减半 尝试次数计数器加1 如果因超过尝试次数退出循环 则提示错误信息并结束程序 否则时尝试成功退出上边循环 如果达到精度要求 则输出近似值并退出程序 新近似值给x0做下次的初值 所求函数值下次也用到 计数器加一 输出错误信息并结束程序

7. 结果与分析

8. 附录:程序清单

%************************************************************* %* 程 序 名:NewtonDownhill.m * %* 程序功能:用Newton下山法求解非线性方程. * %************************************************************* clc;

clear all;

f=inline('x^3-x-1'); % 函数f(x)

df=inline('3*x^2-1'); % 函数f(x)的导函数

x0=input('初值: x0 = ');

epsilon=input('误差限: epsilon='); N=input('最大迭代次数: N='); K=input('最大下山尝试次数: K=');

18

1 % 迭代次数计数器 2 % 存x0点函数值

fprintf('\\n\\n n x(n) f(x(n))\\n'); % 显示表头

fprintf('-.6f.6f\\n',0,x0,fx0); % 2位整数显示0, 共14位小数6位显示x0和fx0

3 % while n ≤ N disp(''); % 换行显示下山尝试过程的表头

disp(' 下山因子 尝试x(n) 对应f(x(n)) 满足下山条件');

disp('');

4 % 存x0点导数值, 每次下山尝试不用重新计算 if dfx0==0 % 导数为0不能迭代 disp(?无法进行Newton迭代?); return; end

lambda=1.0; % 下山因子从1开始尝试 k=1; % k下山尝试次数计数器 while k<=K % 下山最多尝试K次

% 下山公式

fx=f(x); % 函数值 fprintf('".6f.6f.6f',lambda,x,fx); % 显示尝试结果 if (abs(fx)

fprintf(' 不满足\\n'); end

lambda=lambda/2; % 不是, 则下山因子减半 k=k+1; % 计数器加1 end if k>K

fprintf('\\n 下山条件无法满足, 迭代失败.\\n\\n'); return; end

fprintf('-.6f.6f\\n',n,x,fx); % 2位整数显示步数n, 共14位小数6位显示下步迭代结果

22 % 达到精度要求否

19

fprintf('\\n\\n 方程的近似解为: x≈%f\\n\\n',x); % (23) return; % 达到, 则显示结果并结束程序(23) end % (24)

% 用x0,fx0存放前一步的近似值和它的函数值, 进行循环迭代

25 26 27 28 fprintf('\\n

迭代%d次还不满足误差要求.\\n\\n',N);

20

本文来源:https://www.bwwdw.com/article/1vl2.html

Top