计算方法与实习 主讲教师:张善卿 邮箱:zhangsq71@163.com 电话:13073601029
课程名称 计算方法 数值计算方法 数值分析
教材 《计算方法与实习》(第5版) 孙志忠 吴宏伟等 东南大学出版社 Burden, Richard L., and J. Douglas Faires. Numerical Analysis. 7th ed. Belmont, CA: Brooks Cole, 2000. ISBN: 0534382169.
教学要求 教学内容安排 上机安排 上机要求 作业要求 考试要求
第一章 绪论
§1 计算方法的对象与特点 数学模型的计算方法,但区别于分析方法、精确计算方法、解析方法,是一种数值方法、逼近方法、适用于计算机上使用的方法,因此属于解决实际问题的中间环节: 实际问题 ----- 数学模型 ----- 算法 ----- 程序设计 ----- 上机计算 ----- 结果分析
对象:求解各类数学问题在一定范围内的数值解的方法,及研究这些方法的收敛性、稳定性及误差分析,在计算机上编程有效实现。 特点: 数值计算方法所得结果是问题的近似解; 数值计算方法中所有运算是四则运算; 数值计算方法都是构造性方法; 数值计算方法实用性强,是与计算机密切结合的解决实际问题的数学课程。
主要内容: 方程求根 线性方程组数值解法 插值法 曲线拟合 数值微积分 常微分方程数值解法
§2 误差的来源及误差的基本概念 2.1 误差的来源 误差: 客观物理量的真实值与计算得到的结果往往不完全相等,存在小的偏差,称为误差。 误差来源: 模型误差、观测误差、截断误差、舍入误差 结论:误差不可避免,但要尽量减少,提高精度。
2.2 绝对误差与绝对误差限 定义1. (误差/绝对误差) e=x*-x,其中x*为物理量的准确值(真值), x为其近似值。 定义2. (误差限/绝对误差限)
2.3 相对误差与相对误差限 实际计算中,取 作为相对误差 。
2.4 有效数字 定义3.如果近似值x的误差限是其某一位上的半个单 位,且该位直到x的第一位非零数字一共有n位,则称 例1、例2 见第4页
例1 对下列各数写出具有5位有效数字的近似值: 236.478, 0.00234711, 9.000024,9.000034x103 236.48, 0.002 347 1, 9.000 0, 9.000 0x103 例2 指出下列各数有几位有效数字: 2.000 4, -0.002 00, -900 0, 9x103, 2x10-3
对于某个量x*,其近似值为x=±0.a1a2…an×10m ,n为正整数,m为整数,若满足 有效数字与误差的关系 对于某个量x*,其近似值为x=±0.a1a2…an×10m ,n为正整数,m为整数,若满足 ∣e(x)∣= ∣x*-x∣≤0.5×10m-n 则称x为具有n位有效数字的近似值,或称它精确到10m-n 关系:一个量x*,其近似值x=±0.a1a2…an×10m ,有n位有效数字 则 1. ∣e(x)∣= ∣x*-x∣≤0.5×10m-n 2. ∣er(x) ∣=∣e(x)/x∣≤
实数的机内表示 实数在计算机采用浮点表示法。 一个基数为b的t位数的规格化浮点表示形式为
一个实数在计算机采用机器数表示为其近似值 机器数的有限性 计算机浮点数加上机器零组成了机器数的集合,该集合是一个离散的分布不均匀的有限集合 一个实数在计算机采用机器数表示为其近似值
2.5 数据误差的影响
两数的和、差、积、商的误差估计
例3 测得某物体行程s*的近似值s=800m,所需时间t*的近似值t=35s。若已知 ∣t*-t∣≤0.05s, ∣s*-s∣≤0.5m ,试求平均速度v的绝对误差限和相对误差限
§4 误差危害的防止 4.1 使用数值稳定的计算公式 例5. 建立积分的递推关系式 (n=0,1,…20) 并研究它的误差传递
4.2 尽量避免两相近数相减
例6 计算x= 的值 解:x1= x2= x3= x4= 已知 ≈1.41421356… 取 ≈1.4
4.3 尽量避免用绝对值很小的数作除数
4.4 防止大数“吃掉”小数
4.5 注意简化计算步骤,减少运算次数
秦九韶算法
秦九韶算法
练习 P15 习题1:第1、2、4、 8、9题
计算实习1:舍入误差与数值稳定性 Matlab工作环境简介
计算实习1:舍入误差与数值稳定性 y0 = log(6.0/5.0); fprintf('y[%d] = %f\n', 0, y0) while(1) y1 = 1.0/n - 5*y0; fprintf('y[%d] = %f\n', n, y1) if (n >= 40) break; end y0 = y1; n = n+1; 见第213页
计算实习1:舍入误差与数值稳定性 y0 = (1/205+1/246)/2; n = 40; fprintf('y[%d] = %f\n', n, y0) while(1) y1 = 1/(5*n) - y0/5; fprintf('y[%d] = %f\n', n-1, y1) if (n <= 1) break; end y0 = y1; n = n-1; 见第216页