计算物理
课程内容
- 科学计算基本原则
- 插值与函数拟合
- 数值微积分
- 非线性方程求根与方程组
- 矩阵、特征值与特征向量
- 常微分方程数值解
- 偏微分方程初边值问题
- Monte Carlo 方法
科学计算基本流程
- 建立描述实际系统的模型,能解析求解时优先分析其解析性质。
- 设计算法,将连续问题离散化为计算机可处理的形式。
- 编写程序并运行,得到数值结果。
- 检验结果,并与实验结果对比以修正模型或算法。
计算机适合处理离散系统,以及四则运算、逻辑判断和迭代计算;使用时必须注意其精度有限。
基本原则:数值模型允许合理近似,但结果必须可用。
数值误差
误差来源
- 模型误差:理论模型与实际系统之间的差异
- 测量误差:输入数据由测量引入的误差
- 截断误差:有限项展开或有限次迭代对无限过程的近似
- 舍入误差:有限精度数值表示与运算产生的误差
绝对误差与相对误差
设真值为
,近似值为
。
绝对误差:
相对误差:
真值通常不可得,实际估计时可用可计算的近似值代替分母中的真值。
一阶误差传播
若
则在误差较小时,可用一阶 Taylor 展开估计输出误差:
判断方法:偏导数的绝对值越大,相应输入误差对结果的放大越明显。
稳定计算方法
选择稳定的递推方向
对
分部积分得到
正向递推会把上一步误差乘以
,误差可能迅速放大,甚至得到与
相矛盾的结果。
改写为
并反向递推时,误差每步缩小为原来的
,数值上更稳定。
高阶初值可利用
进行估计,再向低阶回推。
要点:代数等价的公式未必具有相同的数值稳定性,应选择抑制误差传播的计算方向。
秦九韶算法
多项式
可写成嵌套形式:
秦九韶算法只需
次乘法和
次加法,避免分别计算各次幂。
避免相消误差
两个大小相近的数相减时,有效数字容易大量损失。例如
在
很大时应有理化为
判断方法:若表达式包含两个近似相等的大数相减,优先寻找因式分解、有理化或其他等价形式。
避免以过小的数作除数
除数的绝对值过小时,输入或舍入误差会被显著放大。计算前应检查分母是否接近零,并评估问题的条件性。
割圆术与稳定实现
面积近似思路
对半径为
的圆,用内接正多边形逼近。设当前边数为
、边长为
,半边长与中心到边的距离分别为
每个等腰三角形的面积为
,故正多边形面积为
不断将边数加倍时,
从下方趋近圆面积
;当
时即趋近
。
手写代码中的问题
x、S 未声明,会导致编译错误。
- 计算了
S 却没有 printf,程序运行后看不到近似结果。
sqrt((r-h)*(r-h)+x*x) 中的 r-h 会在
时发生相消,导致有效数字丢失。
i 表示边数但名称含义不清;边数不断翻倍,还需留意整数溢出。
- 应检查
scanf 是否成功,并限制迭代次数为正数。
稳定化来自
于是新边长可计算为
当
时:
一个可运行且避免该相消的版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <math.h> #include <stdio.h>
int main(void) { const double radius = 1.0; double side = 1.0; long long sides = 6; int iterations;
if (scanf("%d", &iterations) != 1 || iterations <= 0) return 1;
for (int k = 0; k < iterations; ++k) { const double half_side = 0.5 * side; const double height = sqrt(radius * radius - half_side * half_side); const double area = sides * half_side * height;
printf("%lld %.17g\n", sides, area);
side = sqrt(2.0 * radius * half_side * half_side / (radius + height)); sides *= 2; }
return 0; }
|
多项式插值
给定
个互异节点
存在唯一的次数不超过
的多项式
满足
唯一性的两种判断方法:
- 系数方程的 Vandermonde 行列式为
。
- 若两个插值多项式都满足条件,它们的差次数不超过
却有
个不同零点,只能恒为零。
单项式组
是
的基;没有另行指定内积时,不能称它为正交基。
Lagrange 插值
基函数
满足
。插值多项式为
一次插值的常用形式:
优点:公式对称、可以直接写出。缺点:新增节点后通常需要重新计算全部基函数,递推性差。
差商
一阶和高阶差商递推定义为
常用性质:
- 对节点顺序对称
- 对函数满足线性
- 次数低于
的多项式,其
阶差商为零
- 次数等于
的多项式,其
阶差商等于最高次项系数
- 若
,存在节点区间内的
使
Newton 插值
Newton 形式和 Lagrange 形式表示同一个唯一插值多项式。Newton 形式的优势是递推性:加入新节点
时,只需增加一项
差商表与原地计算
差商表按阶递推:先由函数值计算全部一阶差商,再依次计算二阶、三阶差商。Newton 多项式使用
这一组系数。实现时可以使用二维差商表;也可以用一维数组原地更新,覆盖已经不再需要的低阶数据。
Runge 现象
在等距节点上使用高次多项式插值时,增加节点不一定提高整体精度,区间端点附近可能出现越来越强的振荡。例如
的高次等距节点插值。
常用处理:
- 使用分段低次插值
- 改用合适的非等距节点
- 使用三次样条等分段方法
Hermite 插值
Hermite 插值不仅匹配节点处的函数值,还匹配指定阶数的导数。若总共有
个独立插值条件,可唯一确定一个次数不超过
的多项式。
重节点差商
差商对节点连续。节点重合时,重节点差商由导数给出:
Taylor 多项式可看作所有节点都重合于
的 Hermite 插值多项式。
三点三次 Hermite 插值
若给定三个函数值:
以及中间节点的一阶导数
,可写成
再由导数条件确定
。余项为
两点三次 Hermite 插值
在区间
上给定
则
其中函数值基函数在对应节点取
、在其余节点取
,且端点导数均为
;导数基函数满足
余项为
分段插值
把
划分成相邻小区间,并在每段使用低次多项式,可避免用单个高次多项式覆盖整个区间。
- 只有函数值:可用分段线性插值。
- 同时给出端点函数值和导数:可在每段使用两点三次 Hermite 插值。
- 若缺少导数而又要求更高阶光滑性:可使用三次样条,由整体连续性和边界条件确定导数或系数。