You are on page 1of 223

数值分析与计算方法

主 编 蒋 勇 李建良
参 编 卢长娜 陈文兵 雷金贵
白 羽 陈允杰

北 京
内 容 简 介

《数值分析与计算方法》是为理工科大学的“数值分析”和“计算方
法”课程而编写的教材. 本书突出“培养综合素质与能力”的核心理念, 注
重理论与实际结合, 主要内容包括绪论、插值问题、曲线拟合与逼近、数
值积分与数值微分、常微分方程数值解法、非线性方程求解、线性方程组
的直接解法与迭代法、矩阵的特征值与特征向量计算等. 为帮助学生掌握
内容, 每章附有适量习题; 为培养学生的综合素质、提高学生的实际技能,
本书专门安排了“上机实习课题”, 并配备了相应的计算实习题. 全书采用
模块化结构, 章节相对独立, 脉络分明, 阐述严谨, 深入浅出, 便于教师根
据学生的不同背景与教学计划灵活安排教学.
本书同时可作为理工科大学相关专业的研究生课程教材, 并可供从事
科学与工程计算的科技工作者参考.

图书在版编目(CIP)数据

数值分析与计算方法/蒋勇, 李建良主编. —北京: 科学出版社, 2012


ISBN 978-7-03-032772-7
Ⅰ. ①数 … Ⅱ. ① 蒋… ② 李… Ⅲ. ① 数值分析-高等学校-教材 ② 数值计
算-高等学校-教材 Ⅳ. ① O241
中国版本图书馆 CIP 数据核字 (2011) 第 231664 号

责任编辑: 伍宏发 杨 锐 胡 凯/责任校对: 陈玉凤


责任印制: 赵 博/封面设计: 王 浩

出版
北京东黄城根北街 16 号
邮政编码: 100717
http://www.sciencep.com

印刷
科学出版社发行 各地新华书店经销
*
2012 年 1 月第 一 版 开本: B5(720×1000)
2012 年 1 月第一次印刷 印张: 14
字数: 268 000
定价: 35.00 元
(如有印装质量问题, 我社负责调换)
前 言
“数值分析” 与 “计算方法” 是理工科大学各专业普遍开设的两门密切相关的
核心课程. 其中, “数值分析” 作为核心的专业基础课, 主要开设对象为数学、统计、
计算机科学等专业的学生; 而 “计算方法” 作为重要的专业基础课或选修课, 主要
开设对象为其他理工科专业的学生. 从内容上看, 这是两门不同的课程, 各有不同
的要求和侧重点. 但是, 它们又具有较大的交叉与重叠. 前者通常侧重数值方法的
理论基础、算法设计与分析等, 后者通常侧重对算法的了解、实际应用等.
科学技术的不断发展与社会事业的不断进步, 对现代大学生与研究生的综合素
质、创新与应用能力提出了新的要求:一方面, 要求数理专业的学生具有更好的开
拓性与实际应用能力; 另一方面, 对接受技术与应用能力训练为主的工科类学生以
及非数理专业的其他理科学生, 也要求其在综合素质 (包括数理素质) 方面受到更
好的训练.
作为 “十二五” 规划 “人才培养模式创新与课程体系改革”、“人才培养模式创
新实验基地”、“学术与技能分类、专业培养分流 —— 人才培养的创新与实践”、“基
于 ‘学术型、技能型、国际化’ 的多元化人才培养模式的研究与实践”、“数值分析精
品课程建设” 等多项教学研究、教学改革与质量工程建设的成果之一, 我们在本书
中尝试性地将 “数值分析” 与 “计算方法” 两门课程的内容进行了有机的结合与互
补性的融合, 供这两门课程教学使用. 希望本书能够在教学中配合教师, 对学生综
合素质的培养与实际技能的训练有所帮助. 应当说明, 鉴于不同学科与专业的实际
情况与要求, 在教学过程中需要根据学生的背景因材施教, 对教学内容做适当的取
舍与补充. 为了便于教学, 我们力求在保证系统性与层次性的基础上, 采用模块化
结构, 章节相对独立; 在保持阐述严谨的基础上, 层次分明, 循序渐进, 希望有助于
教师根据学生的不同背景与各专业不同的教学计划灵活安排教学. 为了帮助学生提
高自学能力, 我们在编写过程中特别注意叙述的深入浅出, 希望有助于学生在教师
指导下, 通过自学也能掌握相关课程的主要内容. 从这个意义上讲, 本书也特别适
合于 “教师讲授与学生自学” 相结合的教学改革.
本书突出 “培养综合素质与能力” 的核心理念, 注重理论与实际结合, 主要内
容包括绪论、插值问题、曲线拟合与逼近、数值积分与数值微分、常微分方程数值
解法、非线性方程求解、线性方程组的直接解法与迭代法、矩阵的特征值与特征向
量计算等. 为帮助学生掌握内容, 每章附有适量习题; 为培养学生的综合素质、提高
学生的实际技能, 本书专门安排了 “上机实习课题”, 并配备了相应的计算实习题.
· ii · 前 言

本书同时可作为理工科大学相关专业的研究生课程教材, 并可供从事科学与工
程计算的科技工作者参考.
本书是在李建良教授、蒋勇教授等所编著的《计算机数值方法》(该书曾获南
京理工大学优秀教材一等奖等) 的基础上, 根据上述原则由蒋勇、李建良、卢长娜、
陈文兵、雷金贵、白羽、陈允杰等江苏省内外多所高校的教授、博士共同改编而成.
在改编过程中, 南京信息工程大学数学专业的部分研究生参与了部分编辑工作. 我
们在此对所有参与工作的同志表示衷心的感谢. 此外, 特别感谢南京信息工程大学
优秀教材出版基金对本书的立项与经济资助, 感谢计算数学、数值模拟与仿真等方
面的众多专家对我们相关工作的支持与帮助!
欢迎各位读者提出宝贵意见, 以便我们在再版过程中改正.

南京信息工程大学数学与统计学院 蒋 勇
南京理工大学理学院 李建良
目 录

前言
绪论 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
0.1 计算机数值方法的任务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
0.2 关于方程求根及其二分法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
0.3 误差分析的重要性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
第 1 章 插值法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.1 插值问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.1.1 基本概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.1.2 插值多项式的存在唯一性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2 拉格朗日 (Lagrange) 插值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.1 Lagrange 插值多项式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.2 插值余项表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.3 差商与牛顿 (Newton) 插值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.3.1 差商的定义和性质 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.3.2 Newton 插值公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.4 差分与等距节点插值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.4.1 差分及其性质 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.4.2 等距节点插值公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.5 埃尔米特 (Hermite) 插值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.6 三次样条插值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.6.1 多项式插值的缺陷与分段插值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.6.2 三次样条插值函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
1.6.3 三次样条插值函数的构造方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
1.6.4 两点说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
习题 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
第 2 章 曲线拟合与平方逼近 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.1 观测数据的最小二乘拟合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.1.1 最小二乘问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.1.2 正规方程组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.2 正交多项式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
· iv · 目 录

2.2.1 切比雪夫 (Chebyshev) 多项式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47


2.2.2 一般正交多项式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
2.3 最佳平方逼近 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
2.3.1 预备知识 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
2.3.2 最佳平方逼近 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
习题 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
第 3 章 数值积分与数值微分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.1 数值积分的基本思想与代数精确度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.1.1 基本思想 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.1.2 插值型求积公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
3.1.3 代数精确度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.2 牛顿–科茨 (Newton-Cotes) 公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.2.1 公式导出 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.2.2 几种低阶求积公式的余项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.2.3 复化求积法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.3 龙贝格 (Romberg) 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.3.1 梯形公式的递推关系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.3.2 Romberg 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.4 高斯 (Gauss) 公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.4.1 基本概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.4.2 Gauss 点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.4.3 高斯–勒让德 (Gauss-Legendre) 公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
3.4.4 稳定性和收敛性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.4.5 带权 Gauss 公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
3.5 数值微分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
3.5.1 插值型求导公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
3.5.2 三次样条插值求导 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
习题 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
第 4 章 常微分方程数值解法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
4.1 数值解法的基本思想和途径 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
4.1.1 初值问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
4.1.2 离散化方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
4.1.3 几个基本概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4.2 龙格–库塔 (Runge-Kutta) 法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
4.2.1 Runge-Kutta 法的基本思想 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
目 录 ·v·

4.2.2 四阶 Runge-Kutta 方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.2.3 步长的选取 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.3 单步法的收敛性和稳定性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
4.3.1 单步法的收敛性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
4.3.2 单步法的稳定性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
4.4 线性多步法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
4.4.1 Adams 显示公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.4.2 Adams 隐式公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
4.4.3 Adams 预报–校正公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
4.5 一阶方程组与高阶方程组的数值解法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
4.5.1 一阶方程组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
4.5.2 化高阶方程为一阶方程组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
4.6 边值问题的差分解法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
习题 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
第 5 章 非线性方程求根 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
5.1 迭代法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
5.1.1 简单迭代法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
5.1.2 收敛性问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
5.1.3 迭代格式的收敛速度与加速 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
5.2 牛顿 (Newton) 迭代法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
5.2.1 Newton 迭代法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
5.2.2 局部收敛性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
5.2.3 Newton 下山法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
5.2.4 解非线性方程组的 Newton 迭代法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
5.3 弦截法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
5.3.1 单点弦截法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
5.3.2 双点弦截法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
5.4 代数方程求根 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
5.4.1 秦九韶算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
5.4.2 代数方程的 Newton 法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
5.4.3 劈因子法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
习题 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
第 6 章 线性方程组的直接解法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
6.1 引言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
6.2 高斯 (Gauss) 消去法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
· vi · 目 录

6.2.1 系数矩阵为三角形的方程组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133


6.2.2 Gauss 消去法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
6.2.3 列主元消去法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
6.2.4 全主元消去法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
6.3 高斯–若尔当 (Gauss-Jordan) 消去法与矩阵求逆 . . . . . . . . . . . . . . . . . . . . . 141
6.3.1 Gauss-Jordan 消去法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
6.3.2 用 Gauss-Jordan 方法求逆矩阵 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
6.4 解三对角方程组的追赶法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
6.5 矩阵的三角分解及 Gauss 消去法的变形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
6.5.1 矩阵的 LU 分解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
6.5.2 方程组的求解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
6.5.3 平方根法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
6.5.4 改进的平方根法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
6.6 向量范数和矩阵范数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
6.6.1 向量范数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
6.6.2 矩阵范数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
6.7 误差分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
6.7.1 方程组的性态和条件数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
6.7.2 精度分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
习题 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
第 7 章 解线性方程组的迭代法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
7.1 雅可比 (Jacobi) 迭代法与赛德尔 (Seidel) 迭代法 . . . . . . . . . . . . . . . . . . . . 165
7.1.1 Jacobi 迭代法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
7.1.2 Gauss-Seidel 迭代法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
7.1.3 迭代公式的矩阵表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
7.2 迭代法的收敛性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
7.2.1 迭代法收敛的充要条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
7.2.2 迭代法收敛的充分条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
7.2.3 系数矩阵是对角占优情形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
7.3 迭代法的误差估计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
7.4 超松弛迭代 (SOR) 法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
习题 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
第 8 章 矩阵的特征值与特征向量计算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
8.1 幂法与反幂法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
8.1.1 幂法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
目 录 · vii ·

8.1.2 幂法的加速 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188


8.1.3 反幂法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
8.2 雅可比 (Jacobi) 方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
8.2.1 预备知识 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
8.2.2 Jacobi 方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
8.2.3 Jacobi 过关法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
8.3 QR 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
8.3.1 QR 分解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
QR 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
8.3.2
习题 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
第 9 章 上机实习课题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
9.1 插值问题的数值实验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
9.2 曲线拟合问题的数值实验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
9.3 数值积分的数值实验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
9.4 常微分方程初值 (边值) 问题的数值实验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
9.5 方程求根的数值实验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
9.6 线性方程组求解的数值实验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
9.7 矩阵特征值计算的数值实验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
9.8 矩阵条件数的估计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
绪 论
计算机数值方法是一门研究数值计算的理论与方法的学问, 相应的计算实习则
是将有关理论和方法在计算机上实现的系统训练.
计算机的工作依赖于以算法为核心的应用软件 (俗称程序), 而算法通常分为
数值算法与非数值算法. 从计算机的出现至今, 数值算法一直受到科技与工程领域
各个学科的共同关注, 人们习惯称其为数值计算方法或计算方法. 随着计算机的发
展, 在内存、速度等方面已逐渐达到其物理极限. 因此, 研究、设计、应用计算方法
已不仅仅要求提供可解决实际问题的算法, 而且必须考虑降低算法复杂性等问题.
例如, 如何提高算法的速度、减少占用的内存、降低算法的结构复杂性、增加算法
的稳定性等, 都成为计算方法的研究内容.
虽然计算方法本身可以不依赖于计算机而作为科学与工程领域中的重要理论
与方法, 但是将计算方法与计算机应用结合起来, 一方面可以使问题得到更好的解
决, 另一方面可以大大提高计算机应用的水平. 因此, 进行适当的计算实习也自然
成为本门课程的重要环节.
通过计算机数值方法的学习和训练, 可使学生在掌握计算方法的理论与方法的
同时, 增强发现问题、分析问题、解决问题的能力, 从而达到提高综合素质的目的.
这对于 21 世纪的科技工作者显然尤为重要.

0.1 计算机数值方法的任务
为了说明计算机数值方法的任务及研究对象, 我们自然要看清它在解决实际
问题中扮演的角色. 一般地, 用数学方法或计算机解决实际问题的过程可概括为如
图 0-1 所示的模式.
由图 0-1 可见, 用计算机解决科学与工程领域计算问题的一般过程包括 (a) 建
立数学模型、(b) 设计计算方法、(c) 设计程序、(d) 上机运算等, 以分别得到 (A) 数
学模型、(B) 计算方法、(C) 程序、(D) 结果等为目标. 不难看出, 从 (A) 数学模型
出发, 通过 “设计计算方法” 得到适当的 (B) 计算方法, 再经过 “设计程序” 得到可
行的 (C) 程序, 这都是实际问题能否得到解决的关键过程, 也恰好就是本书所要处
理的问题. 总之, 计算机数值方法的主要目的是:根据数学模型设计出相应的计算
方法, 并将计算机数值方法在计算机上实现. 除此之外, 计算方法中的有关理论与
方法也在 “建立数学模型” 等环节中扮演着重要角色. 例如, 本书第 2 章中的曲线
·2· 绪 论

拟合方法通常被作为建立数学模型的主要工具之一. 可见, 计算机数值方法在科学


与工程设计中起着重要的作用.

图 0-1 计算机解决实际问题的一般过程

那么, 计算机数值方法包括哪些内容呢?可以说, 凡是有数学模型出现的地方


都有一个设计计算方法的问题. 尽管实际问题复杂多变, 相应的数学模型五花八门,
但从数学理论上可对其作出比较系统的分类, 从而对应的计算方法问题可以大致概
括为:数值逼近、数值微分与数值积分、微分方程数值解、非线性方程数值解、线
性方程组的数值解、特征值及特征向量计算等. 我们将通过对这些问题中比较常见
的、简单的计算方法的学习, 掌握计算方法的基本理论、方法与技巧, 从而提高程
序设计的能力, 为今后解决各种实际问题奠定良好的基础.
然而, 我们不能片面地将计算机数值方法理解为各种计算方法的简单罗列和堆
积, 其实它本身就是一门内容丰富、研究方法深刻、有自身理论体系的学科. 它既有
纯数学的高度抽象性与严密科学性, 又有应用的广泛性与实际实验的高度技术性,
是一门与计算机使用密切结合的、实用性很强的应用数学与计算机应用课程. 为了
说明它与纯数学课程及计算机理论课程的不同, 我们来考虑线性方程组的数值解问
0.2 关于方程求根及其二分法 ·3·

题. 在线性代数中只介绍解的存在唯一性及有关理论和精确解法, 用这些理论和方
法还不能在计算机上求解上百个未知数的方程组, 甚至, 我们在第 6 章的引言中将
看到, 即便是二三十个未知数的线性代数方程组, 都难以求解, 更不用说求解十几
万个未知数的方程组了. 可见, 要求解这类问题, 还应根据方程的特点研究适合计
算机使用的、满足精度要求的、节约计算时间的有效算法及其相关理论. 在实现这
些算法时往往还要根据计算机容量、字长、速度等指标, 研究具体求解步骤的程序
设计技巧. 另外, 对于被证明是行之有效的其他方法也应采用.
计算机数值方法的特点概括如下:
1) 面向计算机
要根据计算机的特点提供实际可行的有效算法, 即算法只能包括加、减、乘、
除运算, 使计算机能直接处理.
2) 有可靠的理论分析
能任意逼近并达到精度要求, 对近似算法要保证收敛性和数值稳定性, 还要对
误差进行分析, 这些都建立在相应的数学理论基础上.
3) 有好的计算复杂性
时间复杂性好是指节省时间, 空间复杂性好是指节省存储量, 这也是建立算法
要研究的问题, 它们关系到算法能否在计算机上实现.
4) 有数值实验
任何一个算法除了从理论上要满足上述三点外, 还要通过数值实验证明是行之
有效的.
根据计算机数值方法的这些特点, 学习时我们首先要注意掌握方法的基本原理
和思想, 要注意方法处理的技巧及其与计算机的结合, 要重视误差分析、收敛性和
稳定性等基本理论; 其次, 要通过例子, 学习使用各种计算方法来解决实际计算问
题; 最后, 为了掌握本课程的内容, 还应做一定数量的理论分析与计算练习. 由于本
课程内容包括了微积分、代数、常微分方程的数值方法, 读者必须掌握这几门课程
的基本内容后才能学习本课程.
下面我们举两个例子, 对上述内容加以说明.

0.2 关于方程求根及其二分法
我们考虑如下问题:
问题 A. 求 f (x) = x4 − 2x2 − 4x + 19 590 426 的极值.
问题 B. 求 y = f (x) = (x3 − x − 1)−1 与 y = 0, x = 0, x = 1.3 所包围的面积.
问题 C. 求方程 y 000 − y 0 − y = 0 的通解.
·4· 绪 论

由高等数学的知识不难发现它们都归结为方程 x3 − x − 1 = 0 的求解问题. 对
大多数人来说, 找出其解并不是一件容易的事. 而这只是实际问题中出现的一个非
常简单的代数方程的求解问题, 我们面对的其他实际问题也不仅仅是代数方程的求
解问题. 即使是代数方程的求解问题, 当方程的次数较高时人们也难以用公式、分
析等方法直接求解. 事实上, 19 世纪挪威数学家阿贝尔 (Abel) 已经证明:对次数
高于 4 次的代数方程, 不可能由方程的系数直接表示出解的形式. 这就迫使人们去
寻求解决各种实际问题的切实可行的数值计算方法. 这里, 我们不妨来看一下代数
方程的比较经典的求解方法 —— 二分法.
设函数 f (x) 在闭区间 [a, b] 上连续, 且 f (a)f (b) < 0, 根据连续函数的性质,
f (x) 在开区间 (a, b) 内一定有实的零点, 即方程 f (x) = 0 在开区间 (a, b) 内一定有
实根. 我们这里假定它在开区间 (a, b) 内有唯一的单实根 x∗ , 此即连续函数介值定
理. 我们记为定理 0.1.
定理 0.1 设实函数 f (x) 在闭区间 [a, b] 上连续, 且 f (a)f (b) < 0, 则方程
f (x) = 0 在开区间 (a, b) 内至少有 1 个实根.
考察有根区间 (a, b), 取中点 x0 = (a + b)/2 将它分为两半, 然后进行根的搜索,
即检查 f (x0 )[当 f (x0 ) = 0 时, 则 x∗ = x0 ] 与 f (a) 是否同号. 如果确系同号, 说明
所求的根 x∗ 在 x0 的右侧, 这时令 a1 = x0 , b1 = b; 否则 x∗ 必在 x0 左侧, 这时令
a1 = a, b1 = x0 (图 0-2). 不管出现哪一种情形, 新的有根区间 [a1 , b1 ] 的长度仅为
[a, b] 的一半.

图 0-2 二分法的几何意义

对压缩后的有根区间 [a1 , b1 ] 又实施同样的方法, 即取中点 x1 = (a1 + b1 )/2 将


区间 [a1 , b1 ] 再分为两半, 然后通过根的搜索判定所求的根在 x1 的哪一侧, 从而又
确定一个新的有根区间 [a2 , b2 ], 其长度是 [a1 , b1 ] 的一半.
如此反复二分下去, 即可得出一系列有根区间:

[a, b] ⊃ [a1 , b1 ] ⊃ [a2 , b2 ] ⊃ · · · ⊃ [ak , bk ] ⊃ · · · ,


0.2 关于方程求根及其二分法 ·5·

其中, 每个区间都是前一个区间的一半, 因此二分 k 次后的有根区间 [ak , bk ] 的长


度为
1
bk − ak = k (b − a).
2
可见, 如果二分过程无穷地进行下去, 这些有根区间最终必收缩于一点 x∗ , 该点显
然就是所求的根.
设第 k 次二分后, 取有根区间的中点
1
xk = (ak + bk )
2
作为根的近似值, 则在二分过程中可以获得一个近似根的序列 x0 , x1 , x2 , · · · , 该序
列以根 x∗ 为极限.
不过在实际计算时, 我们一般不可能完成这种无穷过程, 其实也没有这种必要,
因为数值分析的结果允许带有一定的误差, 由于
1 1
|x∗ − xk | 6 (bk − ak ) = k+1 (b − a),
2 2
只要二分足够多次 (即 k 充分大), 便有

|x∗ − xk | < ε,

其中, ε 为预定精度.
上述求解方法称为二分法. 它是计算机中一种常用的算法. 我们给出其算法框
图, 如图 0-3. 其中, a, b 表示有根区间的左、右端点; x 表示近似根.
各框的具体含义如下:
[框 1] 从所给区间 (a, b) 着手二分.
[框 2] 取有根区间 (a, b) 的中点 x 作为近似根.
[框 3] 确定二分后新的有根区间 (a, b).
[框 4] 检查近似根 x 是否满足精度要求.
例 0.1 用二分法求方程 x3 − x − 1 = 0 在区间 (1, 1.5) 内的一个实根, 要求
误差不超过 0.005.
解: ① 因为 f (1) = −1, f (1.5) = 0.875, 所以

f (1)f (1.5) < 0.

另外, 显然 f (x) 在 [1, 1.5] 连续, 故由定理 0.1, f (x) 在区间 (1,1.5) 内有根.
② 预估所要二分的次数. 按误差估计式
1
|x∗ − xk | 6 (b − a),
2k+1
只需二分 6 次, 便能达到所要求的精度.
·6· 绪 论

图 0-3 二分法的算法框图

③ 二分法的计算结果如表 0-1 所示.

表 0-1 二分法 (例 0.1) 的计算结果


k ak bk xk+1 f (xk ) 的符号
0 1.0000 1.5000 1.2500 –
1 1.2500 1.3750 +
2 1.3750 1.3125 –
3 1.3125 1.3438 +
4 1.3438 1.3281 +
5 1.3281 1.3203 –
6 1.3203 1.3242 –

0.3 误差分析的重要性
通常人们习惯地认为, 只要从理论上给出了计算步骤, 即可大胆地计算下去, 而
0.3 误差分析的重要性 ·7·

不考虑计算过程中舍入误差的影响. 也有人在将复杂问题化成简单问题时误认为截
去比如方程的无穷小量不会对方程的解产生很大的误差. 诸如此类, 在实际问题的
求解上, 往往会产生面目全非的结果, 甚至在计算机上无法运行下去.
这里我们仅给出一个例子来说明问题的严重性, 从而引起我们在设计计算方法
时对相应问题的重视.
Z 1
xn
例 0.2 建立计算 In = dx 的递推公式并计算 I1 , I2 , I3 , I4 .
0 x + 25
解:① 显然
Z 1 n Z 1
x + 25xn−1 1
In + 25In−1 = dx = xn−1 dx = , (0.1)
0 x + 25 0 n

故有递推公式
1
In = − 25In−1 .
n
② 保留 4 位有效数字, 计算如下:
Z 1
1 ¯1
I0 = dx = ln(x + 25)¯0 = 0.039 22,
0 x + 25
I1 = 1 − 25I0 = 1 − 25 × 0.039 22 = 0.019 50,
1 1
I2 = − 25I1 = − 25 × 0.019 50 = 0.012 50,
2 2
1 1
I3 = − 25I2 = − 25 × 0.012 50 = 0.020 83,
3 3
1 1
I4 = − 25I3 = − 25 × 0.020 83 = −0.270 75.
4 4
③ 分析计算结果如下.
xn
令 fn (x) = , 由于 fn (x) 在区间 (0, 1] 上都是大于零的, 所以, 对任意的
x + 25
Z 1
整数 n, 都有 In = fn (x)dx > 0, 这与 ② 中 I4 = −0.270 75 < 0 矛盾. 由此可见,
0
上述方法并不能保证结果的正确性, 为什么呢?这是因为在计算 I0 时有误差 (只保
留了小数点后 5 位).
准确值为
I1 = 1 − 25I0 ,

近似值为
I¯1 = 1 − 25I¯0 ,

所以
¯ ¯ ¯ ¯
¯I1 − I 1 ¯ = 25 ¯I 0 − I0 ¯ .
·8· 绪 论

同理可得
¯ ¯ ¯ ¯ ¯ ¯
¯I2 − I 2 ¯ = 25 ¯I 1 − I1 ¯ = 252 ¯I0 − I 0 ¯ ,
¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯
¯I3 − I 3 ¯ = 25 ¯I2 − I 2 ¯ = 252 ¯I1 − I 1 ¯ = 253 ¯I0 − I 0 ¯ ,
¯ ¯ ¯ ¯
¯I4 − I 4 ¯ = · · · = 254 ¯I0 − I 0 ¯ .
¯ ¯
由于 ¯I0 − I 0 ¯ 在计算机上进行计算时, 不可避免地会丢失有效数字, 产生误差,
而在递推公式中, 每相差一步, 误差将放大 25 倍, 在运行到第 4 步时, 误差放大了
254 = 390 625 倍!
对于这种现象, 应该如何处理呢?如果改变次序, 可运用以下递推关系式.
由式 (0.1) 得 µ ¶
1 1
In−1 = − In , (0.2)
25 n
1
|In−1 − I n−1 | = |In − I n |,
25
µ ¶n−4
1
|I4 − I 4 | = · · · = |In − I n |.
25
可见, 改变次序可以使计算误差越来越小.
由于
Z 1 Z 1 n
xn x 1 1
0< dx < dx = × → 0, n → ∞,
0 x + 25 0 25 25 n
所以
In → 0, n → ∞,
故可取
I7 ≈ 0, I 7 = 0.

④ 根据式 (0.2) 进行计算, 计算结果为 (小数点后取 5 位)


µ ¶
1 1
I6 = − 0 = 0.005 71,
25 7
µ ¶
1 1
I5 = − I 6 = 0.006 44,
25 6
µ ¶
1 1
I4 = − I 5 = 0.007 74,
25 5
µ ¶
1 1
I3 = − I 4 = 0.009 69.
25 4

这样, 尽管开始时假设的误差可能很大 (取 I 7 = 0), 但由于误差的逐步缩小,


计算结果随着迭代步数的增加, 越来越接近准确值.
0.3 误差分析的重要性 ·9·

例 0.2 表明, 在进行程序设计时应尽量避免由于误差积累而造成的结果错误.


其实, 误差分析在数值运算中是一个很重要而又很复杂的问题. 因为每步运算
都有可能产生误差, 而一个科学或工程计算问题往往要运算千万次, 如果每步运算
都分析误差是不可能的, 也是不必要的. 这里我们提出下列原则, 它们有助于鉴别
计算结果的可靠性并防止误差危害现象的产生.
1) 使用数值稳定的计算公式
运算过程舍入误差不增长的计算公式称为是数值稳定的, 否则是不稳定的. 对
一个稳定的计算过程, 由于舍入误差不增长, 因而不具体估计舍入误差是可行的.
而对于不稳定的计算过程, 如果计算步数太多, 就可能出现错误结果. 因此, 应尽量
避免使用不稳定的计算公式, 如果使用也必须特别小心. 在数值分析中, 很多计算
方法都要研究计算过程的稳定性而不具体估计舍入误差.
2) 避免两个相近数相减
在数值计算中两相近数相减, 有效数字会严重损失, 应尽量避免出现这种运算.
当出现这种情况时, 最好是改变计算方法, 以防止这种现象发生. 例如:
√ √
12 345 678 − 12 345 677
=0.351 364 17 · · · × 104 − 0.351 364 155 8 · · · × 104
=0.000 000 014 2 · · · × 104
≈0 (取 6 位),

但是
√ √
12 345 678 − 12 345 677
1
=√ √
12 345 678 + 12 346 677
=0.142 302 50 · · · × 10−3
≈0.142 303 · · · × 10−3 .

3) 防止大数 “吃掉” 小数
在数值运算中参加运算的数有时数量级相差很大, 而计算机位数有限, 如不注
意运算次序就可能出现大数 “吃掉” 小数的现象, 从而影响计算结果的可靠性.
例如,在 5 位十进制模拟计算机上, 计算
1000
X
A = 524 92 + δi , 0.1 6 δi 6 0.9, i = 1, 2, · · · , 1000.
i=1

把运算写成规格化形式, 为
1000
X
A = 0.524 92 × 105 + δi .
i=1
· 10 · 绪 论

由于在计算机内计算时要对阶, 若取 δi = 0.9 对阶时, 在 5 位的计算机中表示


为机器 0, 所以

A =0.524 92 × 105 + 0.000 009 × 105 + · · · + 0.000 009 × 105


, 0.524 92 × 105 .

上述结果显然不可靠, 这是由于运算中出现了大数 52 492“吃掉” 小数 δi . 如


果计算时先把数量级相同的 1000 个 δi 相加, 最后再加 52 492, 那么就不会出现大
数 “吃掉” 小数的现象. 这时
1000
X
3
0.1 × 10 6 δi 6 0.9 × 103 ,
i=1

于是
0.001 × 105 + 0.524 92 × 105 6 A 6 0.009 × 105 + 0.524 92 × 105 ,
524 92 6 A 6 533 92.
4) 注意简化计算步骤, 减少运算次数
同样一个计算问题, 如果能减少计算次数, 不但可节省计算机的计算时间, 还
能减少计算误差, 这是数值计算必须遵从的原则, 也是计算方法要研究的重要内容.
例如, 计算 x255 的值. 如果逐个相乘要用 254 次乘法, 但若写成

x255 = xx2 x4 x8 x16 x32 x64 x128 ,

只要作 14 次乘法运算即可, 一方面加快了运算次数, 另一方面也减少了误差的传


播过程.
又如计算多项式

Pn (x) = an xn + an−1 xn−1 + · · · + a1 x + a0

的值, 若直接计算 an xn 再逐项相加, 一共需作


n(n + 1)
n + (n − 1) + · · · + 2 + 1 =
2
次乘法和 n 次加法. 若采用秦九韶算法 (参见 5.4.1 节):


 S = an ,
 n
Sk = xSk+1 + ak , k = n − 1, n − 2, · · · , 0,



Pn (x) = S0 ,

只要 n 次乘法和 n 次加法就可算出 Pn (x) 的值.


① 符号 , 表示在机器中相等.
第1章 插 值 法
许多实际问题的内在规律可用函数 y = f (x) 进行确切描述, 但可能出现下面
的情况:
1) 因对实际问题的认识还不太深刻, 仅是通过实验手段得到了函数在一些点
处的相应取值, 其解析表达式却是未知的.
2) 虽有 y = f (x) 的解析式, 但对其进一步的分析和应用十分不便.
因此, 往往需要找一个适当的函数 P (x) 作为原函数 f (x) 的近似, 而插值法就
是确定这样的 P (x) 的一类方法.

1.1 插 值 问 题
1.1.1 基本概念

设 y = f (x) 在点 x0 , x1 , · · · , xn 处的取值分别为 y0 = f (x0 ), y1 = f (x1 ), · · · ,


yn = f (xn ), 若能构造一个函数 P (x), 使得

P (xi ) = f (xi ), i = 0, 1, · · · , n, (1.1)

成立, 则这类问题称为插值问题. 其中, x0 , x1 , · · · , xn 称为插值节点(或基点); 式


(1.1) 称为插值条件; P (x) 称为 f (x) 的一个插值函数. 求插值函数 P (x) 的方法称
为插值法. 当 P (x) 是三角多项式时, 称为三角插值法. 当 P (x) 是次数不超过 n 次
的代数多项式时, 称为多项式插值法; 相应地, 称 P (x) 为插值多项式.
由于对足够光滑的函数 f (x) 都可按泰勒 (Taylor) 公式展开成级数形式, 因此
从一定程度上它总可用多项式函数进行近似. 受此启发, 这里我们将限于多项式插
值法的讨论.

1.1.2 插值多项式的存在唯一性

所谓多项式插值就是要构造一个不超过 n 次的多项式

Pn (x) = a0 + a1 x + · · · + an xn , (1.2)

使其满足插值条件式 (1.1), 则
· 12 · 第1章 插 值 法



 a0 + a1 x0 + · · · + an xn0 = f (x0 ),


 a + a x + · · · + a xn = f (x ),
0 1 1 n 1 1
(1.3)

 · · · · · ·



a0 + a1 xn + · · · + an xnn = f (xn ).

于是插值多项式 Pn (x) 的存在唯一性就等价于由此多项式中系数 a0 , a1 , · · · , an


构成的线性方程组 (1.3) 的解的存在唯一性, 而方程组 (1.3) 的系数行列式是 n + 1
阶范德蒙德 (Vandermonde) 行列式
¯ ¯
¯ 1 x0 x20 · · · xn0 ¯¯
¯
¯ ¯
¯ 1 x1 x21 · · · xn1 ¯¯
V = ¯¯ ¯. (1.4)
¯ ··· ··· ··· ··· ··· ¯
¯ ¯
¯ 1 xn x2n · · · xnn ¯

当 i 6= j 时, xi 6= xj , 则 Y
V = (xj − xi ) 6= 0.
06i<j6n

定理 1.1 当 x0 , x1 , · · · , xn 是互不相同的节点时, 满足插值条件式 (1.1) 的插


值多项式 (1.2) 是存在唯一的.
理论上 Pn (x) 的构造可通过解上述线性方程组 (1.3) 得到, 但此法计算量大,
且难以给出多项式的一般表达形式, 不具有实用意义.

1.2 拉格朗日 (Lagrange) 插值


1.2.1 Lagrange 插值多项式

若已知实验数据 (x0 , f (x0 )), (x1 , f (x1 )), 则在几何上经过这两点可唯一确定一


条直线, 且直线方程为
f (x1 ) − f (x0 )
y = L1 (x) = f (x0 ) + (x − x0 )
x1 − x0
x − x1 x − x0
= f (x0 ) + f (x1 ). (1.5)
x0 − x1 x1 − x0

类似地, 若已知实验数据 (x0 , f (x0 )), (x1 , f (x1 )), (x2 , f (x2 )), 那么经过这三点一样可
以确定唯一的一条抛物线 (二次函数), 设其方程为

y = L2 (x) = A(x − x1 )(x − x2 ) + B(x − x0 )(x − x2 ) + C(x − x0 )(x − x1 ), (1.6)

其中, A, B, C 为待定参数. 事实上, 令 x = x0 , 则


1.2 拉格朗日 (Lagrange) 插值 · 13 ·

f (x0 )
L2 (x0 ) = A(x0 − x1 )(x0 − x2 ) = f (x0 ), A= .
(x0 − x1 )(x0 − x2 )

类似地, 令 x = x1 , 则
f (x1 )
L2 (x1 ) = B(x1 − x0 )(x1 − x2 ) = f (x1 ), B= .
(x1 − x0 )(x1 − x2 )

令 x = x2 , 则
f (x2 )
L2 (x2 ) = C(x2 − x0 )(x2 − x1 ) = f (x2 ), C= .
(x2 − x0 )(x2 − x1 )

将上述解得的 A, B, C 取值代入式 (1.6), 得


(x − x1 )(x − x2 ) (x − x0 )(x − x2 )
L2 (x) = f (x0 ) + f (x1 )
(x0 − x1 )(x0 − x2 ) (x1 − x0 )(x1 − x2 )
(x − x0 )(x − x1 )
+ f (x2 ). (1.7)
(x2 − x0 )(x2 − x1 )

从式 (1.6) 和 (1.7) 可以发现, 经过两点所得的一次函数可以表示成这两点的函数值


分别乘上一个不同的一次函数的组合. 同样地, 经过三点的二次函数也可表示成这
三点的函数分别乘上一个不同的二次函数的线性组合, 而且各函数值前所乘的函数
恰好为 x 与 (除该点外) 其余各节点差的所有一次因式的乘积并除以此乘积函数在
该点的函数值. 如在式 (1.7) 中, f (x2 ) 前所乘的二次函数为 x 与节点 x0 , x1 的一次
因式的乘积 (x − x0 )(x − x1 ) 除以此乘积函数在点 x2 处的函数值 (x2 − x0 )(x2 − x1 ),
若将其记为 l2 (x), 即
(x − x0 )(x − x1 )
l2 (x) = .
(x2 − x0 )(x2 − x1 )
显然, l2 (x0 ) = 0, l2 (x1 ) = 0 和 l2 (x2 ) = 1. 相应地, 若把 f (x0 ), f (x1 ) 前所乘的函数
分别记为 l0 (x), l1 (x), 则它们有与 l2 (x) 相类似的特征, 称为插值基函数.
一般地, 若已知 n + 1 个互不相同的节点 x0 , x1 , · · · , xn 处函数 y = f (x) 的值
分别为 f (x0 ), f (x1 ), · · · , f (xn ), 那么经过这 n + 1 个点的 n 次插值多项式的图像,
其函数形式能否也表示成类似的形式:
(x − x1 ) · · · (x − xn ) (x − x0 )(x − x2 ) · · · (x − xn )
Ln (x) = f (x0 ) + f (x1 )
(x0 − x1 ) · · · (x0 − xn ) (x1 − x0 )(x1 − x2 ) · · · (x1 − xn )
(x − x0 ) · · · (x − xn−1 )
+ ··· + f (xn ) (1.8)
(xn − x0 ) · · · (xn − xn−1 )

呢?若记
(x − x0 ) · · · (x − xi−1 )(x − xi+1 ) · · · (x − xn )
li (x) = , i = 0, 1, · · · , n, (1.9)
(xi − x0 ) · · · (xi − xi−1 )(xi − xi+1 ) · · · (xi − xn )
· 14 · 第1章 插 值 法

即经过 n + 1 个点 (xi , f (xi ))(i = 0, 1, · · · , n) 的不超过 n 次的插值多项式是否为


n
X
Ln (x) = li (x)f (xi ) (1.10)
i=0

呢?显然, Ln (x) 是一个不超过 n 次的多项式, 根据插值多项式的唯一性, 要确认


Ln (x) 为通过这 n + 1 个已知点的插值多项式, 只需验证

Ln (xi ) = f (xi ), i = 0, 1, · · · , n, (1.11)

即可. 事实上, 我们容易看出:


(
1, i = j,
li (xj ) = (1.12)
0, i 6= j.

所以 n
X
Ln (xj ) = li (xj )f (xi ) = f (xj ), j = 0, 1, · · · , n. (1.13)
i=0

因此, 式 (1.10) 给出的不超过 n 次的多项式确是经过点 (xi , f (xi ))(i = 0, 1, · · · , n)


的插值多项式. 称 Ln (x) 为 f (x) 的 n 次 Lagrange 插值多项式; 称 li (x) (i =
0, 1, · · · , n) 为 n 次的插值基函数.
若进一步引入记号 n
Y
ωn+1 (x) = (x − xj ), (1.14)
j=0

则 n
Y
0
ωn+1 (xi ) = (xi − xj ). (1.15)
j=0
j6=i

这样 Ln (x) 又可表示成
n
X ωn+1 (x)
Ln (x) = 0 f (xi ). (1.16)
i=0
(x − xi )ωn+1 (xi )

值得提出的是:插值多项式可以有各种不同的表达形式, 但如果不限定次数,
那么插值多项式不是唯一的. 事实上, 设 a(x) 是任意的多项式, 则多项式
P (x) = Ln (x) + a(x)(x − x0 ) · · · (x − xn )

都满足插值条件式 (1.1), 即我们能构造任意多个经过 n + 1 个点的高于 n 次的插


值多项式.
1.2.2 插值余项表达式
Ln (x) 作为 f (x) 的一种近似在节点处是精确的, 但在节点之间这种近似的误
1.2 拉格朗日 (Lagrange) 插值 · 15 ·

差有多大呢?下面我们将对此展开讨论, 记其截断误差为 Rn (x), 则

Rn (x) = f (x) − Ln (x).

定理 1.2 设 f (x), f 0 (x), · · · , f (n) (x) 在区间 [a, b] 上连续, f (n+1) (x) 在区间
(a, b) 内存在, 节点 a 6 x0 < x1 < · · · < xn 6 b, Ln (x) 是满足插值条件 Ln (xi ) =
f (xi ) (i = 0, 1, · · · , n) 的插值多项式, 则对任何 x ∈ [a, b], 插值余项为

f (n+1) (ξ)
Rn (x) = f (x) − Ln (x) = ωn+1 (x), (1.17)
(n + 1)!

其中, ξ ∈ (a, b) 且依赖于 x; ωn+1 (x) 由式 (1.14) 定义.


证明: 由给定条件知 Rn (x) 在节点 xi (i = 0, 1, · · · , n) 处的函数值为零, 即

Rn (xi ) = 0, i = 0, 1, · · · , n,

故 Rn (x) 可写成

Rn (x) = K(x)(x − x0 )(x − x1 ) · · · (x − xn ) = K(x)ωn+1 (x), (1.18)

其中, K(x) 为待定函数.


把 x 看成是区间 (a, b) 内的一个固定点, 作辅助函数

ϕ(t) = f (t) − Ln (t) − K(x)ωn+1 (t), t ∈ [a, b].

根据插值条件和余项的定义, 可知 ϕ(t) 在点 x0 , x1 , · · · , xn 及 x 处的值为零, 所以


ϕ(t) 在区间 [a, b] 内至少有 n + 2 个零点, 由罗尔 (Rolle) 定理知, ϕ0 (t) 在区间 (a, b)
内至少有 n + 1 个零点. 再对 ϕ00 (t) 应用 Rolle 定理, 则 ϕ00 (t) 在区间 (a, b) 内至少
有 n 个零点. 依此类推, ϕ(n+1) (t) 在区间 (a, b) 内至少有一个零点, 即至少存在一
点 ξ ∈ (a, b), 使
ϕ(n+1) (ξ) = f (n+1) (ξ) − (n + 1)!K(x) = 0,
所以
f (n+1) (ξ)
K(x) = , ξ ∈ (a, b) 且依赖于 x.
(n + 1)!
将它代入式 (1.18), 就得到了余项表达式 (1.17). 证毕.
由于 ξ 在区间 (a, b) 内的具体位置通常不能确切给出, 如果我们能求出

Mn+1 = max |ωn+1 (x)| ,


a<x<b

那么插值多项式 Ln (x) 逼近 f (x) 的截断误差界为


Mn+1
|Rn (x)| 6 |ωn+1 (x)| . (1.19)
(n + 1)!
· 16 · 第1章 插 值 法

由此可知, |Rn (x)| 除与 Mn+1 有一定的联系外, 还与 |ωn+1 (x)| 直接相关, 即


与节点 x0 , x1 , · · · , xn 的选取有关, 因此当用 Ln (x) 近似计算 f (x) 在某点 x 的函
数值时, 为使 |ωn+1 (x)| 尽可能地小些, 应选最靠近 x 的节点 xi (i = 0, 1, · · · , n) 作
为插值基点.
例 1.1 已知数据表

xi 0 1 2 3
f (xi ) 1.0000 1.6487 2.7183 4.4817

试用抛物线插值多项式求 f (2.8) 的近似值.


解:因为数据表中最靠近 x = 2.8 的是后面 3 个节点, 所以取 x0 = 1, x1 =
2, x2 = 3 为插值基点, 由 Lagrange 插值方法得

(x − 2)(x − 3) (x − 1)(x − 3)
J2 (x) = × 1.6487 + × 2.7183
(1 − 2)(1 − 3) (2 − 1)(2 − 3)
(x − 3)(x − 2)
+ × 4.4817
(3 − 1)(3 − 2)
=0.3469x2 + 0.0289x + 1.2729,

于是
f (2.8) ≈ L2 (2.8) = 4.0735.

若取 x0 = 0, x1 = 1, x2 = 2 作为插值基点, 此时通过这三点的二次插值多项
式为
(x − 1)(x − 2) (x − 0)(x − 2)
L̃2 (x) = × 1.0000 + × 1.6487
(0 − 1)(0 − 2) (1 − 0)(1 − 2)
(x − 0)(x − 1)
+ × 2.7183
(2 − 0)(2 − 1)
=0.2105x2 + 0.4383x + 1.0000,

于是
f (2.8) ≈ L̃2 (2.8) = 3.8770.

而事实上, f (x) = ex/2 , 当 x = 2.8 时, f (2.8) = 4.051 99 · · · . 显然 L2 (2.8) 比 L̃2 (2.8)


有更好的近似效果.
例 1.2 对于等距节点的 sin x 函数表, 若用线性插值求 sin x 的近似值, 要使
截断误差不超过 5 × 10−5 , 问此函数表的步长 h (相邻两节点间的距离) 应取多少?
解:由式 (1.17), 对任意相邻两节点 xk , xk+1 的线性插值余项为
f 00 (ξk )
R1 (x) = (x − xk )(x − xk+1 ), ξk ∈ (xk , xk+1 ).
2!
1.3 差商与牛顿 (Newton) 插值 · 17 ·

因此当 x ∈ [xk , xk+1 ] 时, 有


1 1
|(x − xk )(x − xk+1 )| 6 (xk+1 − xk )2 = h2 .
4 4
所以 ¯ 00 ¯
¯ f (ξk ) ¯ M2 2
|R1 (x)| = ¯¯ (x − xk )(x − xk+1 )¯¯ 6 h ,
2! 8
其中, M2 = max |f 00 (x)|.
那么, 当 f (x) = sin x 时, 有

M2 = max |(sin x)00 | = max | − sin x| = 1,


1 2
h 6 5 × 10−5 ,
8

h 6 0.02.

函数表允许的最大步长是 0.02.

1.3 差商与牛顿 (Newton) 插值


Lagrange 插值多项式 Ln (x) 能用于计算原函数的近似值, 但考虑到精度要求
和计算量的原因, 有时需要增减插值多项式的次数, 即增减插值节点的个数. 而由
式 (1.9) 中 li (x) 的定义形式可以看出, 在增减插值节点的个数时, 所有的插值基函
数都必须重新计算, 这就造成了前面计算工作量的浪费. 为了避免这种浪费, 可设
通过 n + 1 个点 (xi , f (xi )) (i = 0, 1, · · · , n) 的 n 次插值多项式为

Pn (x) =a0 + a1 (x − x0 ) + a2 (x − x0 )(x − x1 )


+ · · · + an (x − x0 ) · · · (x − xn−1 ), (1.20)

其中, a0 , a1 , · · · , an 为待定系数. 由插值条件

Pn (xj ) = f (xj ), j = 0, 1, · · · , n,

可得:
当 x = x0 时, Pn (x0 ) = a0 = f (x0 ).
当 x = x1 时, Pn (x1 ) = a0 + a1 (x1 − x0 ) = f (x1 ), 推得
f (x1 ) − f (x0 )
a1 = .
x1 − x0

当 x = x2 时, Pn (x2 ) = a0 + a1 (x1 − x0 ) + a2 (x2 − x0 )(x2 − x1 ) = f (x2 ), 推得


· 18 · 第1章 插 值 法

f (x2 ) − f (x1 ) f (x1 ) − f (x0 )



x2 − x1 x1 − x0
a2 = .
x2 − x0

依此递推, 可得 a3 , · · · , an . 为了给出系数 ak (k = 0, 1, · · · , n) 的一般表达式, 下面


先引进差商的概念.
1.3.1 差商的定义和性质
定义 1.1 设 y = f (x) 在点 x0 , x1 , · · · , xn (i 6= j 时, xi 6= xj ) 处的取值分别
为 f (x0 ), f (x1 ), · · · , f (xn ), 称
f (xj ) − f (xi )
, i 6= j,
xj − xi
为函数 f (x) 在 xi , xj 处的一阶差商, 并记为 f [xi , xj ]; 又称
f [xj , xk ] − f [xi , xj ]
f [xi , xj , xk ] = , i 6= k,
xk − xi

为函数 f (x) 在 xi , xj , xk 处的二阶差商; 一般地, 将


f [x1 , · · · , xk ] − f [x0 , · · · , xk−1 ]
f [x0 , x1 , · · · , xk ] = (1.21)
xk − x0

称为 f (x) 在 x0 , x1 , · · · , xk 处的 k 阶差商.
差商的计算可列表进行 (见表 1-1).
差商具有下列基本性质.
性质 1.1 f (x) 在 x0 , x1 , · · · , xk 处的 k 阶差商 f [x0 , x1 , · · · , xk ] 可以表示为
函数值 f (x0 ), f (x1 ), · · · , f (xk ) 的线性组合, 形如
k
X f (xi )
f [x0 , x1 , · · · , xk ] = 0 , (1.22)
i=0
ωk+1 (xi )

k
Y
其中, ωk+1 (x) = (x − xj ).
j=0

表 1-1 差商表
xi f (xi ) 一阶差商 二阶差商 三阶差商 四阶差商
x0 f (x0 )
f [x0 , x1 ]
x1 f (x1 ) f [x0 , x1 , x2 ]
f [x1 , x2 ] f [x0 , x1 , x2 , x3 ]
x2 f (x2 ) f [x1 , x2 , x3 ] f [x0 , x1 , x2 , x3 , x4 ]
f [x2 , x3 ] f [x1 , x2 , x3 , x4 ]
x3 f (x3 ) f [x2 , x3 , x4 ]
f [x3 , x4 ]
x4 f (x4 )
.. .. .. .. .. ..
. . . . . .
1.3 差商与牛顿 (Newton) 插值 · 19 ·

这个性质可用数学归纳法证明. 并从该性质可以看出差商与节点的次序无关,
即有:
性质 1.2 差商具有对称性, 即在 f [x0 , x1 , · · · , xk ] 中任意改变节点 xi , xj 的
次序, 其值不变.
性质 1.3 对于 n 次多项式 f (x) 的 k 阶差商 f [x0 , x1 , · · · , xk−1 ], 当 k 6 n 时
是 n − k 次多项式, 而当 k > n 时其值恒等于零.
只要证明, 若 f [x, x0 , · · · , xl ] 是 m 次多项式时, f [x, x0 , · · · , xl+1 ] 是 m − 1 次
多项式即可. 而根据多项式的特性又仅需验证 f [x, x0 , · · · , xl ] = xm 的情形. 事实
上,
f [x, x0 , · · · , xl ] − f [x0 , xl , · · · , xl+1 ]
f [x, x0 , · · · , xl+1 ] =
x − xl+1
xm − xm l+1
= = xm−1 + xm−2 xl+1 + · · · + xm−1 l+1 ,
x − xl+1

即 f [x, x0 , · · · , xl+1 ] 的确是 m − 1 次多项式.


上述差商的定义都是建立在节点互不相等的情形上, 但有时我们需要用到节点
相重时的差商, 这时可定义
g(x + ∆x) − g(x)
g[x, x] = lim g[x, x + ∆x] = lim = g 0 (x).
∆x→0 ∆x→0 ∆x
一般地, 我们有
d
f [x, x, x0 , · · · , xn ] = f [x, x0 , · · · , xn ]. (1.23)
dx
1.3.2 Newton 插值公式

设在 x0 , x1 , · · · , xn , x 处, 函数 y = f (x) 的取值分别为 f (x0 ), f (x1 ), · · · , f (xn )


和 f (x), 由差商的定义
f (x) − f (x0 )
f [x, x0 ] = ,
x − x0
从而有
f (x) = f (x0 ) + f [x, x0 ](x − x0 ).

类似地, 由各阶差商的定义, 可以依次得到

f (x) = f (x0 ) + f [x, x0 ](x − x0 ),

f [x, x0 ] = f [x0 , x1 ] + f [x, x0 , x1 ](x − x1 ),

f [x, x0 , x1 ] = f [x0 , x1 , x2 ] + f [x, x0 , x1 , x2 ](x − x2 ),

······ (1.24)
· 20 · 第1章 插 值 法

f [x, x0 , · · · , xn−2 ] = f [x0 , x1 , · · · , xn−1 ] + f [x, x0 , · · · , xn−1 ](x − xn−1 ),

f [x, x0 , · · · , xn−1 ] = f [x0 , x1 , · · · , xn ] + f [x, x0 , · · · , xn ](x − xn ).

对式 (1.24) 的第二式两边同乘 (x − x0 ), 第三式两边同乘 (x − x0 )(x − x1 ), · · · · · · ,


依此类推, 将最后一式两边同乘 (x − x0 )(x − x1 ) · · · (x − xn−1 ). 然后将上面分别乘
过不同因式后所有 n + 1 个等式两边相加, 整理得

f (x) =f (x0 ) + f [x0 , x1 ](x − x0 ) + f [x0 , x1 , x2 ](x − x0 )(x − x1 )


+ · · · + f [x0 , x1 , · · · , xn ](x − x0 ) · · · (x − xn−1 )
+ f [x, x0 , · · · , xn ](x − x0 ) · · · (x − xn ). (1.25)


Nn (x) =f (x0 ) + f [x0 , x1 ](x − x0 ) + f [x0 , x1 , x2 ](x − x0 )(x − x1 )
+ · · · + f [x0 , x1 , · · · , xn ](x − x0 ) · · · (x − xn−1 ), (1.26)

R̃n (x) = f [x, x0 , · · · , xn ](x − x0 ) · · · (x − xn ), (1.27)


f (x) = Nn (x) + R̃n (x), (1.28)

称 Nn (x) 为 n 次 Newton 插值多项式, R̃n (x) 为相应的截断误差.


显然, Nn (x) 是不超过 n 次的多项式, 若能验证 Nn (x) 满足插值条件

Nn (xi ) = f (xi ), i = 0, 1, · · · , n, (1.29)

则通过 n + 1 个点 (xi , f (xi )) (i = 0, 1, · · · , n) 的插值多项式就可按式 (1.26) 进行构


造. 而要验证插值条件式 (1.29), 只需证明 Nn (x) = Ln (x) 即可.
事实上, 设 P (x) 是任意一个不超过 n 次的多项式, 将 P (x) 按式 (1.25) 展开,
则由差商性质 1.3 知其截断误差为零, 即

P (x) =P (x0 ) + P [x0 , x1 ](x − x0 ) + P [x0 , x1 , x2 ](x − x0 )(x − x1 )


+ · · · + P [x0 , x1 , · · · , xn ](x − x0 ) · · · (x − xn−1 ). (1.30)

现取 f (x) 在节点 x0 , x1 , · · · , xn 的 Lagrange 插值多项式 Ln (x) 作为式 (1.30)


中的 P (x), 则 Ln (x) 也可表示成

Ln (x) =Ln (x0 ) + Ln [x0 , x1 ](x − x0 ) + Ln [x0 , x1 , x2 ](x − x0 )(x − x1 )


+ · · · + Ln [x0 , x1 , · · · , xn ](x − x0 ) · · · (x − xn−1 ). (1.31)
1.3 差商与牛顿 (Newton) 插值 · 21 ·

又由于
Ln (xi ) = f (xi ), i = 0, 1, · · · , n,
所以式 (1.31) 中 Ln (x) 在各节点处的各阶差商值等于 f (x) 在这些节点处相应的
各阶差商值, 故
Ln (x) =Ln (x0 ) + Ln [x0 , x1 ](x − x0 )
+ · · · + Ln [x0 , x1 , · · · , xn ](x − x0 ) · · · (x − xn−1 )
=f (x0 ) + f [x0 , x1 ](x − x0 ) + · · · + f [x0 , x1 , · · · , xn ](x − x0 ) · · · (x − xn−1 )
=Nn (x), (1.32)

即确实满足插值条件式 (1.29).
Newton 插值公式的优点是:当增加一个节点时, 即增加一次插值多项式的次
数时, 只要再增加一项就行了, 且有递推关系式

Nk+1 (x) = Nk (x) + f [x0 , x1 , · · · , xk , x̄](x − x0 ) · · · (x − xk ), (1.33)

其中, x̄ 是增加的节点. 这时截断误差为


f (k+2) (ξ)
f (x) − Nk+1 (x) = (x − x0 ) · · · (x − xk )(x − x̄),
(k + 2)!
其中, ξ 介于 x0 , x1 , · · · , xn , x̄ 之间.
对于节点 x0 , x1 , · · · , xn 的 n 次插值多项式, 分别用 Lagrange 插值方法和 New-
ton 插值方法, 则 f (x) 可分别表示为

f (x) = Ln (x) + Rn (x)


f (x) = Nn (x) + R̃n (x).
结合式 (1.32), 两个插值多项式的余项也应相等, 即有
f (n+1) (ξ)
f [x, x0 , x1 , · · · , xn ] = , ξ ∈ (a, b).
(n + 1)!
因此可以得到差商的另一个重要性质:
性质 1.4
f (k) (ξ)
f [x0 , x1 , · · · , xk ] =
, (1.34)
k!
其中, ξ 介于 x0 , x1 , · · · , xk 的最小值和最大值之间.

例 1.3 已知 f (x) = x 在点 x = 2, 2.1, 2.2 的值, 试作二次 Newton 插值多
项式. 若增加一个点 x = 2.3, 再求三次 Newton 插值多项式.
解:作差商表 1-2.
· 22 · 第1章 插 值 法

表 1-2 例 1.3 的差商表


xi f (xi ) f [xi , xi+1 ] f [xi , xi+1 , xi+2 ] f [xi , xi+1 , xi+2 , xi+3 ]
2.0 1.414 214
0.349 24
2.1 1.449 138 –0.041 10
0.341 02 0.009 167
2.2 1.483 240 –0.038 35
0.333 35
2.3 1.516 575

于是

N2 (x) = 1.414 214 + 0.349 24(x − 2.0) − 0.041 10(x − 2.0)(x − 2.1),

N3 (x) =1.414 214 + 0.349 24(x − 2.0) − 0.041 10(x − 2.0)(x − 2.1)
+ 0.009 167(x − 2.0)(x − 2.1)(x − 2.2)
=N2 (x) + 0.009 167(x − 2.0)(x − 2.1)(x − 2.2).

可见, 当增加一个插值节点时, 即增加一次插值多项式次数时, Newton 插值多项式


只要增加一项即可.

1.4 差分与等距节点插值
Newton 插值方法增强了插值多项式应用的灵活性, 但为了计算差商, 需要多
次进行除法运算. 而当插值节点等距时, 我们可以利用此特征对 Newton 插值公式
变形, 以减少计算量. 为此下面先引入差分的概念.
1.4.1 差分及其性质
定义 1.2 设在等距节点 x0 , x1 = x0 + h, · · · , xn = x0 + nh 处, y = f (x) 的取
值为 f0 , f1 , · · · , fn , 其中, h > 0 为相邻两节点间的距离, 称为步长. 称

∆fk = fk+1 − fk

为 f (x) 在 xk 处以 h 为步长的一阶向前差分, 简称为一阶差分; 并称

∆m fk = ∆m−1 fk+1 − ∆m−1 fk , m = 2, 3, · · · ,

为 m 阶差分.
特别地, 规定零阶差分为

∆0 fk = fk , k = 0, 1, · · · , n.

差分与差商之间有如下重要关系:
1.4 差分与等距节点插值 · 23 ·

∆m f0
f [x0 , x1 , · · · , xm ] = . (1.35)
m!h
事实上,
fk+1 − fk ∆fk
f [xk , xk+1 ] = = ,
h h

f [xk+1 , xk+2 ] − f [xk , xk+1 ] ∆2 fk
f [xk , xk+1 , xk+2 ] = = .
xk+2 − xk 2!h2
一般地, 由数学归纳法可以证明
∆m fk
f [xk , xk+1 , · · · , xk+m ] = .
m!hm
特别地, 当 k = 0 时, 得
∆m f0
. f [x0 , x1 , · · · , xm ] =
m!hm
此外, 利用归纳法我们还可以证明高阶差分和函数值之间的关系为
m
X
∆m fk = (−1)i Cm
i
fk+m−i , (1.36)
i=0

i
其中, Cm 为二项式系数, 且
i m!
Cm = .
i!(m − i)!
计算差分时, 可仿差商的计算格式, 列出差分表进行 (见表 1-3).

表 1-3 差分表
xi fi ∆fi ∆2 fi ∆3 fi ∆4 fi
x0 f0
∆f0
x1 f1 ∆2 f0
∆f1 ∆3 f0
x2 f2 ∆2 f1 ∆4 f0
∆f2 ∆3 f1
x3 f3 ∆2 f2
∆f3
x4 f4
.. .. .. .. .. ..
. . . . . .

上面讨论的是向前差分. 另外, 在一些应用场合会涉及向后差分和中心差分,


它们的定义和记号分别如下.
f (x) 在 xk 处的一阶和 m 阶向后差分分别为

∇fk = fk − fk−1


∇m fk = ∇m−1 fk − ∇m−1 fk−1 , m = 2, 3, · · · . (1.37)
· 24 · 第1章 插 值 法

f (x) 在 xk 处的一阶, m 阶中心差分分别为

δfk = fk+ 21 − fk− 12


δ m fk = δ m−1 fk+ 21 − f m−1 fk− 12 , m = 2, 3, · · · ,
h h
其中, fk− 12 , fk+ 12 分别表示 f (x) 在 x = xk − , xk + 处的函数值 (h 为步长).
2 2
各阶的向后差分和中心差分的计算同样可以通过构造相应的差分表来完成.
1.4.2 等距节点插值公式
将 Newton 插值多项式 (1.26) 中各阶差商分别用相应的差分代替, 就可以得到
各种形式的等距节点的插值公式. 但考虑到节点的选取方法与近似的效果有密切
联系, 故应视节点的不同分别选取进行讨论.
1. Newton 前插公式

已知节点为 xk = x0 + kh(k = 0, 1, · · · , n), 如果要用 m + 1 个函数值信息计算


x0 附近点 x 的 f (x) 函数近似值, 则 Newton 插值多项式可写为

∆f0 ∆2 f0
Nm (x) =f0 + (x − x0 ) + (x − x0 )(x − x1 )
h 2h2
m
∆ f0
+ ··· + (x − x0 ) · · · (x − xm−1 ), m = 1, 2, · · · , n.
m!hm
作线性变换
x = x0 + th, 0 6 t 6 m,

x − xk = (t − k)h, k = 0, 1, · · · , m.
于是
Nm (x) =Nm (x0 + th)
t(t − 1) 2 t(t − 1) · · · (t − m + 1) m
=f0 + t∆f0 + ∆ f0 + · · · + ∆ f0 , (1.38)
2! m!
相应的余项为
hm+1 f (m+1) (ξ)
Rm (x) = Rm (x0 + th) = t(t − 1) · · · (t − m), (1.39)
(m + 1)!

其中, ξ ∈ (x0 , xm ).
2. Newton 后插公式

如果要用 m + 1 个函数值计算函数在 xn 附近点的近似值, 则 Newton 插值多


1.4 差分与等距节点插值 · 25 ·

项式调整为

Nm (x) =f (xn ) + f [xn , xn−1 ](x − xn )


+ · · · + f [xn , xn−1 , · · · , xn−m ](x − xn ) · · · (x − xn−m+1 ). (1.40)

作变换
x = xn + th, −m 6 t 6 0,

x − xn−k = (t + k)h, k = −m, −m + 1, · · · , 0.
再由
∆k fn−k
f [xn , xn−1 , · · · , xn−k ] = , k = 0, 1, · · · , m,
k!hk
代入式 (1.40) 得
t(t + 1) 2
Nm (x) =Nm (xn + th) = fn + t∆fn−1 + ∆ fn−2
2!
t(t + 1) · · · (t + m − 1) m
+ ··· + ∆ fn−m , m = 1, 2, · · · , n. (1.41)
m!
相应的余项为
hm+1 f (m+1) (ξ)
Rm (x) = t(t + 1) · · · (t + m), (1.42)
(m + 1)!
其中, ξ ∈ (xn−m , xn ).
例 1.4 已知数据表
xi 0 1 2 3
f (xi ) 1.0000 1.6487 2.7183 4.4817

试用 Newton 前插公式作三次插值多项式, 并用二阶 Newton 后插公式计算 f (2.8)


的近似值.
解:根据给定数据表作差分表 1-4:

表 1-4 例 1.4 的各阶差分计算


xi fi ∆fi ∆2 fi ∆3 fi
0 1.0000
0.6487
1 1.6487 0.4209
1.0696 0.2729
2 2.7183 0.6938
1.7634
3 4.4817

则三次插值多项式为 (h = 1)
0.4209 0.2729
N3 (x) = 1 + 0.6487x + x(x − 1) + x(x − 1)(x − 2)
2! 3!
· 26 · 第1章 插 值 法

= 0.0455x3 + 0.0740x2 + 0.5292x + 1.0000.

二阶 Newton 后插公式为
0.6938
N2 (x) = 4.4817 + 1.7634(x − 3) + (x − 3)(x − 2)
2!
2 2
= 0.3469x + 0.0289x + 1.2729.

所以
f (2.8) ≈ N2 (2.8) = 4.0735.

在等距节点时, 利用差分表构造插值多项式可以减少计算量. 另外从差分表的


结构可以发现, 当测量数据 f0 , f1 , · · · , fn 中某个数据有较大误差时, 可以用差分表
寻查并修正这种误差.

1.5 埃尔米特 (Hermite) 插值


在某些应用场合, 我们不仅可以知道函数 f (x) 在一些节点的函数值, 而且还
能采集到这些节点处的导数值. 为了使插值函数能更好地反映原函数 f (x) 的变化
规律, 可要求构造的插值多项式与函数 f (x) 在节点处不仅有相同的函数值, 而且
还有相同的导数值. 这种插值称为 Hermite 插值.
设 x0 , x1 , · · · , xn 是 n+1 个互不相同的节点, 作一个 2n+1 次多项式 H2n+1 (x),
使它满足条件
0
H2n+1 (xi ) = f (xi ), H2n+1 (xi ) = f 0 (xi ), i = 0, 1, · · · , n, (1.43)

则称 H2n+1 (x) 为 Hermite 插值多项式.


仿 Lagrange 插值多项式 Ln (x) 的构造, 记
n
X n
X
H2n+1 (x) = hi (x)f (xi ) + h̄i (x)f 0 (xi ), (1.44)
i=0 i=0

其中, hi (x), h̄i (x) 均为 2n + 1 次多项式, 且满足


(
1, k = i,
hi (xk ) = h̄0i (xk ) = 0,
0, k 6= i,

或 (
1, k = i,
hi (xk ) = 0, h̄0i (xk ) = (1.45)
0, k 6= i.

这样作出的 H2n+1 (x) 显然满足条件式 (1.43). 就是说 H2n+1 (x) 是以 hi (x) 和


h̄i (x) 为基函数的线性组合. 沿用 Lagrange 插值基函数 li (x) 的记号, 由于 2n 次多
1.5 埃尔米特 (Hermite) 插值 · 27 ·

项式 [li (x)]2 具有性质


(
2 1, k = i,
[li (xk )] =
0, k 6= i,

且它的导数在 xk 的值为零 (k 6= i), 因此可将基函数 hi (x) 和 h̄i (x) 表示为

hi (x) = αi (x)[li (x)]2 , h̄i (x) = βi (x)[li (x)]2 , (1.46)

其中, αi (x), βi (x) 都是 x 的线性函数.


从而有
h0i (x) = αi0 (x)[li (x)]2 + 2αi (x)li (x)li0 (x),
(1.47)
h̄0i (x) = βi0 (x)[li (x)]2 + 2βi (x)li (x)li0 (x).

为满足条件式 (1.45), 由式 (1.46) 和 (1.47) 可得

αi (xi ) = 1, αi0 (xi ) + 2li0 (xi ) = 0,

βi (xi ) = 0, βi0 (xi ) = 1.

从而有
αi (x) = 1 − 2li0 (xi )(x − xi ), βi (x) = x − xi . (1.48)

将式 (1.48) 代入式 (1.46) 可得


n
X n
X
H2n+1 (x) = hi (x)f (xi ) + h̄i (x)f 0 (xi ),
i=1 i=0

其中

hi (x) = [1 − 2li0 (xi )(x − xi )][li (x)]2 ,


h̄i (x) = (x − xi )[li (x)]2 .

容易验证, 上述插值多项式是唯一的. 事实上, 如有两个 (或两个以上) 不超过


(1) (2) (1)
2n + 1 次的多项式 H2n+1 (x) 和 H2n+1 (x) 都满足插值条件式 (1.43), 且 H2n+1 (x) 6=
(2)
H2n+1 (x), 作
(1) (2)
H(x) = H2n+1 (x) − H2n+1 (x),

则 H(x) 也是不超过 2n + 1 次多项式, 且 H(x) 6= 0. 由于插值节点 x0 , x1 , · · · , xn


都是 H(x) 的二重零点, 则 H(x) 至少有 2n + 2 个零点, 故有 H(x) ≡ 0, 与假设矛
盾. 即满足条件式 (1.43) 的不超过 2n + 1 次的多项式 H2n+1 (x) 是唯一的.
· 28 · 第1章 插 值 法

当 f (x), f 0 (x), · · · , f (2n+1) (x) 在区间 [a, b] 上连续, f (2n+2) (x) 在区间 (a, b) 内
存在, 且 x0 , x1 , · · · , xn 是区间 [a, b] 上的互异节点时, 对任何 x ∈ [a, b], 仿 Lagrange
插值余项的推导, 可得 Hermite 插值多项式的余项为

f (2n+2) (ξ) 2
R2n+1 (x) = f (x) − H2n+1 (x) = ω (x), (1.49)
(2n + 2)! n+1
n
Y
其中, ξ ∈ (a, b); ωn+1 (x) = (x − xj ).
j=0

当 n = 1 时, 作为重要的特例可以得到满足条件

H3 (x0 ) = f (x0 ), H3 (x1 ) = f (x1 ),


H30 (x0 ) = f 0 (x0 ), H30 (x1 ) = f 0 (x1 ), x0 < x1 ,

的两点三次 Hermite 插值多项式


µ ¶µ ¶2 µ ¶µ ¶2
x − x0 x − x1 x − x1 x − x0
H3 (x) = 1 + 2 f (x0 ) + 1 + 2 f (x1 )
x1 − x0 x0 − x1 x0 − x1 x1 − x0
µ ¶2 µ ¶2
x − x1 0 x − x0
+ (x − x0 ) f (x0 ) + (x − x1 ) f 0 (x1 ).
x0 − x1 x1 − x0

相应的插值余项为
f (4) (ξ)
R3 (x) = f (x) − H3 (x) = (x − x0 )2 (x − x1 )2 , ξ ∈ (x0 , x1 ).
4!
Hermite 插值问题的形式是多样的, 对一个具体问题的解法也往往不唯一, 如
能充分利用问题的特点, 那么求解的过程就有可能简化.
例 1.5 设 a 6 x0 < x1 < x2 6 b, f (x) 在区间 [a, b] 上具有连续的四阶导数.
试求满足条件
P (xi ) = f (xi ), i = 0, 1, 2,

P 0 (x1 ) = f 0 (x1 )

的插值多项式 P (x), 并估计误差.


解:显然由插值条件可以确定一个次数不超过三次的插值多项式 P (x). 由于
此多项式通过点 (x0 , f (x0 )), (x1 , f (x1 )), (x2 , f (x2 )), 故设其形式为

P (x) =f (x0 ) + f [x0 , x1 ](x − x0 ) + f [x0 , x1 , x2 ](x − x0 )(x − x1 )


+ A(x − x0 )(x − x1 )(x − x2 ), (1.50)

其中, A 为待定系数, 可由插值条件 P 0 (x1 ) = f 0 (x1 ) 来确定.


1.6 三次样条插值 · 29 ·

为了确定 A, 对式 (1.50) 两边求导数, 得

P 0 (x) =f [x0 , x1 ] + f [x0 , x1 , x2 ](2x − x0 − x1 )


+ A[(x − x1 )(x − x2 ) + (x − x0 )(x − x2 ) + (x − x0 )(x − x1 )].

令 x = x1 , 并利用 P 0 (x1 ) = f 0 (x1 ) 即得

f 0 (x1 ) = f [x0 , x1 ] + f [x0 , x1 , x2 ](x1 − x0 ) + A(x1 − x0 )(x1 − x2 ).

于是
f 0 (x1 ) − f [x0 , x1 ] − f [x0 , x1 , x2 ](x1 − x0 )
A= .
(x1 − x0 )(x1 − x2 )
代入式 (1.50) 即得 P (x).
为了求出其余项表达式, 设

R(x) = f (x) − P (x).

由插值条件知 x0 , x1 , x2 都是 R(x) 的零点 (其中, x1 是二重零点), 故令

R(x) = k(x)(x − x0 )(x − x1 )2 (x − x2 ),

其中, k(x) 是待定函数. 为求得 k(x), 把 x 看成 [a, b] 上任意固定点, 且异于 xi (i =


0, 1, 2), 作辅助函数

ϕ(t) = f (t) − P (t) − k(x)(t − x0 )(t − x1 )2 (t − x2 ),

则 ϕ(t) 在区间 [a, b] 上有四阶连续导数, 且至少有 5 个零点 (x1 是二重零点). 反


复对 ϕ(t) 应用 Rolle 定理, 得 ϕ(4) (t) 在区间 (a, b) 内至少有一个零点, 即存在
ξ ∈ (a, b), 使
ϕ(4) (ξ) = f (4) (ξ) − 4!k(x) = 0,
于是
1 (4)
k(x) = f (ξ).
4!
从而
f (4) (ξ)
R(x) = (x − x0 )(x − x1 )2 (x − x2 ), ξ ∈ (a, b).
4!

1.6 三次样条插值
1.6.1 多项式插值的缺陷与分段插值
对于足够光滑的函数 f (x), 当其插值多项式的次数逐渐增高时, 是否能使逼近
的程度也得到逐步的改善呢?
· 30 · 第1章 插 值 法

例 1.6 考察函数
1
f (x) = , x ∈ [−1, 1].
1 + (5x)2
1
现把 [−1, 1] 区间分为 10 等分, 取分点 xk = −1 + k (k = 0, 1, · · · , 10) 为插值节
5
点, 则可作一个十次插值多项式 P10 (x). 将 f (x) 与 P10 (x) 在区间 [0.8, 1] 上一些点
分别取值列于表 1-5.

表 1-5 f (x) 与 P10 (x) 部分点取值比较


x 0.80 0.86 0.90 0.96 1.00
f (x) 0.058 82 0.051 31 0.047 06 0.041 60 0.038 46
P10 (x) 0.058 82 0.888 08 1.578 72 1.804 38 0.038 46

从表 1-5 中可以看出 f (x) 与 a(i)


ii 6= 0 除插值节点 x = 0.8, 1 外, 其余三点的值
差异很大. 事实上, 可进一步作出 f (x) 与 P10 (x) 在区间 [−1, 1] 上的草图, 如图 1-1
所示.

图 1-1 高次多项式插值缺陷

从图 1-1 中可以发现, 除在 x = 0 附近 P10 (x) 能较好地逼近 f (x), 其余效果都


不理想, 尤其是在 (0.8,1) 上 f (x) 与 P10 (x) 差异很大. 可见加密插值节点不能保证
所得的插值多项式更好地逼近 f (x). 这种现象称为龙格 (Runge) 现象. 由于这个
原因, 在用多项式插值时不宜选择次数太高的多项式.
为了提高逼近效果而避免 Runge 现象, 有效的途径之一是进行分段插值, 并且
当插值节点很多时, 用分段低次插值. 由于插值函数必须通过给定点, 故分段插值
仍可保持整体的连续性.
例如, 最基本的分段线性插值 (折线插值):过 (x0 , f (x0 )), (x1 , f (x1 )), · · · , (xn ,
f (xn )) 点作相连折线, 如图 1-2 所示.
1.6 三次样条插值 · 31 ·

图 1-2 分段插值示意图

此时插值函数为


 P1 (x), x ∈ [x0 , x1 ],


 P (x), x ∈ [x1 , x2 ],
2
P (x) =

 ······



Pn (x), x ∈ [xn−1 , xn ],

其中
x − xi x − xi−1
Pi (x) = f (xi−1 ) + f (xi ), i = 1, · · · , n.
xi−1 − xi xi − xi−1
分段多项式插值有较好的局部性质, 可由于分段原因, 虽然在连接处能连续但
常常不够光滑, 即导数或高阶导数不连续. 因此如果既要克服高次插值多项式的不
足, 又要有一定的光滑性, 就需要样条插值来实现.

1.6.2 三次样条插值函数

所谓 “样条” 就是工程设计中的一种绘图工具 —— 富有弹性的细长条. 设计


过程中人们就把这种样条强制地固定经过一些已知点, 以形成光滑曲线. 三次样条
插值来源于这样的工程实际.
定义 1.3 设在 a 6 x0 < x1 < · · · < xn 6 b 处, 函数 y = f (x) 取值分别为
f (x0 ), f (x1 ), · · · , f (xn ), 如果函数 S(x) 满足下列条件:
(1) S(x) 在每一个子区间 [xi−1 , xi ](i = 1, 2, · · · , n) 上是不超过三次的多项式.
(2) S(x) ∈ C 2 [a, b].
(3) S(xi ) = f (xi ) (i = 0, 1, · · · , n).
则称 S(x) 为 f (x) 在区间 [a, b] 上的三次样条插值函数.
由于 S(x) 在每个子区间 [xi−1 , xi ](i = 1, 2, · · · , n) 上是一个三次多项式, 记为
Si (x), 则
Si (x) = ai + bi x + ci x2 + di x3 , x ∈ [xi−1 , xi ],
· 32 · 第1章 插 值 法

其中含有 4 个待定系数 ai , bi , ci 和 di . 因此, 要确定整个三次样条插值函数 S(x),


必须确定 4n 个待定系数.
再分析已知条件的个数. 条件 (2) 表明 S(x), S 0 (x), S 00 (x) 在节点 x1 , x2 , · · · ,
xn−1 上连续, 于是它们在这些点上的左、右极限相等, 这样可得到 3(n − 1) 个等式,
从而提供了包含未知数 ai , bi , ci 和 di 的 3n − 3 个方程; 而条件 (3) 又提供了 n + 1
个方程. 这样, 可以得到 4n − 2 个方程.
显然, 要确定 4n 个待定参数仍缺少两个条件. 而所缺的两个条件通常只能在
区间 [a, b] 的两个端点处给出, 因此称为边界 (或端点) 条件.
边界条件应根据实际问题的要求来确定, 其类型众多, 典型的边界条件有:
(1) 已知两端的一阶导数值, 即

S 0 (x0 ) = f 0 (x0 ), S 0 (xn ) = f 0 (xn ).

(2) 已知两端的二阶导数值, 即

S 00 (x0 ) = f 00 (x0 ), S 00 (xn ) = f 00 (xn ).

特别地, S 00 (x0 ) = S 00 (xn ) = 0 时, 称之为自然边界条件. 满足自然边界条件的样条


函数称为自然样条函数.
1.6.3 三次样条插值函数的构造方法
理论上, 我们可以利用 S(x), S 0 (x), S 00 (x) 在点 xi (i = 1, 2, · · · , n − 1) 上的连
续性以及 n + 1 个给定节点的函数值加上两个边界条件, 列出包含 4n 个待定参数
ai , bi , ci 和 di (i = 1, 2, · · · , n) 的线性方程组, 从而解得 S(x) 在各子区间上的表达
式 Si (x) 的各项系数. 但此法工作量相当大, 不具备实用意义.
1. 节点处一阶导数表示的三次样条函数

如果能求得 S 0 (x) 在各个节点 xi (i = 1, 2, · · · , n) 上的值 mi = S 0 (xi ), 那么构造


S(x) 就十分容易了. 因为若已知 mi (i = 0, 1, · · · , n), S(x) 在子区间 [xi−1 , xi ] (i =
1, 2, · · · , n) 上就已经是一个满足插值条件

S(xi−1 ) = f (xi−1 ), S(xi ) = f (xi ),

S 0 (xi−1 ) = mi−1 , S 0 (xi ) = mi

的三次 Hermite 插值多项式了. 若记 S(x) 在子区间 [xi−1 , xi ](i = 1, 2, · · · , n) 上的


三次多项式为 Si (x), hi = xi − xi−1 , 则由两点三次 Hermite 插值公式, 可得
(x − xi )2 [2(x − xi−1 ) + hi ] (x − xi−1 )2 [2(xi − x) + hi ]
Si (x) = 3 f (xi−1 ) + f (xi )
hi h3i
1.6 三次样条插值 · 33 ·

(xi − x)2 (x − xi−1 ) (x − xi−1 )2 (x − xi )


+ mi−1 + mi . (1.51)
h2i h2i

但 mi (i = 1, 2, · · · , n) 实际上是未知的, 为了确定 mi , 我们可以利用 S(x) 的二阶


导数在节点 xi (i = 1, 2, · · · , n − 1) 上连续的条件, 即可通过 Si00 (xi ) = Si+1
00
(xi ) 去确
定. 为此, 对 Si (x) 求二阶导数, 整理得
6x − 2xi−1 − 4xi 6x − 4xi−1 − 2xi
Si00 (x) = mi−1 + mi
h2i h2i
6(xi−1 + xi − 2x)
+ [f (xi ) − f (xi−1 )], (1.52)
h3i

于是
2 4 6
Si00 (xi ) = mi−1 + mi − 2 [f (xi ) − f (xi−1 )].
hi hi hi
同理可得
00 6x − 2xi − 4xi+1 6x − 4xi − 2xi+1
Si+1 (x) = mi + mi+1
h2i+1 h2i+1
6(xi + xi+1 − 2x)
+ [f (xi+1 ) − f (xi )].
h3i+1

于是
00 4 2 6
Si+1 (xi ) = − mi − mi+1 + [f (xi+1 ) − f (xi )]. (1.53)
hi+1 hi+1 h2i+1
由 Si00 (xi ) = Si+1
00
(xi ) 得
µ ¶
2 4 4 2
mi−1 + + mi + mi+1
hi hi hi+1 hi+1
· ¸
f (xi+1 ) − f (xi ) f (xi ) − f (xi−1 )
=6 + . (1.54)
h2i+1 h2i
µ ¶
1 1
用2 + 除式 (1.54) 两边, 且记
hi hi+1

hi+1 hi
λi = , µi = 1 − λi = ,
hi + hi+1 hi + hi+1
gi = 3{µi f [xi , xi+1 ] + λi f [xi−1 , xi ]}, i = 1, 2, · · · , n − 1,

则可得
λi mi−1 + 2mi + µi mi+1 = gi , i = 1, 2, · · · , n − 1. (1.55)

该 n − 1 个方程组成的线性方程组含 m0 , m1 , · · · , mn 共 n + 1 个未知数, 因此想要


唯一确定它的值, 还需用到两个边界条件:
· 34 · 第1章 插 值 法

(1) 已知两端的一阶导数值, 即已给定 S(x) 在区间端点处的一阶导数值

m0 = f 0 (x0 ), mn = f 0 (xn ).

这样方程组 (1.55) 中实际仅含 n − 1 个未知数 m1 , m2 , · · · , mn−1 , 则方程组 (1.55)


可改写成
    
2 µ1 m1 g1 − λ1 f 0 (x0 )
    
 λ2 2 µ2   m2   g2 
    
 . .. . .. . ..   .
..   .
.. 
  = . (1.56)
    
    
 λn−1 2 µn−1   mn−2   gn−2 
λn 2 mn−1 gn − µn f 0 (xn )

(2) 已知两端的二阶导数值, 由于已知

S 00 (x0 ) = f 00 (x0 ), S 00 (xn ) = f 00 (xn ),

由式 (1.52) 可知 S 00 (x) 在 [x0 , x1 ] 上的表达式为


6x − 2x0 − 4x1 6x − 4x0 − 2x1
S100 (x) = 2 m0 + m1
h1 h21
6(x0 + x1 − 2x)
+ [f (x1 ) − f (x0 )].
h31

于是, 由条件 S 00 (x0 ) = f 00 (x0 ), 即得


4 2 6
f 00 (x0 ) = − m0 − m1 + 2 [f (x1 ) − f (x0 )].
h1 h1 h1

故有
f (x1 ) − f (x0 ) h1 00
2m0 + m1 = 3 − f (x0 ). (1.57)
h1 2
同理, 由条件 S 00 (xn ) = f 00 (xn ) 得
f (xn ) − f (xn−1 ) hn 00
mn−1 + 2mn = 3 + f (xn ). (1.58)
hn 2
结合式 (1.55), (1.57) 和 (1.58), 即得确定 m0 , m1 , · · · , mn 的线性方程组
    
2 1 m0 g0
    
 λ1 2 µ1   m1   g1 
    
 .. .. ..  ..   .. 
 . . .   .  =  , (1.59)
    . 
    
 λn 2 µn   mn−1   gn−1 
1 2 mn gn
1.6 三次样条插值 · 35 ·

其中
f (x1 ) − f (x0 ) h1 00
g0 = 3 − f (x0 ),
h1 2
f (xn ) − f (xn−1 ) hn 00
gn = 3 + f (xn ).
hn 2
对于线性方程组 (1.56) 和 (1.59), 可证明它们的系数矩阵都是非奇异的, 从而
这些方程组都有唯一确定的解.
解上述方程组 (此类型的线性方程组称为三对角方程组, 可用简便的 “追赶法”
求解. 具体实施过程见 6.4 节), 求出 m0 , m1 , · · · , mn 的值, 将它们代入式 (1.51) 即
得三次样条插值函数在各子区间上的表达式.
例 1.7 已知数据表

xi 0 1 2 3
f (xi ) 0 2 3 6
f 0 (xi ) 1 0

求满足上述数据表的三次样条插值函数, 并计算 f (0.3) 和 f (2.4) 的近似值.


解:这是已知两端一阶导数的情形下的插值问题, 且 n = 3, 故确定 m1 , m2 的
方程组如式 (1.56), 其中系数 λi , µi 与 gi 可按下面步骤进行计算:

hi : h1 = 1, h2 = 1, h3 = 1.
1 1
λi : λ1 = , λ2 = .
2 2
1 1
µi : µ1 = , µ2 = .
2 2
9
gi : g1 = 3{µ1 f [x1 , x2 ] + λ1 f [x0 , x1 ]} = ,
2
g2 = 3{µ2 f [x2 , x3 ] + λ2 f [x1 , x2 ]} = 6,


g1 − λ1 f 0 (x0 ) = 4,
g2 − µ2 f 0 (x3 ) = 6.

故确定 m1 , m2 的方程组为
 
1 " # " #
 2 
2  m 1 4
 1 = ,
2 m2 6
2
解得
4 8
m1 = , m2 = .
3 3
· 36 · 第1章 插 值 法

于是由式 (1.51) 知, S(x) 在区间 [0,1] 上的表达式为

(x − x1 )2 [2(x − x0 ) + h1 ] (x − x0 )2 [2(x1 − x) + h1 ]
S1 (x) = 3 f (x0 ) + f (x1 )
h1 h31
(x1 − x)2 (x − x0 ) (x − x0 )2 (x − x1 )
+ m 0 + m1
h21 h21
4
=2x2 (3 − 2x) + x(x − 1)2 + x2 (x − 1)
3
5 3 8 2
= − x + x + x.
3 3
同理可得, S(x) 在区间 [1,2] 与 [2,3] 上的表达式分别为
25 2 11
S2 (x) = 2x3 − x + 12x − ,
3 3
10 3 71 2
S3 (x) = − x + x − 52x + 39.
3 3
故所求三次样条插值函数 S(x) 在所讨论的区间 [0,3] 上的表达式为

 5 8

 − x3 + x2 + x, x ∈ [0, 1],

 3 3


25 11
S(x) = 2x3 − x2 + 12x − , x ∈ [1, 2],

 3 3



 10 3 71 2
 − x + x − 52x + 39, x ∈ [2, 3].
3 3
利用 S(x) 的表达式就容易计算 f (0.3) 与 f (2.4) 的近似值了.
由于 0.3 ∈ [0, 1], 故用 S1 (x) 计算得到

f (0.3) ≈ S1 (0.3) = 0.495.

同理可得
f (2.4) ≈ S3 (2.4) = 4.44.

下面给出已知两端的二阶导数值, 求 S(x) 的计算步骤.


① 输入初始数据 xi , f (xi ) (i = 0, 1, · · · , n) 及其 f 00 (x0 ), f 00 (xn ).
② 计算
f (xi ) − f (xi−1 )
hi = xi − xi−1 , f [xi−1 , xi ] = , i = 1, 2, · · · , n.
hi

③ 计算
hi+1
λi = , µi = 1 − λi ,
hi + hi+1
1.6 三次样条插值 · 37 ·

gi = 3{µi f [xi , xi+1 ] + λi f [xi−1 , xi ]}, i = 1, 2, · · · , n − 1,


h1
g0 = 3f [x0 , x1 ] − f 00 (x0 ),
2
hn 00
gn = 3f [xn−1 , xn ] + f (xn ).
2
④ 解方程组 (1.59), 求出 mi (i = 0, 1, · · · , n).
⑤ 算出 S(x) 的系数或计算 S(x) 在指定点上的值.
⑥ 输出结果.
2. 节点处二阶导数表示的三次样条函数

同样地, 如求得 S(x) 在各节点处的二阶导数值 Mi = f 00 (xi ) (i = 0, 1, · · · , n),


我们一样容易求得三次样条函数 S(x).
事实上, 因为 S 00 (x) 在 [xi−1 , xi ] (i = 1, 2, · · · , n) 上应是一个线性函数, 所以
xi − x x − xi−1
Si00 (x) = Mi−1 + Mi . (1.60)
hi hi
将式 (1.60) 积分两次得
(xi − x)3 (x − xi−1 )3
Si (x) = Mi−1 + Mi + Ai (x − xi ) + Bi .
6hi 6hi
利用 Si (xi−1 ) = f (xi−1 ), Si (xi ) = f (xi ) 就可确定待定常数 Ai , Bi , 即有
f (xi ) − f (xi−1 ) hi
Ai = − (Mi − Mi−1 ),
hi 6
h2i
Bi = f (xi ) − Mi .
6
所以
· ¸
(xi − x)3 (x − xi−1 )3 Mi−1 2 (xi − x)
Si (x) = Mi−1 + Mi + f (xi−1 ) − hi
6hi 6hi 6 hi
· ¸
Mi 2 (x − xi−1 )
+ f (xi ) − h , i = 1, 2, · · · , n, (1.61)
6 i hi

其中, Mi (i = 0, 1, · · · , n) 同样是未知的, 可利用 S(x) 在节点 xi (i = 1, 2, · · · , n − 1)


上一阶导数连续的条件, 即由 Si0 (xi ) = Si+1 0
(xi ) 来确定它们.
对式 (1.61) 两边关于 x 求导得
(xi − x)2 (x − xi−1 )2 f (xi ) − f (xi−1 ) Mi − Mi−1
Si0 (x) = − Mi−1 + Mi + − hi .
2hi 2hi hi 6
于是
hi hi
Si0 (xi ) = Mi−1 + Mi + f [xi−1 , xi ]. (1.62)
6 3
· 38 · 第1章 插 值 法

同理可得
0 hi+1 hi+1
Si+1 (xi ) = Mi − Mi+1 + f [xi , xi+1 ]. (1.63)
3 6
由于 Si0 (xi ) = Si+1
0
(xi ), 故有
hi hi + hi+1 hi+1
Mi−1 + Mi + Mi+1 = f [xi , xi+1 ] − f [xi−1 , xi ]. (1.64)
6 3 6
沿用前面的记号, 将式 (1.64) 整理得
µi Mi−1 + 2Mi + λi Mi+1 = di , i = 1, 2, · · · , n − 1, (1.65)

其中
di = 6f [xi−1 , xi , xi+1 ].
这 n − 1 个方程一样含有 M0 , M1 , · · · , Mn 共 n + 1 个未知量, 也需要加上两
个边界条件才能确定:
(1) 已知两端的一阶导数值时, 即有

S10 (x0 ) = f 0 (x0 ), Sn0 (xn ) = f 0 (xn ).

由式 (1.62) 和 (1.63) 分别整理得


6
2M0 + M1 = {f [x0 , x1 ] − f 0 (x0 )} = d0 ,
h1
6
Mn−1 + 2Mn = {f 0 (xn ) − f [xn−1 , xn ]} = dn . (1.66)
hn
结合式 (1.65) 和 (1.66) 得满足 M0 , M1 , · · · , Mn 的线性方程组为
    
2 1 M0 d0
    
 µ1 2 λ1   M1   d 1 
    
 .. .. ..  ..   .. 
 . . .  . = . . (1.67)
    
    
 µn−1 2 λn−1   Mn−1   dn−1 
1 2 Mn dn
(2) 已知两端的二阶导数值时, 即已知

M0 = f 00 (x0 ), Mn = f 00 (xn ),

则式 (1.65) 可改写成
    
2 λ1 M1 d1 − µ1 f 00 (x0 )
    
 µ2 2 λ2   M2   d2 
    
 . .. . .. ..  ..   .. 
 .  . = .  . (1.68)
    
    
 µn−2 2 λn−2   Mn−2   dn−2 
µn−1 2 Mn−1 dn−1 − λn−1 f 00 (xn )
1.6 三次样条插值 · 39 ·

对于方程组 (1.67) 和 (1.68), 同样可以证明它们都有唯一确定的解, 求 M0 ,


M1 , · · · , Mn 的值, 将它们代入公式 (1.61) 可得 S(x) 在各子区间上的表达式.

1.6.4 两点说明
1. 关于插值的误差估计

定理 1.3 设 f (x) ∈ C 4 [a, b], S(x) 是 f (x) 的满足插值条件和两类边界条件


之一的三次样条插值函数, 则
¯ ¯
¯ (m) ¯
¯f (x) − S (m) (x)¯ 6 Cm h(4−m) kf (4) k∞ , m = 0, 1, 2, 3,

其中
5 1 3 α + α−1
C0 = , C1 = , C2 = , C3 = , h = max hi ,
384 24 8 2 i

h
α= , kf (4) k∞ = max |f (4) (x)|.
min hi α6x6b
i
证明:略.
可以看出, 只要 h → 0, 便能保证 S(x) → f (x), S 00 (x) → f 00 (x).
2. 关于样条函数的统一表示形式

上面得到的三次样条插值函数是以分段形式表示的, 即


 S1 (x), x ∈ [x0 , x1 ],


 S (x), x ∈ [x , x ],
2 1 2
S(x) =

 ······



Sn (x), x ∈ [xn−1 , xn ].

当这种表示方法在分析使用不方便时, 我们可把它们写成另一种统一表达形式.
事实上, 以分两段情形为例. 设
(
S1 (x), x ∈ [x0 , x1 ],
S(x) =
S2 (x), x ∈ [x1 , x2 ].

由于
S1 (x1 ) = S2 (x1 ), S10 (x1 ) = S20 (x1 ), S100 (x1 ) = S200 (x1 ),

则 x = x1 是 P (x) = S2 (x) − S1 (x) 的三重零点, 即

S2 (x) − S1 (x) = b1 (x − x1 )3 , b1 为确定常数.

所以 (
S1 (x), x ∈ [x0 , x1 ],
S(x) = 3
S2 (x) + b1 (x − x1 ) , x ∈ [x1 , x2 ],
· 40 · 第1章 插 值 法

记作
S(x) = S1 (x) + b1 (x − x1 )3+ ,
其中 (
0, x < x1 ,
(x − x1 )3+ = 3
(x − x1 ) , x > x1 ,

称为截断幂函数.
一般地, n + 1 个节点的三次样条插值函数可表示为

S(x) = a0 + a1 x + a2 x2 + a3 x3 + b1 (x − x1 )3+ + · · · + bn−1 (x − xn−1 )3+ .

习 题 1
π π π π π
1. 已知 sin x 在 x = 0, , , , 的值, 试用二次插值多项式求 sin x 在 x = 的近似
6 4 3 2 5
值, 并估计误差.
2. 设 x0 , x1 , · · · , xn 为互不相同的节点, 证明:
n
X
(1) lk (x) = 1.
k=0
Xn
(2) lk (x)g(xk ) = g(x), g(x) 为不超过 n 次的多项式.
k=0

3. 在 1 6 x 6 10 上给出 f (x) = ln x 的等距节点函数表, 若用二次插值多项式求 ln x 的


近似值, 要使截断误差不超过 10−6 , 问该函数表的步长 h 应取多少?
4. 设 f (x) 在区间 [a, b] 上有连续的二阶导数, 且 f (a) = f (b) = 0, 证明:

1 ¯ ¯
(b − a)2 max ¯f 00 (x)¯ .
max |f (x)| 6
a6x6b 8 a6x6b

· ¸
1 1 1 1 1 1
5. 设 f (x) = x5 + 3x3 + x + 1, 试求 f [1, 2, 3, 4, 5, 6] 及 f 1, , , , , , 的差商值.
2 3 4 5 6 7
6. 已知数据表

xi 0.2 0.4 0.6 0.8


f (xi ) 0.199 56 0.396 46 0.588 13 0.772 10

试分别用二次、三次 Newton 插值多项式求 f (0.45) 的近似值.


7. 如果 f (x) 是 m 次多项式, 记 ∆f (x) = f (x + h) − f (x), 证明 f (x) 的 k 阶差分
k
∆ f (x)(0 6 k < m) 是 m − k 次多项式.
8. 已知数据表

xi 0.4 0.5 0.6 0.7


f (xi ) 0.389 42 0.479 43 0.564 64 0.644 22
习 题 1 · 41 ·

(1) 用二阶的 Newton 前插公式求 f (0.45) 的近似值.


(2) 用二阶的 Newton 后插公式求 f (0.65) 的近似值.
9. 求满足条件
xi 1 2
f (xi ) 2 3
f 0 (xi ) 1 –1

的 Hermite 插值多项式.
10. 求一个次数不高于 4 次的多项式 P (x), 使其满足

P (0) = P 0 (0) = 0, P (1) = P 0 (1) = 1, P (2) = 1,

并估计误差.
11. 设 x0 , x1 , · · · , xn 为互不相同的节点, 证明:
n
X n
X
xi hi (x) + h̄i (x) = x,
i=0 i=0

其中, hi (x) = [1 − 2li (xi )(x − xi )][li (x)]2 , h̄i (x) = (x − xi )[li (x)]2 , 而 li (x) 是 Lagrange 插值
基函数.
12. 已知数据表
xi 0 1 2 3
f (xi ) 1 3 6 5
f 0 (xi ) 2 –1

求在区间 [0,3] 上的三次样条插值函数.


13. 已知数据表
xi 1 2 4 5
f (xi ) 1 3 4 2
f 0 (xi ) 0 0

求在区间 [1,5] 上三次样条插值函数 (自然样条插值函数).


14. 设 x0 , x1 , · · · , xn 为互不相同的节点, 函数 y = f (x) 在节点处的取值分别为 f (x0 ),
f (x1 ), · · · , f (xn ), 若取一个函数
n
X
Pn (x) = ak ekx ,
k=0

使得 Pn (xi ) = f (xi ) (i = 0, 1, · · · , n) 成立, 证明 a0 , a1 , · · · , an 是唯一确定的.


15. 证明: k
X f (xi )
f [x0 , x1 , · · · , xk ] = 0
,
i=0
ωk+1 (xi )
k
Y
其中, ωk+1 = (x − xj ).
j=0
第2章 曲线拟合与平方逼近
插值思想给出了一类确定函数 y = f (x) 的近似函数方法, 但插值方法在某些
应用场合却有一定的局限性. 例如, 在科学研究和技术探索的过程中, 当我们面对
的是还未能较深刻认识的实际问题时, 常采用的有效手段之一就是通过大量的实验
去揭示其内在规律. 对于实验中采集到的大量观测数据:

(xi , f (xi )), i = 1, 2, · · · , N (甚大), (2.1)

为了分析其内在的变化过程或预测发展趋势, 就数学意义而言, 即要寻找一个函数


y = p(x), 使其能较好地密合这些观测数据的散布规律.
对于函数 p(x) 的确定, 理论上我们可以用插值方法进行处理, 而当数据量太大
时, 插值方法的不足是显然的. 原因是:
(1) 大量的实验数据难以保证每个数据值都有好的精确性, 而当其中有些数据
存在一定的误差时, 由于插值条件的要求, 其误差将完全被插值函数进一步继承.
(2) 即使所有的观测数据都较精确, 但为了避免插值多项式次数过高而产生
Runge 现象, 必须进行过多的分段处理, 而分段插值不能具有较好的整体变化趋势
和光滑性. 三次样条插值函数虽有好的光滑性, 可繁杂的表达式又在一定程度上限
制了进一步的分析与应用.
因此, 我们来讨论近似函数 P (x) 的另一类确定方法 ——逼近.

2.1 观测数据的最小二乘拟合
2.1.1 最小二乘问题

对于给定的观测数据式 (2.1), 设
n
X
P (x) = ak ϕk (x), n ¿ N, (2.2)
k=0

其中, ϕ0 (x), ϕ1 (x), · · · , ϕn (x) 是基函数, 根据观测数据的实际情况可分别取为确定


的幂函数、三角函数、指数函数等; 并称 P (x) 为拟合函数.
一般地, 当测量数据的散布图无明显的规律 (如周期性、单调性等) 时, 习惯上
就将 P (x) 取为一个不超过 n 次的代数多项式, 即取
2.1 观测数据的最小二乘拟合 · 43 ·

ϕk (x) = xk , k = 0, 1, 2, · · · , n.

相应地, 称 P (x) 为拟合多项式, 设其表示形式为


n
X
Pn (x) = a0 + a1 x + · · · + an xn = ak xk , (2.3)
k=0

δi = f (xi ) − Pn (xi ), i = 1, 2, · · · , N,

则称 δi 为 xi 处的偏差或残差. 在一般情况下, 要使所有的 δi 都等于零是不可能


的 (因为往往得到矛盾的方程组). 由于偏差有正有负, 为了避免相互抵消, 且进一
步考虑到不同点的观测数据所具有的重要性不同, 作函数
N N
" n
#2
X X X
φ(a0 , a1 , · · · , an ) = ωi δi2 = ωi f (xi ) − ak xki , (2.4)
i=1 i=1 k=0

其中, ωi > 0(i = 1, 2, · · · , N ) 称为权系数, 它的大小反映了该点数据的重要程度,


通常 ωi 恒等于 1, 即 ωi ≡ 1(i = 1, 2, · · · , N ). 显然, 要使 Pn (x) 能很好地密合实验
数据式 (2.1), 则应使每一点 xi 处的偏差的平方和尽可能小, 即有
N
" n
#2
X X
min φ(a0 , a1 , · · · , an ) = min ωi f (xi ) − ak xki . (2.5)
a0 ,a1 ,··· ,an ∈R a0 ,a1 ,··· ,an ∈R
i=1 k=0

n
X
称多元极值问题式 (2.5) 为最小二乘问题, 而满足式 (2.5) 的解 Pn∗ (x) = a∗k xk 为
k=0
最小二乘拟合多项式.
2.1.2 正规方程组
由微分可知, 式 (2.5) 的解 a∗0 , a∗1 , · · · , a∗n 应该满足方程组
∂φ
= 0, j = 0, 1, · · · , n,
∂aj

而 " #
XN n
X
∂φ
=2 ωi f (xi ) − ak xi (−xji ),
k
j = 0, 1, · · · , n, (2.6)
∂aj i=1 k=0


N
X n
X N
X
ωi xji f (xi ) − ak ωi xk+j
i = 0, j = 0, 1, · · · , n,
i=1 k=0 i=1


· 44 · 第2章 曲线拟合与平方逼近

 X X X X

 a0 ωi + a1 ωi xi + · · · + an ωi xni = ωi f (xi ),



 X X X X

 a
0 ωi xi + a1 ωi x2i + · · · + an ωi xn+1
i = ωi xi f (xi ),
(2.7)



 ······


 a X ω xn + a X ω xn+1 + · · · + a X ω x2n = X ω xn f (x ),

0 i i 1 i i n i i i i i

X N
X
其中, ·= ·. n + 1 阶线性方程组 (2.7) 称为正规方程组 (或法方程组). 下面
i=1
将说明正规方程组 (2.7) 解的存在唯一性, 并进一步确认这一组解将使问题式 (2.5)
有解.
定理 2.1 正规方程组 (2.7) 有唯一解.
证明:用反证法. 若不然, 则正规方程组 (2.7) 相应的齐次方程组
n
X N
X
ak ωi xik+j = 0, j = 0, 1, · · · , n, (2.8)
k=0 i=1

有非零解.
用 aj (j = 0, 1, 2, · · · , n) 分别乘等式 (2.8) 两边, 然后所得的 n + 1 式相加得
n n N N n n N
à n !2
X X X k+j
X X j
X X X
k k
0= aj ak ωi xi = ωi aj xi ak xi = ωi ak xi ,
j=0 k=0 i=1 i=1 j=0 k=0 i=1 k=0

n
X
因此有 ak xki = 0 (i = 1, 2, · · · , N ), 即 n 次多项式 Pn (x) 有 N 个零点 xi (i =
k=0
1, 2, · · · , N ). 由于 n ¿ N , 故必有 ak = 0(k = 0, 1, 2, · · · , n), 与齐次方程组 (2.8) 有
非零解矛盾. 证毕.
n
X
定理 2.2 设 a∗k (k = 0, 1, · · · , n) 为正规方程组 (2.7) 的解, 则 Pn∗ (x) = a∗k xk
k=0
为式 (2.5) 的解.
证明:对于任意的一组实数 bk = 0(k = 0, 1, 2, · · · , n), 构造不超过 n 次的多
项式
n
X
P (x) = bk xk ,
k=0

其相应的偏方差的平方和为 φ(b0 , b1 , · · · , bn ), 由于

φ(b0 , b1 , · · · , bn ) − φ(a∗0 , a∗1 , · · · , a∗n )


N
" n
#2 N
" n
#2
X X X X
= ωi f (xi ) − bk xki − ωi f (xi ) − a∗k xki
i=1 k=0 i=1 k=0
2.1 观测数据的最小二乘拟合 · 45 ·

 2 " #2
N
X n
X n
X n
X N
X n
X
= ωi f (xi ) − a∗k xki + a∗j xji − bj xji  − ωi f (xi ) − a∗k xki
i=1 k=0 j=0 j=0 i=1 k=0
N
" n
# n
X X X
>2 ωi f (xi ) − a∗k xki (a∗j − bj )xji
i=1 k=0 j=0
n N
" n
#
X X X
=2 (a∗j − bj ) ωi f (xi ) − a∗k xki xji
j=0 i=1 k=0
Xn
∂φ(a∗0 , · · · , a∗n )
=− (a∗j − bj ) ,
j=0
∂aj

且 a∗0 , a∗1 , · · · , a∗n 是方程组 (2.7) 的解, 则有

∂φ(a∗0 , · · · , a∗n )
= 0, j = 0, 1, · · · , n.
∂aj
n
X
故由 φ(b0 , · · · , bn ) 的任意性, 则 Pn∗ = a∗k xk 为问题式 (2.5) 的解. 证毕.
k=1
例 2.1 对于数据表

xi 1 2 3 4 5
f (xi ) 4 4.5 6 8 8.5
ωi 2 1 3 1 1

已知其经验公式为 y = a + bx, 试用最小二乘法确定待定参数.


解:根据最小二乘法拟合思想, a, b 应该满足正规方程组:
 5 5 5

 X X X

 a ωi + b ωi xi = ωi f (xi ),

 i=1 i=1 i=1
5 5 5 (2.9)

 X X X

 a ω x + b ω x2
= ωi xi f (xi ).

 i i i i
i=1 i=1 i=1

根据数据表, 计算结果如表 2-1 所示.


将所得计算值代入 
 8a + 22b = 47,
 22a + 74b = 145.5,

解得
a = 2.5648, b = 1.2037.
· 46 · 第2章 曲线拟合与平方逼近

表 2-1 式 (2.9) 系数值表


xi f (xi ) ωi ωi xi ωi f (xi ) ωi x2i ωi xi f (xi )
1 4 2 2 8 2 8
2 4.5 1 2 4.5 4 9
3 6 3 9 18 27 54
4 8 1 4 8 16 32
5 8.5 1 5 8.5 25 42.5
5
X
8 22 47 74 145.5
i=1

对给定的数据表, 若已知的经验公式为 y = a + bx2 , 则根据最小二乘拟合思想,


a, b 应满足的正规方程组调整为
 5 5 5
 X X X

 a ω + b ω x2
= ωi f (xi ),

 i i i
i=1 i=1 i=1

 5
X 5
X 5
X

 a ω x2
+ b ω x4
= ωi x2i f (xi ).
 i i i i
i=1 i=1 i=1

同理可得 
 8a + 74b = 47,
 74a + 1142b = 528.5.

解得
a = 3.9795, b = 0.2049,

即满足观测数据表的二次拟合多项式为

y = 3.9795 + 0.2049x2 .

利用正规方程组 (2.7) 求解拟合曲线是一个古老但又常用的方法. 大量的实际


计算表明, 当 n 稍大 (n > 7) 时, 正规方程组往往是病态的 (线性方程组 “病态” 的
有关概念见 6.7 节), 因而给求解工作带来了困难, 由此产生了直接解问题式 (2.5)
的正交三角化方法等; 此外, 还有通过改变基函数 ϕ0 (x), ϕ1 (x), · · · , ϕn (x) 来改善
正规方程组性态的方法, 如用正交多项式作基函数的最小二乘拟合、样条最小二乘
拟合等都取得了较好的实用效果. 另一方面, 当数据量过于庞大时, 也可仿分段插
值, 用几个次数不太高的多项式进行分段拟合, 尤其是在数据散布图呈明显的多值
性时, 更应考虑作分段处理.
曲线拟合是使拟合函数在一系列的离散点与观测值的偏差平方和达到最小, 而
与之相对应的连续情形就是所谓的最佳平方逼近. 为便于讨论, 这里先介绍正交多
项式的概念.
2.2 正交多项式 · 47 ·

2.2 正交多项式
2.2.1 切比雪夫 (Chebyshev) 多项式
1. 定义和性质

定义 2.1

Tn (x) = cos(n arccos x), |x| 6 1, n = 0, 1, 2, · · · , (2.10)

称 Tn (x)(n = 0, 1, 2, · · · ) 为 n 次的 Chebyshev 多项式.


根据定义, 显然有 T0 (x) = 1, T1 (x) = x. 据此我们容易得到更高次的 Cheby-
shev 多项式, 因为有:
性质 2.1 递推关系为

Tn+1 (x) = 2xTn (x) − Tn−1 (x), n = 1, 2, · · · . (2.11)

事实上, 只要验证
Tn+1 (x) + Tn−1 (x) = 2xTn (x)
即可.
记 θ = arccos x (或 x = cos θ), 根据定义 2.1, 则

Tn+1 (x) + Tn−1 (x) = cos(n + 1)θ + cos(n − 1)θ


= 2 cos nθ cos θ = 2xTn (x).

从而, 我们立即有
T0 (x) = 1,
T1 (x) = x,
T2 (x) = 2x2 − 1, (2.12)
T3 (x) = 4x3 − 3x,
T4 (x) = 8x4 − 8x2 + 1.

由归纳法容易证明:
性质 2.2 (次数) Tn (x) 是 n 次多项式, 且首项系数 (xn 的系数) 为 2n−1 .
性质 2.3 (零点) Tn (x) 在区间 [−1, 1] 上有 n 个不同的实零点:
2k + 1
x̄k = cos π, k = 0, 1, · · · , n − 1.
2n
证明:令 Tn (x) = 0, 即
· 48 · 第2章 曲线拟合与平方逼近

cos(n arccos x) = 0,


π
n arccos x = kπ + ,
2
于是
2k + 1
arccos x =
π.
2n
由于当 k = 1, 2, · · · , n 时, x 的取值互不相同, 且都在区间 [−1, 1] 内, 所以
Tn (x) 的零点为
2k + 1
x̄k = cos π, k = 0, 1, · · · , n − 1.
2n
性质 2.4 (极值点) Tn (x) 在区间 [−1, 1] 内的 n + 1 个点
k
x̄0k = cos π, k = 0, 1, · · · , n,
n
处轮流取最大值 1 和最小值 −1.
事实上,
· µ ¶¸ µ ¶
k k
Tn (x̄0k ) = cos n arccos cos π = cos n · π = (−1)k .
n n
性质 2.5 (奇偶性) 对于 Tn (x), 当 n = 2m 时, T2m (x) 是偶函数; 当 n = 2m+1
时, T2m+1 (x) 是奇函数.
因为
Tn (−x) = cos[n arccos(−x)] = cos[n(π − arccos x)]
= cos nπ cos(n arccos x) = (−1)n Tn (x).

性质 2.6 (正交性) {Tn (x)}(n = 0, 1, 2, · · · ) 在区间 [−1, 1] 上带权函数 ρ(x) =


1
√ 正交, 且有
1 − x2

Z 
 0, m 6= n,
1
Tn (x)Tm (x) 
√ dx = π, m = n = 0, (2.13)
1 − x2 

−1  π, m = n 6= 0.
2
证明:
Z 1 Z 0
Tm (x)Tn (x) x=cos θ cos mθ cos nθ
√ dx =
===
===
=== (− sin θ)dθ,
−1 1 − x2 π sin θ
而且 

 0, m 6= n,
Z π 

cos mθ cos nθdθ = π, m = n = 0,
0 
 π

 , m = n 6= 0.
2
2.2 正交多项式 · 49 ·

定义 2.2 设 f (x) ∈ C[a, b], g(x) ∈ Hn (不超过 n 次多项式的全体), 称

max |f (x) − g(x)|


a6x6b

为 f (x) 与 g(x) 在区间 [a, b] 上的偏差.


性质 2.7 (极性) 在区间 [−1, 1] 上所有首项系数为 1 的 n 次多项式中与 0
1 1
偏差最小的多项式是 T̃n (x) = n−1 Tn (x), 且最小偏差为 n−1 .
2 2
证明:用反证法. 若不然, 则存在首项系数为 1 且不等于 T̃n (x) 的 n 次多项式

Q(x) = xn + an−1 xn−1 + · · · + a1 x + a0 ,

使得 ¯ ¯
¯ Tn (x) ¯ 1
max |Q(x)| 6 max ¯ n−1 − 0¯¯ = n−1
¯
−16x61 −16x61 2 2
成立, 则
1
|Q(x)| 6 , x ∈ [−1, 1],
2n−1

1 1
− 6 Q(x) 6 , x ∈ [−1, 1].
2n−1 2n−1
因为 Tn (x) 在区间 [−1, 1] 内的 n + 1 个点
k
x̄0k = cos π, k = 0, 1, · · · , n,
n
Tn (x)
处轮流取得最大值 1 和最小值 −1. 先考察函数 Q(x) − n−1 在 x̄0k (k = 0, 1, · · · , n)
2
处的符号. 由于
Tn (x̄0 ) 1
Q(x̄00 ) − n−10 = Q(x̄00 ) − n−1 6 0,
2 2
Tn (x̄0 ) 1
Q(x̄01 ) − n−11 = Q(x̄01 ) + n−1 > 0,
2 2
Tn (x̄0 ) 1
Q(x̄02 ) − n−12 = Q(x̄02 ) − n−1 6 0,
2 2
······
Tn (x)
因此, Q(x)− n−1 在区间 (−1, 1) 上 n+1 个不同点 x̄0k (k = 0, 1, · · · , n) 处轮流变号,
2
Tn (x) Tn (x)
则由介值定理知, Q(x) − n−1 在区间 (−1, 1) 上至少有 n 个零点. 而 Q(x) − n−1
2 2
为一个不超过 n − 1 次的多项式, 所以
Tn (x)
Q(x) − ≡0
2n−1
与假设矛盾. 证毕.
· 50 · 第2章 曲线拟合与平方逼近

2. 插值余项的近似极小化

若以 n 次 Chebyshev 多项式 Tn (x) 的 n 个零点


2k + 1
x̄k = cos π, k = 0, 1, · · · , n − 1,
n
作为插值节点, 由 Lagrange 插值方法可得一个 n − 1 次的插值多项式 Ln−1 (x), 而
其插值余项为
f (n) (ξ)
f (x) − Ln−1 (x) = ωn (x), ξ ∈ (−1, 1),
n!
其中
Tn (x)
ωn (x) = (x − x̄0 )(x − x̄1 ) · · · (x − x̄n−1 ) = n−1 .
2
由 Chebyshev 多项式的性质 2.7 知, 在区间 [−1, 1] 上 wn (x) 是与零偏差最小的首
项系数为 1 的 n 次多项式, 故有
Mn Mn
max |f (x) − Ln−1 (x)| 6 max |ωn (x)| = n−1 , (2.14)
−16x61 n! −16x61 2 n!
¯ ¯
其中, Mn = max ¯f (n) (x)¯.
−16x61

因此, 在区间 [−1, 1] 上, 当 f (n) (x) 变化不大时, 使 f (x) 的插值余项尽可能小


的 n − 1 次插值多项式是用 Tn (x) 的零点来构造的.
若插值区间是 [a, b], 不是 [−1, 1], 则作变换
a+b b−a
x= + t,
2 2
使 t 在区间 [−1, 1] 上变化, 于是
µ ¶
b+a b−a
ωn (x) = ωn + t = ω̂n (t).
2 2
µ ¶n
b−a
它的最高项系数为 , 故有
2
µ ¶n
b−a
ω̂n (t) = (t − t0 )(t − t1 ) · · · (t − tn−1 ).
2

此时只要选插值节点为
2k + 1
tk = cos π, k = 0, 1, · · · , n − 1,
2n
相应地,
a+b b−a 2k + 1
xk = + cos π, k = 0, 1, · · · , n − 1. (2.15)
2 2 2n
2.2 正交多项式 · 51 ·

此时,
M̃n
max |f (x) − Ln−1 (x)| 6 max |ωn (x)|
a6x6b n! a6x6b
µ ¶n
M̃n b − a
= max |(t − t0 )(t − t1 ) · · · (t − tn−1 )|
n! 2 −16t61
n
M̃n (b − a)
= , (2.16)
n! 22n−1
¯ ¯
其中, M̃n = max ¯f (n) (x)¯.
a6x6b

由此可知, 用式 (2.15) 的 xk 作插值节点求 f (x) 在区间 [a, b] 上的 n − 1 次插


值多项式 Ln−1 (x), 当 f (n) (x) 在区间 [a, b] 上变化不大时, 此时所得的 Ln−1 (x) 的
插值余项接近极小化的情形.
3. Taylor 级数项数的节约

函数 f (x) 的 Taylor 展开容易计算, 因此它的部分和常常被用于 f (x) 的近似,


且此时误差界容易给出.
现设 f (x) 在区间 [−1, 1] 上的 Taylor 展开式的 n 项部分和

Pn (x) = a0 + a1 x + · · · + an xn ≈ f (x). (2.17)

若有
max |f (x) − Pn (x)| 6 εn ¿ ε,
−16x61

其中, ε 是给定的误差限. 由于 Chebyshev 多项式 Tk (x) 可以表示成不超过 k 次的


x 幂函数的线性组合, 反过来 xk 也可以表示成不超过 k 次的 Chebyshev 多项式的
线性组合, 如下:
1 = T0 (x),
x = T1 (x),
x2 = [T0 (x) + T2 (x)]/2,
x3 = [3T1 (x) + T3 (x)]/4,
x4 = [3T0 (x) + 4T2 (x) + T4 (x)]/8,
x5 = [10T1 (x) + 5T3 (x) + T5 (x)]/16,
x6 = [10T0 (x) + 15T2 (x) + 6T4 (x) + T6 (x)]/32,
x7 = [35T1 (x) + 21T3 (x) + 7T5 (x) + T7 (x)]/64,
x8 = [35T0 (x) + 56T2 (x) + 28T4 (x) + 8T6 (x) + T8 (x)]/128,
x9 = [126T1 (x) + 84T3 (x) + 36T5 (x) + 9T7 (x) + T9 (x)]/256.
· 52 · 第2章 曲线拟合与平方逼近

因此可以利用 Chebyshev 多项式将 Pn (x) 重新组合以降低近似多项式的次数,


此时
Pn (x) = b0 + b1 T1 (x) + · · · + bn Tn (x). (2.18)

如果 |bn | + · · · + |bn−m+1 | + εn 6 ε, 而 |bn | + · · · + |bn−m+1 | + |bn−m | + εn > ε,


我们就可以把式 (2.18) 后面 m 项去掉, 得新的 n − m 次近似多项式, 如下:

Pn,n−m (x) = b0 + b1 T1 (x) + · · · + bn−m Tn−m (x)


= c0 + c1 x + · · · + cn−m xn−m ,

使其误差
max |f (x) − Pn,n−m (x)| < ε.
−16x61

例 2.2 利用 Taylor 级数项数的节约求 f (x) = ex 在 |x| 6 1 上的近似多项


式, 要求偏差小于 2 × 10−3 .
解:将 ex 在 x = 0 处 Taylor 展开, 由于
¯ (n+1) ¯
¯f (ε) n+1 ¯¯ e
x
max |e − Pn (x)| = max ¯¯ x −3
−16x61 −16x61 (n + 1)! ¯ 6 (n + 1)! < 2 × 10 ,

故应取 n = 6, 因此满足偏差要求的、以 Taylor 级数的部分和所作的近似多项式为


1 1 1 1 5 1 6
P6 (x) = 1 + x + x2 + x3 + x4 + x + x ,
2 6 24 120 720
其误差
e
max |ex − P6 (x)| 6 < 5.3935 × 10−4 < 2 × 10−3 .
−16x61 7!
又由于
1 5 5
x5 = T5 (x) + x3 − x,
16 4 16
1 3 9 1
x6 = T6 (x) + x4 − x2 + ,
32 2 16 32

1 1 1 1
P6 (x) = P6,4 (x) + × T5 (x) + × T6 (x).
120 16 720 32
其中
23 041 383 639 2 17 3 7 4
P6,4 = + x+ x + x + x
23 040 384 1280 96 160
= 1.000 043 + 0.997 395 8x + 0.499 218 8x2 + 0.177 083 3x3 + 0.043 75x4 .

用 P6,4 (x) 作 ex 的近似多项式, 其误差


e 1 1
max |ex − P6,4 (x)| 6 + + < 1.2 × 10−3 < 2 × 10−3 .
−16x61 7! 1920 23 040
2.2 正交多项式 · 53 ·

若用 Chebyshev 多项式的零点作插值多项式来逼近 f (x), 则由式 (2.14) 得


e
max |ex − Ln−1 (x)| 6 < 2 × 10−3 .
−16x61 2n−1 n!
故也应取 n = 5, 即应用 T5 (x) 的 5 个零点作一个四次插值多项式 L4 (x) 才能使它
与 f (x) 的偏差满足要求.
2.2.2 一般正交多项式
定义 2.3 函数系 {g0 , g1 , · · · , gn } 在区间 [a, b] 上关于权函数 ρ(x)(> 0) 是正
交的, 如果

Z b 
 0, m 6= n,
ρ(x)gn (x)gm (x)dx = Z b
a 
 ρ(x)gn2 (x)dx > 0, m = n,
a

特别地, 如果 {gn (x)} 是首项系数 a(n)


n 6= 0 的 n 次多项式序列

(n) (n)
gn (x) = a(n) n
n x + an−1 xn−1 + · · · + a0 , n = 0, 1, · · · ,

则称多项式序列 g0 (x), g1 (x), · · · , gn (x), · · · 在区间 [a, b] 上带权函数 ρ(x)(> 0)


正交.
除前面 Chebyshev 正交多项式外, 常用的正交多项式还有如下一些 (见表 2-2).

表 2-2 常用的正交多项式
名称 区间 权函数 表达式与记号 首项系数
1 dn (2n)!
Legendre [−1, 1] 1 Pn (x) = n (x2 − 1)n
2 n! dxn 2n (n!)2
dn
Laguerre [0, +∞) e−x Ln (x) = ex n (xn e−x ) (−1)n
dx
n
2 2 d 2
Hermite (−∞, +∞) e−x Hn (x) = (−1) ex
n (e−x ) 2n
dxn

它们的递推关系为
2n + 1 n
Pn+1 (x) = xPn (x) − Pn−1 (x), P0 (x) = 1, P1 (x) = x,
n+1 n+1
Ln+1 (x) = (2n + 1 − x)Ln (x) − n2 Ln−1 (x), L0 (x) = 1, L1 (x) = −x + 1, (2.19)
Hn+1 (x) = 2xHn (x) − 2nHn−1 (x), H0 (x) = 1, H1 (x) = 2x.

其正交性为 
Z 1 
 0, m 6= n,
Pn (x)Pm (x)dx = 2
−1 
 , m = n,
2n + 1
· 54 · 第2章 曲线拟合与平方逼近

Z (
+∞
−x 0, m 6= n,
e Ln (x)Lm (x)dx = 2
(2.20)
0 (n!) , m = n,
Z (
+∞
−x2 0, m 6= n,
e Hn (x)Hm (x)dx = n

−∞ 2 n! π, m = n.

2.3 最佳平方逼近
2.3.1 预备知识
定义 2.4 设 f (x), g(x) ∈ C[a, b], ρ(x) > 0, 积分
Z b
(f, g) = ρ(x)f (x)g(x)dx (2.21)
a

称为函数 f (x) 与 g(x) 在区间 [a, b] 上的内积.


由内积的定义可得:
(1) (f, g) = (g, f ).
(2) (cf, cg) = c(f, g), c 为常数.
(3) (f1 + f2 , g) = (f1 , g) + (f2 , g).
(4) (f, f ) > 0, f = 0, 当且仅当 (f, f ) = 0.
定义 2.5 设 ϕ1 (x), ϕ2 (x), · · · , ϕn (x) 在区间 [a, b] 上连续, 如果

a1 ϕ1 (x) + a2 ϕ2 (x) + · · · + an ϕn (x) = 0,

仅当 a1 = a2 = · · · = an = 0 时成立, 则称 ϕ1 (x), ϕ2 (x), · · · , ϕn (x) 在区间 [a, b] 上


线性无关. 否则 ϕ1 (x), ϕ2 (x), · · · , ϕn (x) 在区间 [a, b] 上线性相关.
根据定义 2.3, 我们有:
1) 正交函数系是线性无关的
事实上, 若 {gi (x)}(i = 0, 1, · · · , n) 在区间 [a, b] 上带权函数 ρ(x) 正交, 且存在
如下线性关系:
a0 g0 (x) + a1 g1 (x) + · · · + an gn (x) = 0,

用 ρ(x), gk (x) (k = 0, 1, · · · , n) 分别乘等式两边, 并在区间 [a, b] 上积分得


Z b " n # Z b
X
ρ(x)gk (x) ai gi (x) dx = ak ρ(x)gk2 (x)dx = 0, k = 0, 1, · · · , n.
a i=0 a

因为 Z b
ρ(x)gk2 (x)dx > 0, k = 0, 1, · · · , n,
a
2.3 最佳平方逼近 · 55 ·

所以
ak = 0, k = 0, 1, · · · , n,

即 {gi (x)} (i = 0, 1, · · · , n) 是线性无关的.


2) 线性相关性条件
设函数关系式 {ϕi (x)} (i = 0, 1, · · · , n) 有如下线性关系:

a0 ϕ0 (x) + a1 ϕ1 (x) + · · · + an ϕn (x) = 0,

分别用 ρ(x), ϕk (x)(k = 0, 1, · · · , n) 乘之, 并积分得




 (ϕ0 , ϕ0 )a0 + (ϕ0 , ϕ1 )a1 + · · · + (ϕ0 , ϕn )an = 0,



 (ϕ , ϕ )a + (ϕ , ϕ )a + · · · + (ϕ , ϕ )a = 0,
1 0 0 1 1 1 1 n n
(2.22)

 ······




(ϕn , ϕ0 )a0 + (ϕn , ϕ1 )a1 + · · · + (ϕn , ϕn )an = 0,

其中 Z b
(ϕi , ϕj ) = ρ(x)ϕi (x)ϕj (x)dx, i, j = 0, 1, · · · , n.
a

这样的线性方程组 (2.22) 系数矩阵的行列式为


¯ ¯
¯ (ϕ , ϕ ) (ϕ , ϕ ) ··· (ϕ0 , ϕn ) ¯¯
¯ 0 0 0 1
³ ´ ¯¯ (ϕ , ϕ ) (ϕ , ϕ ) ···
¯
(ϕ1 , ϕn ) ¯¯
1 0 1 1
det (ϕi , ϕj )(n+1)×(n+1) = ¯¯ ¯,
¯ · · · · · · ··· ··· ¯
¯ ¯
¯ (ϕn , ϕ0 ) (ϕn , ϕ1 ) ··· (ϕn , ϕn ) ¯
³ ´
记 G(ϕ0 , ϕ1 , · · · , ϕn ) = det (ϕi , ϕj )(n+1)×(n+1) , 称其为函数系 {ϕi (x)}(i = 0, 1, · · · ,
n) 的 Gram 行列式. 对于函数系的相关性, 可以证明:
定理 2.3 函数 {ϕi (x)}(i = 0, 1, · · · , n) 在区间 [a, b] 上线性相关的充要条件
是它们的 Gram 行列式 G(ϕ0 , ϕ1 , · · · , ϕn ) = 0, 线性无关的充要条件是它们的 Gram
行列式 G(ϕ0 , ϕ1 , · · · , ϕn ) 6= 0.

2.3.2 最佳平方逼近
n
X
所谓最佳平方逼近, 就是对 f (x) ∈ C[a, b] 要找一个函数 P (x) = ai ϕi (x), 使
i=1
Z b
2
φ(a0 , a1 , · · · , an ) = ρ(x) [f (x) − P (x)] dx
a

最小, 即
· 56 · 第2章 曲线拟合与平方逼近

Z " n
#2
b X
min φ(a0 , a1 , · · · , an ) = min ρ(x) f (x) − ai ϕi (x) dx,
a0 ,a1 ,··· ,an ∈R a0 ,a1 ,··· ,an ∈R a i=0
(2.23)
其中, {ϕi (x)}(i = 0, 1, 2, · · · , n) 是确定的线性无关的函数系. 根据多元函数极值原
理, 则式 (2.23) 的解必须满足
∂φ
= 0, k = 0, 1, · · · , n,
∂ak

Z " n
#
∂φ b X
=2 ρ(x) f (x) − ai ϕi (x) [−ϕk (x)] dx = 0, k = 0, 1, · · · , n,
∂ak a i=0

于是有 

 (ϕ0 , ϕ0 )a0 + (ϕ0 , ϕ1 )a1 + · · · + (ϕ0 , ϕn )an = (ϕ0 , f ),


 (ϕ , ϕ )a + (ϕ , ϕ )a + · · · + (ϕ , ϕ )a = (ϕ , f ),
1 0 0 1 1 1 1 n n 1
(2.24)

 ······



(ϕn , ϕ0 )a0 + (ϕn , ϕ1 )a1 + · · · + (ϕn , ϕn )an = (ϕn , f ).
和式 (2.7) 一样, 称 n + 1 阶线性方程组 (2.24) 为正规方程组.
定理 2.4 正规方程组 (2.24) 有唯一解.
证明:因为 {ϕi (x)} (i = 0, 1, 2, · · · , n) 线性无关, 由定理 2.3 知 G(ϕ0 , ϕ1 , · · · ,
ϕn ) 6= 0, 故方程组 (2.24) 有唯一解. 证毕.
n
X
定理 2.5 设 ai (i = 0, 1, · · · , n) 为正规方程组 (2.24) 的解, 则 P (x) = ai ϕi (x)
i=0
是式 (2.23) 的解.
证明:仿定理 2.2 的证明 (略).
例 2.3 设 f (x) = x4 , x ∈ [−1, 1], 求 P (x) ∈ H2 (不超过二次多项式的全体),
使 Z 1
[f (x) − P (x)]2 dx
−1

最小.
解:设 P (x) = a + bx + cx2 , 即取

ϕ0 (x) = 1, ϕ1 (x) = x, ϕ2 (x) = x2 , ρ(x) ≡ 1.

则 a, b, c 应满足正规方程组


 (ϕ0 , ϕ0 )a + (ϕ0 , ϕ1 )b + (ϕ0 , ϕ2 )c = (ϕ0 , f ),

(ϕ1 , ϕ0 )a + (ϕ1 , ϕ1 )b + (ϕ1 , ϕ2 )c = (ϕ1 , f ),


 (ϕ , ϕ )a + (ϕ , ϕ )b + (ϕ , ϕ )c = (ϕ , f ),
2 0 2 1 2 2 2
2.3 最佳平方逼近 · 57 ·

其中 Z Z
1 1
(ϕ0 , ϕ0 ) = dx = 2, (ϕ1 , ϕ0 ) = (ϕ0 , ϕ1 ) = xdx = 0,
−1 −1
Z 1 Z 1
2
(ϕ2 , ϕ0 ) = (ϕ0 , ϕ2 ) = x2 dx = , (ϕ2 , ϕ1 ) = (ϕ1 , ϕ2 ) = x3 dx = 0,
−1 3 −1
Z 1 Z 1
2 2
(ϕ1 , ϕ1 ) = x2 dx =
, (ϕ2 , ϕ2 ) = x4 dx = ,
−1 3 −1 5
Z 1 Z 1 Z 1
2 2
(ϕ0 , f ) = x4 dx = , (ϕ1 , f ) = x5 dx = 0, (ϕ2 , f ) = x6 dx = .
−1 5 −1 −1 7
于是得 
 2 2

 2a + c = ,

 3 5


2
b = 0,

 3


 2
 a + 2c = 2.

3 5 7
解得
3 6
a=− , b = 0, c= .
35 7
所以
3 6
P (x) = − + x2 ,
35 7
相应的平方误差为 Z 1
[f (x) − P (x)]2 dx = 0.0116.
−1

由于在实际问题中正规方程组 (2.24) 的阶数较高时, 其系数矩阵常常是病态


或高度病态的 (线性方程组 “病态” 的有关概念见 6.7 节). 为了避免解病态的正规
方程组, 采用的办法之一就是取 {ϕi (x)}(i = 0, 1, · · · , n) 为区间 [a, b] 上带权函数
ρ(x) 正交的函数系, 这时正规方程组 (2.4) 就简化为
Z b Z b
ak ρ(x)ϕ2k (x)dx = ρ(x)f (x)ϕk (x)dx, k = 0, 1, · · · , n,
a a

则 Z b
ρ(x)f (x)ϕk (x)dx
a (f, ϕk )
ak = Z b
= , k = 0, 1, · · · , n. (2.25)
(ϕk , ϕk )
ρ(x)ϕ2k (x)dx
a
Z 1
例 2.4 设 f (x) = x4 , x ∈ [−1, 1], 求 P (x) ∈ H2 , 使 [f (x) − P (x)2 ]dx
−1
· 58 · 第2章 曲线拟合与平方逼近

最小.
解:设 P (x) = a0 ϕ0 (x) + a1 ϕ1 (x) + a2 ϕ2 (x) 为二次多项式, 由于原问题的积分
区间为 [−1, 1], 权函数 ρ(x) ≡ 1, 故取

ϕk (x) = Pk (x), k = 0, 1, 2,

其中, Pk (x) 为 k 次的 Legendre 多项式, 则


1
ϕ0 (x) = 1, ϕ1 (x) = x, ϕ2 (x) = (3x2 − 1).
2
又由式 (2.20) 得

Z 1 
 0, m 6= n.
Pn (x)Pm (x)dx = 2
−1 
 , m = n.
2n + 1

2
(ϕ0 , ϕ0 ) = 2, (ϕ1 , ϕ1 ) = , (ϕ2 , ϕ2 ) = 0.
3
而 Z 1 Z 1
4 2
(ϕ0 , f ) = x dx = , (ϕ1 , f ) = x5 dx = 0,
−1 5 −1
Z 1
1 8
(ϕ2 , f ) = (3x2 − 1)x4 dx = .
−1 2 35
所以
(ϕ0 , f ) 1 (ϕ1 , f ) (ϕ2 , f ) 4
a0 = = , a1 = = 0, a2 = = .
(ϕ0 , ϕ0 ) 5 (ϕ1 , ϕ1 ) (ϕ2 , ϕ2 ) 7
因此
1 4 1 3 6
+ × (3x2 − 1) = − + x2 .
P (x) =
5 7 2 35 7
由上可见, 把 P (x) 取成正交函数系 {ϕi (x)}(i = 0, 1, · · · , n) 的线性组合时, 求
解过程更为简便. 但值得提出的是:此方法应用中选取的正交函数系 {ϕi (x)}(i =
0, 1, · · · , n) 的定义区间及所带的正权函数必须与最佳平方逼近问题中的积分区间
及相应的权函数完全一致, 有任何一点不同都不能直接应用. 而最佳平方逼近问题
中的权函数 ρ(x) ≡ 1 时, 对一般的有限积分区间 [a, b], 仍旧可以通过变量替换
a+b b−a
x= + t,
2 2

2x − a − b
t= ,
b−a
将其转化为区间 [−1, 1] 上的情形处理.
习 题 2 · 59 ·

习 题 2
1. 已知实验数据

xi 0.1 0.3 0.5 0.7 0.9


f (xi ) 5.1234 5.5687 6.4370 7.9493 10.3627

试求最小二乘拟合二次多项式.
2. 在某实验过程中, 对物体的长度分别进行了 n 次测量, 测得的 n 个数据为 x1 , x2 , · · · , xn ,
通常将它们的平均值
1
x̄ = (x1 + x2 + · · · + xn )
n
作为该物体的长度值, 试说明理由.
3. 对于实验数据

xi 0 1 2 3 4
f (xi ) 2.00 2.05 3.00 9.60 34.0

已知其经验公式为 y = a + bx2 , 试用最小二乘法确定 a, b.


4. 在某项科学实验中, 需要观察水的渗透速度, 测得时间 t 与水的重量 w 的数据如下:

t/s 1 2 4 8 16 32 64
w/g 4.22 4.02 3.85 3.59 3.44 3.02 2.59

已知 t 与 w 之间有关系 W = ctλ , 试用最小二乘法确定待定参数 c 和 λ.


5. 证明 Tn (x) = cos(n arccos x)(x ∈ [−1, 1]) 是 n 次多项式, 且首项系数为 2n−1 .
6. 在区间 [−1, 1] 上利用余项极小化原理求函数 f (x) = arctan x 的三次插值多项式.
7. 在区间 [0, 1] 上利用余项极小化原理求函数 f (x) = ex 的二次插值多项式.
8. 在区间 [−1, 1] 上利用幂级数项数节约求函数 f (x) = sin x 的三次逼近多项式, 使误差
不超过 5 × 10−3 .
Z −1
9. 求 a, b, c, 使 (|x| − a − bx2 − cx4 )2 dx 最小.
1

10. 求 f (x) = x 在区间 [0, 1] 上的一次最佳平方逼近多项式.
第3章 数值积分与数值微分
许多实际的问题常常要计算积分. 由积分学可知, 对于积分
Z b
I= f (x)dx,
a

只要找到被积函数 f (x) 的原函数 F (x) [F 0 (x) = f (x)], 则由 Newton-Leibniz 公式



Z b
I= f (x)dx = F (b) − F (a).
a

但实际使用这种方法往往有一定的困难, 原因在于:
sin x
(1) 大量的被积函数的原函数找不出来或不能用初等函数表示, 如 cos x2 ,
x
等.
(2) f (x) 仅由数据表给出.
在上面这些情况下, Newton-Leibniz 公式都不能直接运用. 因此我们有必要研
究积分的数值计算方法.

3.1 数值积分的基本思想与代数精确度
3.1.1 基本思想
对于积分
Z b
I= f (x)dx,
a

其几何解释为图 3-1 所示的曲边梯形的面积, 依据积分中值定理, 在积分区间 [a, b]


内存在一点 ξ, 使得
Z b
I= f (x)dx = (b − a)f (ξ). (3.1)
a

问题是点 ξ 的具体位置一般难以确定, 因而难以准确地计算出 f (ξ) 的值.


a+b
如取 ξ = ,则
2
Z b µ ¶
a+b
I= f (x)dx ≈ (b − a)f , (3.2)
a 2
3.1 数值积分的基本思想与代数精确度 · 61 ·

式 (3.2) 右端近似计算积分的数值公式称为中矩形公式.
若用积分区间两端点的函数值 f (a) , f (b) 的算术平均作为 f (ξ) 的近似值, 即

1
f (ξ) ≈ [f (a) + f (b)] ,
2

则由式 (3.1) 得
Z b
b−a
f (x)dx ≈ T = [f (a) + f (b)] . (3.3)
a 2

对式 (3.3) 左端进行近似数值计算的公式, 其几何意义为图 3-2 所示的阴影部分的


面积, 即用梯形的面积近似代替原曲边梯形的面积, 故把式 (3.3) 的数值计算公式
称为梯形公式.

图 3-1 定积分的几何意义 图 3-2 梯形公式的几何解释


µ ¶
a+b
中矩形公式和梯形公式的本质就是在区间 [a, b] 上分别用直线 y = f
2
f (b) − f (a)
和 y = f (a) + (x − a) 代替曲线 y = f (x), 然后积分. 根据这一思想, 更
b−a
一般地, 可以用 f (x) 在区间 [a, b] 上次数稍高的插值多项式来近似, 再对插值多项
式积分以期望得到数值效果更理想的近似公式.

3.1.2 插值型求积公式
设给定一组节点
a 6 x0 < x1 < x2 < · · · < xn 6 b,

且已知函数 f (x) 在这些节点处的取值为 f (x0 ) , f (x1 ) , f (x2 ) , · · · , f (xn ), 由


Lagrange 插值方法
n
X
Ln (x) = lk (x)f (xk ),
k=0

其中
· 62 · 第3章 数值积分与数值微分

Yn
x − xj
lk (x) = , k = 0, 1, · · · , n.
j=0
xk − xj
j6=k


Z b Z b Z b
f (n+1) (ξ)
I= f (x)dx = Ln (x)dx + (x − x0 ) · · · (x − xn )dx
a a a (n + 1)!
n
X
= Ak f (xk ) + Rn [f ] = In + Rn [f ], (3.4)
k=0

其中 Z b
Ak = lk (x)dx, k = 0, 1, · · · , n.
a

则称式 (3.4) 为插值型数值求积公式, Ak 称为求积系数, xk 称为求积节点, 相应地,


Z b
f (n+1) (ξ)
Rn [f ] = I − In = ωn+1 (x)dx (3.5)
a (n + 1)!
n
Y
称为求积公式 (3.4) 的余项, 其中, ωn+1 (x) = (x − xi ).
i=0

3.1.3 代数精确度
数值求积公式是近似计算积分方法, 为了保证精确性, 我们当然希望求积公式
能对尽可能多的函数准确地成立, 为此我们引入代数精确度的概念.
定义 3.1 一个数值求积公式如能对所有不超过 m 次的多项式准确地成立,
而对某一个 m + 1 次多项式不再准确, 则称该求积公式具有 m 次代数精确度, 简称
为有m 次代数精度.
容易验证, 中矩形公式 (3.2) 和梯形公式 (3.3) 均具有一次代数精度. 进一步,
对于求积公式 (3.4), 当 f (x) 是任意的不超过 n 次的多项式时, 由式 (3.5) 得 Rn [f ] = 0,
于是有:
定理 3.1 形如式 (3.4) 的插值型数值求积公式至少具有 n 次代数精度.
一般地, 欲使某个数值求积公式具有 m 次代数精度, 即该公式能对所有不超过
m 次的多项式准确地成立, 而根据多项式的叠加性, 只要验证它能分别对于 f (x) =
1, x, x2 , · · · , xm 都准确成立即可. 若数值求积公式为
Z b L
X
f (x)dx ≈ Ak f (xk ), (3.6)
a k=0

则求积系数 Ak (k = 0, 1, 2, · · · , L) 和求积节点 xk (k = 0, 1, 2, · · · , L) 应满足方程组


3.2 牛顿–科茨 (Newton-Cotes) 公式 · 63 ·


XL



 Ak = b − a,



 k=0

 L

 X 1
 Ak xk = (b2 − a2 ),
2 (3.7)


k=0

 ······



 L

 X 1
 Ak xm (bm+1 − am+1 ).

 k =
m+1
k=0

3.2 牛顿–科茨 (Newton-Cotes) 公式


3.2.1 公式导出
b−a
将积分区间 [a, b] 进行 n 等分, 步长 h = , 等分节点为
n
xk = a + kh, k = 0, 1, 2, · · · , n,

取 xk 作为求积节点, 构造插值型求积公式. 称
n
X (n)
In = (b − a) Ck f (xk ) (3.8)
k=0

为 Newton-Cotes 公式, 其中, Ck(n) (k = 0, 1, · · · , n) 称为 Cotes 系数. 于是


Z bY n
(n) 1 x − xi
Ck = dx.
b − a a i=0 xk − xi
i6=k

引进变换
x = a + th, 0 6 t 6 h,

故 Z Z
n
n Y n
n Y
(n) 1 (t − i)h (−1)n−k
Ck = hdt = (t − i)dt. (3.9)
b−a 0 i=0
(k − i)h nk!(n − k)! 0 i=0
i6=k i6=k

对确定的等分数 n, 由于式 (3.9) 中被积函数总是 n 次多项式, 故可分别计算


出 Cotes 系数 Ck(n) (k = 0, 1, · · · , n).
1
当 n = 1 时, 有 C0(1) = C1(1) = . 这时求积公式就是我们熟知的梯形公式
2
(3.3).
当 n = 2 时, 按式 (3.9), 这时 Cotes 系数为
Z
(2) 1 2 1
C0 = (t − 1)(t − 2)dt = ,
4 0 6
· 64 · 第3章 数值积分与数值微分

Z
(2) 1 2 4
C1 =− t(t − 2)dt = ,
2 0 6
Z 2
(2) 1 1
C2 = t(t − 1)dt = .
4 0 6
相应的求积公式 · µ ¶ ¸
b−a a+b
S= f (a) + 4f + f (b) (3.10)
6 2
称为辛普森 (Simpson) 公式.
为了便于应用, 把部分 Cotes 系数汇总成为表 3-1.
利用表 3-1, 可以很快写出各种等距节点下的数值求积公式. 例如, n = 4 时的
Newton-Cotes 公式为
b−a
C= [7f (x0 ) + 32f (x1 ) + 12f (x2 ) + 32f (x1 ) + 7f (x4 )] , (3.11)
90
b−a
其中, xk = a+kh (k = 0, 1, 2, 3, 4); h = . 特别地我们称式 (3.11) 为 Cotes 公式.
4
表 3-1 部分 Cotes 系数
(n)
n Ck (k = 0, 1, · · · , n)
1 1
1
2 2
1 4 1
2
6 6 6
1 3 3 1
3
8 8 8 8
7 16 2 16 7
4
90 45 15 45 90
19 25 25 25 25 19
5
288 96 144 144 96 288
41 9 9 34 9 9 41
6
840 35 280 105 280 35 840
751 3577 1323 2989 2989 1323 3577 751
7
17 280 17 280 17 280 17 280 17 280 17 280 17 280 17 280
989 5888 −928 10 496 −4540 10 490 −928 5888 989
8
28 350 28 350 28 350 28 350 28 350 28 350 28 350 28 350 28 350

由于高阶的 Newton-Cotes 数值求积公式来源于高次插值多项式, 而高次 (n >


7) 插值将可能产生 Runge 现象, 因而会影响近似结果. 事实上, 从表 3-1 可以看出,
n = 8 时 Cotes 系数已有正有负, 这将使稳定性得不到保证, 因此实际应用中我们通
常不使用高阶的 Newton-Cotes 公式. 作为插值型的求积公式, n 阶的 Newton-Cotes
公式至少能具有 n 次代数精度 (定理 3.1), 但实际的代数精度到底能有多高呢?
3.2 牛顿–科茨 (Newton-Cotes) 公式 · 65 ·

考察 Simpson 公式 (3.10), 即二阶的 Newton-Cotes 公式, 它至少具有二次代数


精度. 进一步用函数 f (x) = x3 进行检验, 按 Simpson 公式计算得
" µ ¶3 #
b−a 3 a+b b4 − a4
S= a +4 + b3 = .
6 2 4
另一方面, 直接求积得
Z b
b4 − a4
I= x3 dx = .
a 4
这时有 S = I, 即 Simpson 公式能对所有不超过三次的多项式准确成立, 又容易验
证它对 f (x) = x4 通常是不准确的. 因此, Simpson 公式实际具有的代数精度为 3
次. 一般地, 我们有:
定理 3.2 当阶数 n 为偶数时, Newton-Cotes 公式 (3.8) 至少具有 n + 1 次代
数精度.
证明:只要验证 n 为偶数时, Newton-Cotes 公式对 f (x) = xn+1 的余项为零
即可.
事实上, 按余项公式 (3.5), 由于 f (n+1) (x) = (n + 1)!, 从而有
Z bY
n
Rn [f ] = (x − xi )dx.
a i=0

引进变换 x = a + th, 则有
Z n
nY
Rn [f ] = hn+2 (t − i)dt.
0 i=0
n n
若 n 为偶数, 则 为整数, 再令 t = u + , 进而有
2 2
Z n Y
n ³ ´
2 n
Rn [f ] = hn+2 u + − i du = 0.
n
− i=0 2
2
因为被积函数 n
n ³
Y ´ Y
2
n
H(u) = u+ −j = (u − i)
i=0
2 n
i=− 2

是奇函数. 证毕.
3.2.2 几种低阶求积公式的余项
首先考察梯形公式, 按余项公式 (3.5), 梯形公式 (3.3) 的余项为
Z b 00
f (ξ)
RT [f ] = I − T = (x − a)(x − b)dx.
a 2!
由于 (x − a) (x − b) 在区间 [a, b] 上保号 (非正), 应用积分中值定理, 在区间 (a, b)
内存在一点 η, 使
· 66 · 第3章 数值积分与数值微分

Z b
f 00 (η) f 00 (η)
RT [f ] = (x − a) (x − b)dx = − (x − a)3 , η ∈ (a, b). (3.12)
2 a 12

再研究 Simpson 公式 (3.10) 的余项, 由于 Simpson 公式来自于以节点 x0 = a,


a+b
x1 = , x2 = b 作为二次插值多项式积分所得, 而二次插值多项式的余项可
2
写成 · ¸ µ ¶
a+b a+b
R2 (x) = f x, a, , b (x − a) x − (x − b).
2 2

Z· b ¸ µ ¶
a+b a+b
Rs [f ] = f x, a, , b (x − a) x − (x − b)dx
a 2 2
Z b · ¸
1 a+b
= f x, a, , b d[(x − a)2 (x − b)2 ]
4 a 2
Z · ¸
1 b d a+b
=− (x − a)2 (x − b)2 f x, x, a, , b dx
4 a dx 2
Z b · ¸
1 2 2 a+b
=− (x − a) (x − b) f x, x, a, , b dx
4 a 2
Z
1 b f (4) (ξ)
=− (x − a)2 (x − b)2 dx
4 a 4!
Z b
1
=− (x − a)2 (x − b)2 f (4) (ξ)dx.
4 × 4! a

类似梯形公式余项的讨论, 由于 (x − a)2 (x − b)2 在区间 [a, b] 上保号 (非负),


则在区间 (a, b) 内存在一点 η, 使得
Z
f (4) (η) b
Rs [f ] = − (x − a)2 (x − b)2 dx
96 a
(b − a)5 (4)
=− f (η), η ∈ [a, b]. (3.13)
2880
相应地, Cotes 公式 (3.11) 的余项为
2(b − a)7 (6)
Rc [f ] = − f (η), η ∈ [a, b]. (3.14)
945 × 46
3.2.3 复化求积法
对于 Newton-Cotes 公式的使用, 通过提高阶的途径并非总能取得满意的数值
效果. 为了改善求积的精度, 有效的方法之一就是像分段插值那样, 将积分区间进
行适当分段, 然后在各分段区间上采用低阶的 Newton-Cotes 公式求得该子区间上
的积分近似值, 最后求和得积分 I 的近似值. 这就是复化求积法.
3.2 牛顿–科茨 (Newton-Cotes) 公式 · 67 ·

b−a
将积分区间 [a, b] 进行 n 等分, h = , 等分节点为 xk = a + kh(k = 0, 1, 2, · · · ,
n
n). 在子区间 [xk , xk+1 ] 上采用梯形公式, 则该区间上积分近似值为
h
Tn(k) = [f (xk ) + f (xk+1 )] ,
2
相应的余项为
Z xk+1
(n) h3 00
RT (k) [f ] = f (x)dx − Tk =− f (ηk ), ηk ∈ [xk , xk+1 ].
n
xk 12

因此
Z b n−1
X h
f (x)dx ≈ Tn = [f (xk ) + f (xk+1 )]
a 2
k=0
" n−1
#
h X
= f (a) + 2 f (xk ) + f (b) (3.15)
2
k=1

称为复化梯形公式. 当 f ∈ C 2 [a, b] 时, Tn 的积分余项为


X · h3
n−1 ¸ n−1
(b − a)3 1 X 00
00
I − Tn = − f (ηk ) = − f (ηk )
12 12n2 n
k=0 k=0
(b − a)3 00
=− f (η), η ∈ [a, b]. (3.16)
12n2
同理, 在子区间 [xk , xk+1 ] 上采用 Simpson 公式, 并记这子区间的中点为 xk+ 21 ,
xk + xk+1
即 xk+ 21 = ,则
2
Z xk+1
hh i
f (x)dx ≈ Sn(k) = f (xk ) + 4f (xk+ 12 ) + f (xk+1 ) .
xk 6

在子区间 [xk , xk+1 ] 上其对应的积分余项为


Z xk+1
h5 (4)
f (x)dx − Sn(k) = − f (ηk ), ηk ∈ [xk , xk+1 ].
xk 2880

则复化 Simpson 公式为

hh i
n−1
X
Sn = f (xk ) + 4f (xk+ 12 ) + f (xk+1 )
6
k=0
" n−1 n−1
#
h X X
= f (a) + 2 f (xk ) + 4 f (xk+ 12 ) + f (b) , (3.17)
6
k=0 k=0

相应地, 复化 Simpson 公式的余项为


· 68 · 第3章 数值积分与数值微分

Z xk+1
h5 (4)
f (x)dx − Sn(k) = − f (ηk ), ηk ∈ [xk , xk+1 ]. (3.18)
xk 2880

类似地, 在子区间上采用 Cotes 公式, 则得复化 Cotes 公式


· n−1
X n−1
X
h
Cn = 7f (a) + 14 f (xk ) + 32 f (xk+ 14 )
90
k=1 k=1
n−1
X n−1
X ¸
+ 12 f (xk+ 12 ) + 32 f (xk+ 34 ) + 7f (b) , (3.19)
k=1 k=1

xk + xk+1 xk + xk+ 12 xk+1 + xk+ 12


其中, xk+ 12 = ; xk+ 14 = ; xk+ 34 = .
2 2 2
同样地, Cotes 公式的余项为
2(b − a)7 (6)
I − Cn = − f (η), η ∈ [a, b]. (3.20)
945 × (4n)6

对其他 Newton-Cotes 公式亦可用类似的手段加以复化. 显然, 当等分数足够


大时, 由余项估计式可知, 任意一种复化公式都能在理论上把积分计算到任意阶精
度.
例 3.1 利用复化梯形求积公式计算积分
Z 1
sin x
I= dx
0 x

的近似值, 使截断误差不超过 5 × 10−4 . 对相同的节点函数值, 若改用复化 Simpson


公式计算, 结果如何呢?
Z 1
sin x
解:由于 f (x) = = cos txdt, 所以
x 0
Z 1 k Z 1 µ ¶
d kπ
f (k) (x) = k
cos txdt = t k
cos tx + dt.
0 dx 0 2

故 ¯ µ ¶¯
¯ ¯ Z 1 ¯ kπ ¯¯
Z 1
1
¯ (k) ¯ k ¯
¯f (x)¯ 6 t ¯cos tx + dt 6 tk dt = .
0 2 ¯ 0 k + 1
根据式 (3.16), 为满足误差要求, 只需 n 满足
1 1 1
2
|f 00 (η)| 6 2
× 6 5 × 10−4 ,
12n 12n 3
即 n > 7.45. 取 n = 8, 按求积公式 (3.15)
· µ ¶ µ ¶ µ ¶
1 1 1 1 3
I ≈ T8 = × f (0) + 2f + 2f + 2f
8 2 8 4 8
3.3 龙贝格 (Romberg) 算法 · 69 ·

µ ¶ µ ¶ µ ¶ µ ¶ ¸
1 5 3 7
+ 2f + 2f + 2f + 2f + f (1)
2 8 4 8
=0.945 691 1.

如用相同的节点函数值, 改用复化 Simpson 公式, 则相当于 n = 4 的复化


Simpson 公式, 则
 · µ ¶ µ ¶ µ ¶ µ ¶¸ 
 1 3 5 7 

 f (0) + 4 f +f +f +f 

1 1 8 8 8 8
S4 = × · µ ¶ µ ¶ µ ¶¸
4 6  1 1 5 

 +2 f +f +f + f (1) 
4 2 4
= 0.946 083 3.

比较上面两个结果 T8 和 S4 , 虽然它们都用了 9 个点上的函数值, 计算量基本


相同, 但精度却差别很大, 与积分的 “准确” 值 I = 0.946 083 1 比较, 复化梯形公式
的结果 T8 仅有两位有效数字, 而复化 Simpson 公式的结果 S4 却有 6 位有效数字.

3.3 龙贝格 (Romberg) 算法


复化求积公式是提高精度的有效方法, 但在使用求积公式之前必须给出合适的
等分数. 若区间等分太少, 则精度难以保证; 等分太多, 则会导致计算量的浪费. 而
由于余项公式中的不确定, 事先要给出一个恰当的等分数往往很困难, 因此研究一
种自动变步长 (自动调整等分数) 的算法将具有实际意义.
3.3.1 梯形公式的递推关系
b−a
将积分区间 [a, b] 进行 n 等分:h = , 则等分节点 xk = a + kh(k = 0, 1, 2, · · · ,
n
n) 在子区间 [xk , xk+1 ] 上采用梯形公式, 则
h
Tn(k) = [f (xk ) + f (xk+1 )] .
2
从而可得 n 等分时的复化梯形公式
n−1
" n−1
#
X h X
Tn = Tn(k) = f (a) + 2 f (xk ) + f (b) .
2
k=0 k=1

若 Tn 的值仍不能满足精度的要求, 则再将子区间 [xk , xk+1 ] 二等分一次并分别采


用梯形公式, 求得子区间 [xk , xk+1 ] 上的积分近似值为
(k) hh i
Tn,2 = f (xk ) + 2f (xk+ 12 ) + f (xk+1 ) ,
4
xk+1 + xk
其中, xk+ 21 = . 此时相当于将积分区间 [a, b] 进行了 2n 等分, 则有
2
· 70 · 第3章 数值积分与数值微分

h Xh i
n−1
X n−1
(k)
T2n = Tn,2 = f (xk ) + 2f (xk+ 12 ) + f (xk+1 )
4
k=0 k=0
n−1
X
Tn h
= + f (xk+ 12 ). (3.21)
2 2
k=0

从而按式 (3.21) 的递推关系, 在计算好 Tn 值后欲计算 T2n 的值仅需计算每


n−1
X
一个区间新增的中点 xk+ 12 (k = 0, 1, 2, · · · , n) 的函数 f (xk+ 12 ) 即可, 避免了老
k=0

的等分节点上的函数重复计算, 使计算量节约了一半. 根据余项估计式 (3.16) 可知,


按这种方式不断计算所得结果将越来越精确, 但对于我们预先给定的精度要求, 何
时停止计算呢?
由于
(b − a)3 00
I − Tn = − f (η1 ), η1 ∈ [a, b],
12n2
(b − a)3 00
I − T2n = − f (η2 ), η2 ∈ [a, b].
12(2n)2
如假定 f 00 (x) 在 [a, b] 上变化不大, 即 f 00 (η1 ) ≈ f 00 (η2 ), 则
I − Tn
≈ 4.
I − T2n

于是
1
I − T2n ≈ (T2n − Tn ) . (3.22)
3
由于积分的精确值未知, 因此无法将 T2n 的值与之比较, 由式 (3.22), 我们可以

|T2n − Tn | < ε

作为不太严格的终止准则. 为了便于程序设计, 通常积分区间 [a, b] 的等分数应取


为 1, 2, 4, 8, · · · , 2k , · · · , 这样递推公式 (3.21) 可改成


 b−a
 T1 = 2 [f (a) + f (b)],

2Xk−1 µ ¶ (3.23)

 T 2 k−1 b − a b−a
 2
 T k = + k
f a + (2i − 1) k
, k = 1, 2, · · ·.
2 2 i=1
2

例 3.2 利用梯形公式的递推关系计算积分
Z 1
sin x
I= dx,
0 x
3.3 龙贝格 (Romberg) 算法 · 71 ·

使误差不超过 5 × 10−6 .
解:利用递推公式 (3.23) 计算如下:
1
T20 = T1 = [f (0) + f (1)] = 0.920 735 49,
2 µ ¶
T1 1 1
T21 = T2 = + f = 0.939 793 28,
2 2 2
· µ ¶ µ ¶¸
T2 1 1 3
T22 = T4 = + f +f = 0.944 513 52,
2 4 4 4
· µ ¶ µ ¶ µ ¶ µ ¶¸
T4 1 1 3 5 7
T23 = T8 = + f +f +f +f = 0.945 690 86,
2 8 8 8 8 8
······

仿上可得

T27 = T128 = 0.946 081 52,


T28 = T256 = 0.946 082 71.

因为
|T28 − T27 | < 2 × 10−6 ,

故取 Z 1
sin x
dx ≈ T28 = 0.946 082 71.
0 x
3.3.2 Romberg 算法

复化梯形公式的算法简单, 但精度较差 (见 3.2 节例 3.1). 而式 (3.21) 的递推


关系能使计算得到较大的节约, 那么能否据此进行适当的改进以得到较好的数值结
果呢?
1
按式 (3.22), 积分的近似值 T2n 的误差大致等于 (T2n − Tn ), 因此如用这个误
3
差作为 T2n 的一种补偿, 可期望得到更好的结果, 即用
1
T2n + (T2n − Tn )
3
作为积分式的近似值可能比 T2n 近似效果更好. 事实上, 由于
1 1
T2n + (T2n − Tn ) = (4T2n − Tn )
( "3 3 # ) " #
n−1 n−1
1 Tn hX 1 X
= 4 + f (xk+ 12 ) − Tn = Tn + 2h f (xk+ 12 )
3 2 2 3
k=0 k=0
( " n−1
# n−1
)
1 h X X
= f (a) + 2 f (xk ) + f (b) + 2h f (xk+ 12 )
3 2
k=0 k=0
· 72 · 第3章 数值积分与数值微分

" n−1 n−1


#
h X X
= f (a) + 2 f (xk ) + 4 f (xk+ 12 ) + f (b)
6
k=0 k=0
=Sn ,

于是
4T2n − Tn
Sn = , (3.24)
4−1
即通过对 Tn , T2n 适当组合确实能改进数值效果 (代数精度提高了 2 次). 基于这一
思路我们也可以对 Sn , S2n 进一步组合, 由于
(b − a)5 (4)
I − Sn = − f (η1 ), η1 ∈ [a, b] ,
2880n4
(b − a)5 (4)
I − S2n = − f (η2 ), η2 ∈ [a, b] ,
2880(2n)4
同样假设 f (4) (η1 ) ≈ f (4) (η2 ), 则
I − Sn
≈ 24 = 42 .
I − S2n

于是
42 S2n − Sn
I≈ .
42 − 1
容易验证
42 S2n − Sn
Cn = . (3.25)
42 − 1
同样地, 对复化 Cotes 公式进行类似处理, 可得代数精度为 7 次的 Romberg
公式
42 C2n − Cn
Rn = . (3.26)
43 − 1
进一步, 对 Rn , R2n 进行组合可得
42 R2n − Rn 256 1
En = = R2n − Rn . (3.27)
44 − 1 255 255
但由于 Sn , Cn , Rn 都是来自于最基础的复化梯形公式 Tn (本身含一定的截断误差),
256
因舍入误差的逐步积累, 加上 的比值太接近于 1, 故使 En 的组合失去了实用
255
意义.
另外, 由式 (3.24), (3.25) 和 (3.26) 可以看出, Sn , Cn , Rn 的组合形式都建立在
区间等分数成倍变化的基础上, 这就要求复化梯形公式的区间等分数必须按 2k (k =
0, 1, 2, · · · ) 增加. 于是基于最初的 T2k (k = 0, 1, 2, · · · ) 按表 3-2 所示步骤计算:
3.3 龙贝格 (Romberg) 算法 · 73 ·

表 3-2 Romberg 算法计算过程表


k T2k S2k−1 C2k−1 R2k−3
0 T1
1 T2 S1
2 T4 S2 C1
3 T8 S4 C2 R1
4 T16 S8 C4 R2
.. .. .. .. ..
. . . . .

(k)
为了便于程序设计, 表 3-2 中各近似常常用二维数组 Tm 来表示, 其中, 上标
(k)
k 和下标 m 分别表示 Tm 在表中的行、列序号 (均从 0 开始). 于是所用到的各个
公式可以统一写成便于程序设计的计算格式, 即
 b−a
 (0)

 T0 = [f (a) + f (b)] ,

 2



 2k−1 µ ¶
b−a X
(k−1)
(k) T0 b−a
T0 = + k f a + (2i − 1) k , k = 1, 2, · · · , (3.28)

 2 2 2

 k=0

 m (k+1) (k)

 4 T − T
 Tm
(k)
= m−1 m−1
, m = 1, 2, · · · , k = 0, 1, · · · ,
4m − 1
这样可逐行构造出下列二维 T 数表 (表 3-3):

表 3-3 二维 T 数表
(0)
T0
(1) (0)
T0 T1
(2) (1) (0)
T0 T1 T2
(3) (2) (1) (0)
T0 T1 T2 T3
.. .. .. ..
. . . .

用公式 (3.28) 来构造表 3-3 以求取积分近似值的方法称为 Romberg 算法. 由


于这种计算的区间每次都折半, 故又可称为逐次分半加速收敛法.
另外, 只要 f (x) 在区间 [a, b] 上有界可积, 就可以证明表 3-3 中各列和各行都
Z b
收敛到 f (x)dx. 因此, 可以用同一列 (或同一行) 相邻两数之差来控制是否终止
a
计算, 即以
(k) (k−1)
|Tm − Tm |<ε

(k−1) (k)
|Tm − Tm−1 | < ε
判断是否满足精确要求.
· 74 · 第3章 数值积分与数值微分

例 3.3 用 Romberg 算法计算积分


Z 1
sin x
I= dx,
0 x

要求精确到 5 × 10−8 .
解:按公式 (3.28), 计算结果如表 3-4 所示.

表 3-4 例 3.3 计算结果


(k) (k) (k) (k)
T0 T1 T2 T3
0.920 735 492
0.939 739 285 0.946 145 883
0.944 513 521 0.946 086 933 0.946 083 003
0.945 690 863 0.946 083 310 0.946 083 068 0.946 083 069

此时 ¯ ¯
¯ (0) (1) ¯
¯T3 − T2 ¯ < 5 × 10−8 ,

故有 Z 1
sin x
dx ≈ 0.946 083 069.
0 x
值得提出的是:
4m (k)
(1) 如式 (3.27)En 组合分析那样, 当 m 较大时, 接近 1, 此时 Tm ≈
4m − 1
(k+1) (k)
Tm . 因此实际运算中, 通常规定 m 6 3, 即算到 Romberg 序列的 {T3 } 为止,
以避免不必要的计算量.
(2) 计算 S1 需要计算到 T2 , 用了 3 个点的函数值, 代数精确度为 3 次; 计算
C1 需计算到 T4 , 用到了 5 个点的函数值, 代数精确度为 5 次; 但计算 R1 需要计算
T8 , 用了 9 个点的函数值, 其代数精确度只有 7 次, 这说明 Romberg 公式已不属于
插值型求积公式, 否则其代数精确度至少应为 8 次.
(3) 每次区间的分半, 即区间的等分数是成倍增长的, 相应的复化梯形的计算
量也将成倍增加, 这是 Romberg 算法在应用中必须注意的问题.

3.4 高斯 (Gauss) 公式
3.4.1 基本概念
数值积分公式
Z b n
X
f (x)dx ≈ Ak f (xk ) (3.29)
a k=0
3.4 高斯 (Gauss) 公式 · 75 ·

含有 2n + 2 个待定参数 xk , Ak (k = 0, 1, · · · , n), 如果适当选择这些参数, 会使上述


求积公式 (3.29) 具有 2n + 1 次代数精确度. 这类求积公式称为 Gauss 公式. 相应
地, 此时的求积节点称为 Gauss 点(即能使求积公式具有 2n + 1 次代数精确度的
求积节点).
Z 1
为便于叙述, 不失一般性, 这里仅讨论积分形式 f (x)dx, 否则, 作区间变换
−1
a+b b−a
x= + t, t ∈ [−1, 1] ,
2 2
则 Z Z µ ¶
b 1
b−a a+b b−a
f (x)dx = f + t dt. (3.30)
a 2 −1 2 2
根据 Gauss 公式的概念, 下面我们讨论这种高次代数精度公式的构造.
设一点 Gauss 公式为
Z 1
f (x)dx ≈ A0 f (x0 ).
−1

则其应具有一次代数精度 (n = 0), 即能对 f (x) = 1, x 精确成立, 于是


 Z 1


 dx = 2 = A0 ,
Z−11


 xdx = 0 = A0 x0 ,
−1

解得 A0 = 2, x0 = 0.
故一点 Gauss 公式为 Z 1
f (x)dx ≈ 2f (0), (3.31)
−1
即中矩形公式就是一点 Gauss 公式.
类似地, 设二点 Gauss 公式为
Z 1
f (x)dx ≈ A0 f (x0 ) + A1 f (x1 ),
−1

其中, x0 6= x1 . 则它应具有 3 次代数精度 (n = 1), 故对 f (x) = 1, x, x2 , x3 能分别


精确成立, 于是  Z 1



 1dx = 2 = A0 + A1 ,



 Z−1
1



 xdx = 0 = A0 x0 + A1 x1 ,
Z−1
1 (3.32)

 2 2 2 2

 x dx = = A 0 x 0 + A1 x 1 ,

 3
 −1
 Z 1



 x3 dx = 0 = A0 x30 + A1 x31 .
−1
· 76 · 第3章 数值积分与数值微分

1
由式 (3.32) 中的第 2, 4 两式得 x20 = x21 , 进而由第 1, 3 两式得 x20 = , 最后可
3
解得
A0 = A1 = 1,

3
x0 = −x1 = − .
3
所以二点 Gauss 公式为
Z à √ ! Ã√ !
1
3 3
f (x)dx ≈ f − +f . (3.33)
−1 3 3

进一步, 一般区间的二点 Gauss 公式为


Z b " Ã √ ! Ã √ !#
b−a a+b b−a 3 a+b b−a 3
f (x)dx ≈ f − +f + .
a 2 2 2 3 2 2 3

一般地, 多点 Gauss 公式理论上也可以通过求解类似的非线性方程组来进行


构造, 但非线性方程组的求解是很困难的. 又由于方程组的非线性来源于 Gauss 点,
因此为了讨论 Gauss 公式的一般形式, 下面我们先研究 Gauss 点的特性.
3.4.2 Gauss 点

定理 3.3 对于插值型求积公式
Z 1 n
X
f (x)dx ≈ Ak f (xk ), (3.34)
−1 k=0
n
Y
其节点 xk (k = 0, 1, · · · , n) 为 Gauss 点的充要条件是:ω(x) = (x − xk ) 与一切
k=0
不超过 n 次的多项式 P (x) 正交, 即
Z 1
ω(x)P (x)dx = 0. (3.35)
−1

证明:(1) 先证必要性. 设 P (x) 是任意的不超过 n 次多项式, 则 ω(x)P (x) 是


超过 2n + 1 次的多项式. 因此, 如果 x0 , x1 , · · · , xn 是 Gauss 点, 则由它们构成的
求积公式能对 ω(x)P (x) 精确成立, 即
Z 1 n
X
ω(x)P (x)dx = Ak ω(xk )P (xk ).
−1 k=0
Z 1
但因 ω(xk ) = 0 (k = 0, 1, 2, · · · , n), 故 ω(x)P (x)dx = 0.
−1

(2) 再证充分性. 对于任意给定的不超过 2n + 1 次的多项式 f (x), 用 ω(x) 除


f (x), 则
3.4 高斯 (Gauss) 公式 · 77 ·

f (x) = ω(x)Q1 (x) + Q2 (x),

其中, Q1 (x), Q2 (x) 都是不超过 n 次的多项式. 于是


Z 1 Z 1 Z 1
f (x)dx = ω(x)Q1 (x)dx + Q2 (x)dx.
−1 −1 −1

由式 (3.35) 得
Z 1 Z 1
f (x)dx = Q2 (x)dx.
−1 −1

又由于式 (3.34) 是插值型求积公式, 故至少具有 n 次代数精度, 即它对 Q2 (x) 能准


确成立 Z 1 n
X
Q2 (x)dx = Ak Q2 (xk ).
−1 k=0

又因为
f (xk ) = ω(xk )Q1 (xk ) + Q2 (xk ), k = 0, 1, · · · , n,

所以 Z 1 n
X n
X
Q2 (x)dx = Ak Q2 (xk ) = Ak f (xk ).
−1 k=0 k=0

从而有 Z 1 n
X
f (x)dx = Ak f (xk ).
−1 k=0

可见求积公式 (3.54) 能对一切不超过 2n + 1 次的多项式准确成立, 因此 xk (k =


0, 1, · · · , n) 是 Gauss 点. 证毕.

3.4.3 高斯-- 勒让德 (Gauss-Legendre) 公式


由于 Legendre 多项式是区间 [−1, 1] 上的正交多项式, 取
2n+1 [(n + 1)!]2 (n + 1)! dn+1 £ 2 ¤
ω(x) = Pn+1 (x) = n+1
(x − 1)n+1 ,
[2(n + 1)]! [2(n + 1)]! dx

其中, Pn+1 (x) 为 N + 1 次的 Legendre 多项式, 则 ω(x) 在区间 [−1, 1] 上能与所有


不超过 n 次的多项式正交. 事实上, 对任意不超过 n 次的多项式
n
X
P (x) = ak xk ,
k=0
k
由于 x 总可以表示成不超过 k 次的 Legendre 多项式的线性组合, 则
n n
" k # n
X X X X
P (x) = ak xk = ak bi Pi (x) = āk Pk (x).
k=0 k=0 i=0 k=0
· 78 · 第3章 数值积分与数值微分

于是
Z 1 Z 1
2n+1 [(n + 1)!]2
ω(x)P (x)dx = Pn+1 (x)P (x)dx
−1 [2(n + 1)]! −1
2 Z 1 n
X
2n+1 [(n + 1)!]
= Pn+1 (x) āk Pk (x)dx
[2(n + 1)]! −1 k=0
= 0.

因此 Legendre 多项式的零点即为 Gauss 点. 用 n + 1 次 Legendre 多项式


Pn+1 (x) 的零点构造的 Gauss 公式为
Z 1 n
X
f (x)dx ≈ Ak f (xk ). (3.36)
−1 k=0

故式 (3.36) 为 Gauss-Legendre 求积公式, 且有:


定理 3.4 对 Gauss-Legendre 公式 (3.36), 其余项为
Z 1 Xn Z
f (2n+2) (η) 1 2
R [f ] = f (x)dx − Ak f (xk ) = ω (x)dx, η ∈ [−1, 1], (3.37)
−1 (2n + 2)! −1
k=0
n
Y
其中, ω (x) = (x − xk ), xk (k = 0, 1, · · · , n) 为 n + 1 次的 Legendre 多项式零点.
k=0

证明:以 x0 , x1 , · · · , xn , t 为节点构造 Hermite 插值多项式 H2n+1 (x), 使其满



0
H2n+1 (xi ) = f (xi ), H2n+1 (xi ) = f 0 (xi ), i = 0, 1, · · · , n.

由于 Gauss-Legendre 公式 (3.36) 具有 2n + 1 次代数精度, 故能对不超过 2n + 1 次


的 Hermite 插值多项式 H2n+1 (x) 准确成立, 即有
Z 1 n
X n
X
H2n+1 (x)dx = Ak H2n+1 (xk ) = Ak f (xk ).
−1 k=0 k=0

因此
Z 1 n
X
R [f ] = f (x)dx − Ak f (xk )
−1 k=0
Z 1 Z 1
= f (x)dx − H2n+1 (x)dx
−1 −1
Z 1
f (2n+2) (ξ) 2
= ω (x)dx.
−1 (2n + 2)!

由于 ω 2 (x) 在区间 [−1, 1] 上保号, 应用积分中值定理即得式 (3.37). 证毕.


为便于应用, 将常用的 Gauss-Legendre 公式的节点和系数列成表 3-5.
3.4 高斯 (Gauss) 公式 · 79 ·

表 3-5 部分 Gauss-Legendre 公式的节点和系数


n xk Ak
0 0 2

3
1 ± (±0.577 350 3) 1
3
8
0 (0.888 888 9)
√ 9
2 15
± (±0.774 596 7) 5
5 (0.555 555 6)
9
±0.861 136 3 0.347 854 8
3
±0.339 981 0 0.652 145 2
0 0.568 888 9
4 ±0.538 469 3 0.478 628 7
±0.906 179 8 0.236 926 9

3.4.4 稳定性和收敛性
由表 3-5 可以看出, Gauss 点往往是无理的, 这就使数据 f (xk ) 必然有一定误
差, 那么这种误差是否会影响最终结果呢?实际上, 因为 Gauss 求积公式 (3.29) 的
系数具有下列特点:
(1) 因为积分式对函数 f (x) = 1 准确成立, 则
Xn
Ak = b − a.
k=0

(2) 因求积公式对 2n 次多项式 f (x) = lk2 (x) 也准确成立, 则


n
X Z b
Ak = Ai lk2 (xi ) = lk2 (x)dx > 0, k = 0, 1, 2, · · · .
i=0 a

因此, 如 f (xk ) 有误差 εk , 则由此引起的最终结果的误差为


δ = A0 ε0 + A1 ε1 + · · · + An εn .

记 ε = max |εk |, 则
06k6n

|δ| 6 |A0 | |ε0 | + |A1 | |ε1 | + · · · + |An | |εn |


Xn
6ε Ak = ε(b − a).
k=0

因此, 当 f (xk ) 的误差都足够小时, 它对最终结果的影响也将非常小, 即 Gauss 求


积公式有好的数值稳定性.
关于收敛性, 可以证明:若 f (x) 在区间 [a, b] 上连续, 即当 n → ∞ 时, Gauss
Xn Z b
型求积公式 Ak f (xk ) 收敛于 f (x)dx.
k=0 a
· 80 · 第3章 数值积分与数值微分

Gauss 型求积公式除了有好的收敛性和稳定性之外, 还是具有最高次代数精度


的数值求积公式, 即对 n + 1 个求积节点构成的求积公式不可能具有 2n + 2 次代
数精度.
事实上, 对于任意构造的求积公式
Z b n
X
f (x)dx ≈ Āk f (x̄k ),
a k=0
n
Y
它总是不能对 2n + 2 次多项式 f (x) = (x − xi )2 准确成立. 因为
i=0
Z b Z n
bY
f (x)dx = (x − x̄i )2 dx > 0,
a a i=0

而 " #
n
X n
X n
Y
2
Āk f (x̄k ) = Āk (x̄k − x̄i ) = 0.
k=0 k=0 i=0

3.4.5 带权 Gauss 公式
对于积分 Z b
I= ρ(x)f (x)dx,
a

其中, ρ(x) > 0 称为权函数. 当 ρ(x) ≡ 1 时就是上面讨论的普通积分.


仿普通积分的讨论, 对于求积公式
Z b n
X
ρ(x)f (x)dx = Ak f (xk ), (3.38)
a k=0

若能对任意的不超过 2n + 1 次的多项式 f (x) 的准确成立, 则称式 (3.38) 为 Gauss


型求积公式. 类似地, xk (k = 0, 1, · · · , n) 称为 Gauss 点. 此时, xk (k = 0, 1, · · · , n)
Yn
为 Gauss 点的充要条件是:ω(x) = (x − xk ) 为区间 [a, b] 上关于权函数 ρ(x) 的
k=0
正交多项式, 即
Z b
ρ(x)ω(x)P (x)dx = 0.
a

常用的 Gauss 型系列公式有:


1) 高斯–拉盖尔公式
Z +∞ n
X
e−x f (x)dx ≈ Ak f (xk ), (3.39)
0 k=0

其中, xk (k = 0, 1, · · · , n) 是 n + 1 次 Laguerre 多项式 Ln+1 (x) 的零点; 求积系数为


3.4 高斯 (Gauss) 公式 · 81 ·

(n!)2
Ak = − , k = 0, 1, · · · , n.
L0n+1 (xk )Ln (xk )

其余项为
2
[(n + 1)!] (2n+2)
R[f ] = f (η), 0 < η < +∞.
(2n + 2)!
一般地,
Z +∞ n
X
f (x)dx ≈ Ak exk f (xk ).
0 k=0

2) 高斯–埃尔米特公式
Z +∞ n
X
2
e−x f (x)dx ≈ Ak f (xk ), (3.40)
−∞ k=0

其中, xk (k = 0, 1, · · · , n) 是 n + 1 次 Hermite 多项式 Hn+1 (x) 的零点, 求积系数为



2n+1 n! π
Ak = 0 , k = 0, 1, · · · , n.
Hn+1 (xk )Hn (xk )

求积公式余项为

(n + 1)! π (2n+2)
R [f ] = n+1 f (η), −∞ < η < +∞.
2 (2n + 2)!

类似地,
Z +∞ n
X 2
f (x)dx ≈ Ak exk f (xk ).
−∞ k=0

3) 高斯–切比雪夫公式
Z 1 n µ ¶
f (x) π X 2k + 1
√ dx ≈ f cos π , (3.41)
−1 1 − x2 n+1 2n + 2
k=0

其余项表达式为
π
R [f ] = f (2n+2) (η), −1 < η < +1.
2(2n+1) (2n + 2)!

例 3.4 利用 n = 2 的 Gauss-Legendre 求积公式, 计算


Z 3
dx
I= .
1 x

解: 作变换替换 x = t + 2, 则积分为
Z 1 Z 1
dt dx
I= = .
−1 t + 2 −1 x +2
· 82 · 第3章 数值积分与数值微分

利用 Gauss-Legendre 求积公式得
 
8 1 5  1 1 
I≈ × + × √ + √ 
9 2+0 9  15 15 
2− 2+
5 5
4 5 20
= + × = 1.098 039 2.
9 9 17

3.5 数 值 微 分
对于确定的函数表达式 f (x), 函数的导数值总是可以按各种求导的公式和规
则或是直接通过导数定义的极限积分求得, 但当函数是以数据表的形式给出时, 微
分学中的方法就不能使用. 对此, 下面介绍两个基本的数值求导方法.
3.5.1 插值型求导公式
设已知 f (x) 在节点 xk (k = 0, 1, · · · , n) 的函数值为 f (x0 ), f (x1 ), · · · , f (xn ), 运
用插值原理, 可以作 n 次插值多项式 Pn (x) 作为 f (x) 的近似, 由于多项式的求导
比较容易, 进而我们可取 Pn0 (x) 的值作为 f 0 (x) 的近似值, 这样建立的数值公式
f 0 (x) ≈ Pn0 (x) (3.42)

统称为插值型求导公式. 值得指出的是:即使 f (x) 与 Pn (x) 的值相差不多, 但导


数的近似值 Pn0 (x) 与导数的真值 f 0 (x) 仍可能相差甚远, 因此在使用数值求导公式
(3.42) 时应特别注意误差分析.
依据插值余项定理, 求导公式 (3.42) 的余项为
f (n+1) (ξ) 0 ωn+1 (x) d (n+1)
f 0 (x) − Pn0 (x) = ωn+1 (x) + f (ξ),
(n + 1)! (n + 1)! dx
其中
n
Y
ωn+1 (x) = (x − xk ).
k=0
ωn+1 (x) d (n+1)
在这一余项公式中, 由于 ξ 是 x 的未知函数, 故无法对第二项 f (ξ)
(n+1)! dx
作进一步的说明. 因此, 对于任给的点 x 的误差值是难以预估的. 但是, 如果我们
限定讨论某个节点 xk 上的导数值, 那么上面的第二项因 ωn+1 (xk ) = 0 而为零, 此
时有余项公式
f (n+1) (ξ) 0
f 0 (xk ) − Pn0 (xk ) = ω (xk ). (3.43)
(n + 1)! n+1
为便于实际应用, 下面讨论一些节点处导数值的计算公式, 并假定所给的节点
是等间距的.
3.5 数值微分 · 83 ·

1) 两点公式
设已给出两个节点 x0 , x1 处的函数值 f (x0 ), f (x1 ), 作线性插值多项式
x − x1 x − x0
P1 (x) = f (x0 ) + f (x1 ).
x0 − x1 x1 − x0
记 h = x1 − x0 , 并对上式两端求导, 则
1
P10 (x) = [−f (x0 ) + f (x1 )] .
h
于是, 有下列求导公式:
1
P10 (x0 ) = [f (x1 ) − f (x0 )] ,
h
1
P10 (x1 ) =
[f (x1 ) − f (x0 )] .
h
而利用余项公式 (3.43), 带余项的两点公式是
1 h
f 0 (x0 ) = [f (x1 ) − f (x0 )] − f 00 (ξ1 ),
h 2
1 h
f 0 (x1 ) = [f (x1 ) − f (x0 )] + f 00 (ξ2 ). (3.44)
h 2
2) 三点公式
已给出三个节点 x0 , x1 = x0 + h, x2 = x0 + 2h 处的函数值 f (x0 ), f (x1 ), f (x2 ),
作二次插值多项式
(x − x1 )(x − x2 ) (x − x0 )(x − x2 )
P2 (x) = f (x0 ) + f (x1 )
(x0 − x1 )(x0 − x2 ) (x1 − x0 )(x1 − x2 )
(x − x0 )(x − x1 )
+ f (x2 ).
(x2 − x0 )(x2 − x1 )

令 x = x0 + h, 则上式可表为
1 1
P0 (x0 + th) = (t − 1)(t − 2)f (x0 ) − t(t − 2)f (x2 ) + t(t − 1)f (x0 ).
2 2
两端关于 t 求导, 得
1
P20 (x0 + th) = [(2t − 3)f (x0 ) − (4t − 4)f (x1 ) + (2t − 1)f (x2 )] , (3.45)
2h
其中, “ 0 ” 表示对变量 x 的求导. 在式 (3.45) 中分别取 t = 0, 1, 2 则得三种三点求
导公式
1
P20 (x0 ) = [−3f (x0 ) + 4f (x1 ) − f (x2 )] ,
2h
1
P20 (x1 ) = [−f (x0 ) + f (x2 )] ,
2h
· 84 · 第3章 数值积分与数值微分

1
P20 (x2 ) = [f (x0 ) − 4f (x1 ) + 3f (x2 )] .
2h
相应地, 带余项的三点求导公式如下:
1 h2
f 0 (x0 ) = [−3f (x0 ) + 4f (x1 ) − f (x2 )] + f 000 (ξ1 ),
2h 3
2
1 h
f 0 (x1 ) = [−f (x0 ) + f (x2 )] − f 000 (ξ2 ), (3.46)
2h 6
1 h2
f 0 (x2 ) = [f (x0 ) − 4f (x1 ) + 3f (x2 )] + f 000 (ξ3 ).
2h 3
用插值多项式 Pn (x) 作为 f (x) 的近似函数, 还可以建立高阶数值微分公式:

f (k) (x) ≈ Pm
(k)
(x), k = 1, 2, · · · , m.

例如, 将式 (3.45) 两端关于 t 再求导一次, 则


1
P200 (x0 + th) = [f (x0 ) − 2f (x1 ) + f (x2 )] ,
h2
于是
1
P200 (xi ) = [f (x0 ) − 2f (x1 ) + f (x2 )], i = 0, 1, 2.
h2
而带余项的二阶三点公式为

1 h2
f 00 (xi ) = 2
[f (x0 ) − 2f (x1 ) + f (x2 )] − f (4) (ξi ), i = 0, 1, 2. (3.47)
h 12

3) 实用的五点公式
设已给出函数 f (x) 在 5 个节点 xk = x0 + kh(k = 0, 1, 2, 3, 4) 处的函数值
f (xk )(k = 0, 1, 2, 3, 4). 重复类似手段, 我们可导出下列五点公式:
1
m0 = [−25f (x0 ) + 48f (x1 ) − 36f (x2 ) + 16f (x3 ) − 3f (x4 )] ,
12h
1
m1 = [−3f (x0 ) − 10f (x1 ) + 18f (x2 ) − 6f (x3 ) + f (x4 )] ,
12h
1
m2 = [f (x0 ) − 8f (x1 ) + 8f (x3 ) − f (x4 )] , (3.48)
12h
1
m3 = [−f (x0 ) + 6f (x1 ) − 18f (x2 ) + 10f (x3 ) + 3f (x4 )] ,
12h
1
m4 = [3f (x0 ) − 16f (x1 ) + 36f (x2 ) − 48f (x3 ) + 25f (x4 )] ,
12h
其中, mk 表示一阶导数 f 0 (xk ) 的近似值. 按式 (3.43) 不难推导出公式的余项 (略).
再记 Mk 为二阶导数 f 00 (xk ) 的近似值, 则二阶五点公式如下:
3.5 数值微分 · 85 ·

1
M0 = [35f (x0 ) − 104f (x1 ) + 114f (x2 ) − 56f (x3 ) + 11f (x4 )] ,
12h2
1
M1 = [11f (x0 ) − 20f (x1 ) + 6f (x2 ) + 4f (x3 ) − f (x4 )] ,
12h2
1
M2 = [−f (x0 ) + 16f (x1 ) − 30f (x2 ) + 16f (x3 ) − f (x4 )] , (3.49)
12h2
1
M3 = [−f (x0 ) + 4f (x1 ) + 6f (x2 ) − 20f (x3 ) + 11f (x4 )] ,
12h2
1
M4 = [11f (x0 ) − 56f (x1 ) + 114f (x2 ) − 104f (x3 ) + 35f (x4 )] .
12h2
对于给定的数据表, 用五点公式求节点上的导数值往往能取得满意的结果. 5
个相邻节点的选法一般是在所求导数的该节点两侧各取两个邻近的节点, 如一侧的
节点数不足两个, 则用另一侧的节点来补足.

例 3.5 利用 f (x) = x 的一张数据表 (表 3-6 左部), 按五点公式求节点上
的导数值.
解: 结果如表 3-6 所示.

表 3-6 五点公式计算结果比较
xi f (xi ) mi f 0 (xi ) Mi × 103 f 00 (xi ) × 103
100 10.000 000 0.050 000 0.050 000 −0.250 92 −0.250 00
101 10.049 875 0.049 751 0.049 752 −0.245 92 −0.246 30
102 10.099 504 0.049 507 0.049 507 −0.241 92 −0.242 68
103 10.148 891 0.049 267 0.049 267 −0.238 92 −0.239 16
104 10.198 039 0.049 029 0.049 029 −0.236 92 −0.235 72
105 10.246 950 0.048 793 0.048 795 −0.235 92 −0.232 36

3.5.2 三次样条插值求导
如果用三次样条插值函数 S (x) 作为 f (x) 的近似函数, 不但可以使函数值非
常接近, 而且还可以使导数值非常接近. 因为在一定条件 [如 f (x) 具有连续的四阶
导数] 下, 由 1.6 节定理 1.3 知, 当 h = max hi → 0 时, 则
16i6n
¯ ¯
¯ (m) ¯
¯f (x) − S (m) (x)¯ = O(h(4−m) ), m = 0, 1, 2, 3,

其中, O(h(4−m) ) 表示 h(4−m) 的同阶无穷小量. 因此, 用三次样条插值函数求数值


导数, 可望比上面多项式插值法有更好的数值效果. 其基本思想如下.
已知 f (x) 在节点 x0 , x1 , · · · , xn 处的函数值为 f (xk ) (k = 0, 1, · · · , n), 又已知
适当的边界条件, 按 1.6 节中介绍的方法可构造一个三次插值函数, 如仅需求节点
处的导数值, 则求解三对角方程组中 mk (k = 0, 1, · · · , n) 的值即可. 但如果要计算
· 86 · 第3章 数值积分与数值微分

区间 [xi−1 , xi ] 中某点导数值的近似值, 则可具体写出该区间上的三次多项式


(x − xi )2 [hi + 2(x − xi−1 )] (x − xi−1 )2 [hi + 2(xi − x)]
Si (x) = f (xi−1 ) + f (xi )
h3i h3i
(x − xi )2 (x − xi−1 ) (x − xi−1 )2 (x − xi )
+ mi−1 + mi ,
h2i h2i
对上式两边求导, 并用其近似代替 f 0 (x), 即得
· ¸ · ¸
6 (x−xi )2 6 (x−xi−1 )2
f 0 (x) ≈Si0 (x) = 2 + (x−xi ) f (xi−1 ) + 2 (x−xi−1 )− f (xi )
hi hi hi hi
· ¸ · ¸
1 3(x − xi )2 1 3(x − xi−1 )2
+ + 2(x − xi ) mi−1 + − 2(x − xi−1 ) mi ,
hi hi hi hi
(3.50)
其中, x ∈ [xi−1 , xi ] (i = 1, 2, · · · , n). 若对式 (3.50) 再求一次导数, 就可得到 f 00 (x)
的近似公式.

习 题 3
Z b
1. 如果 f 00 (x) > 0, 证明:用梯形公式计算积分 f (x)dx 所得结果比准确值大, 并说明
a

几何意义.
2. 求节点 x1 , x2 , x3 以及待定系数 C, 使求积公式
Z 1
f (x)dx ≈ C [f (x1 ) + f (x2 ) + f (x3 )]
−1

具有 3 次代数精度.
3. 确定下列公式中的参数, 使其代数精度尽量高, 并说明所得公式最高代数精度的次数.
Z h
(1) f (x)dx ≈ A−1 f (−h) + A0 f (x) + A1 f (h).
−h
Z 2h
(2) f (x)dx ≈ A−1 f (−h) + A0 f (0) + A1 f (h).
−2h
Z 1
1
(3) f (x)dx ≈ [f (−1) + 2f (x1 ) +3f (x2 )].
−1 3
Z h
h £ ¤
(4) f (x)dx ≈ [f (0) + f (h)] + Ah2 f 0 (0) − f 0 (h) .
0 2
4. 已知数据表

xi 1.8 2.0 2.2 2.4 2.6


f (xi ) 3.120 14 4.425 69 6.042 41 8.030 14 10.466 75

Z 2.6
试用全部数据计算 f (x)dx 的近似值.
1.8
习 题 3 · 87 ·

5. 利用 Simpson 公式计算积分
Z 1
I= ex dx,
0

并估计误差.
Z b
6. 利用复化梯形公式计算 f (x)dx, 应该将区间多少等分, 才能保证误差不超过 ε(计
a

算过程不计舍入误差)?
7. 利用复化 Simpson 公式计算:
Z 6
x
(1) 2
dx (区间三等分).
0 4+x
Z 9
1
(2) dx (区间四等分).
1 x
8. 利用 Romberg 算法计算积分.
Z 1
4
(1) dx.
0 1 + x2
Z 1
2
(2) √ e−x dx.
π 0
9. 利用 Gauss-Legendre 求积公式计算积分
Z 4
1
I= 2
dx,
−4 1 + x

分别取 n = 2, 4, 并与真值 2 arctan 4 ≈ 2.651 635 3 比较.


1
10. 利用三点公式和五点公式求 f (x) = 在 x = 1.0, 1.1, 1.2 的一阶导数值, 并估
1 + x2
计误差, 其中, f (x) 的取值为

xi 1.0 1.1 1.2 1.3 1.4


f (xi ) 0.25 0.2268 0.2066 0.1890 0.1736

11. 分别用三点的 Gauss-Legendre 公式和 Gauss-Chebyshev 公式计算积分


Z 1
arccos x
I= √ dx,
−1 1 − x2

π2
并与真值 I = 比较.
2
Z b
12. 证明:复化梯形公式和复化 Simpson 公式当 n → ∞ 时收敛到积分 f (x)dx.
a
第4章 常微分方程数值解法

4.1 数值解法的基本思想和途径
4.1.1 初值问题
科学和工程领域中常涉及常微分方程的定解问题的求解. 而这类问题中最基
本、最简单的形式就是一阶微分方程的初值问题:
(
y 0 = f (x, y),
(4.1)
y(a) = y0 .
我们知道, 只要函数 f (x, y) 适当光滑, 譬如关于 y 满足利普希茨 (Lipschitz) 条件:
|f (x, y) − f (x, y)| 6 L |y − y| ,
那么理论上就可以保证初值问题式 (4.1) 的解 y = y (x) 存在且唯一, 但理论上存
在的唯一解并不总能用解析形式表示出来. 尽管我们已经学习了各种解析求解方
法, 但它们仅适用于求解一些特殊类型的方程, 而从实际问题中抽象出来的微分方
程主要依赖于数值解法.
所谓数值解法就是要寻找解 y = y (x) 在一系列离散点:
x1 < x2 < · · · < xk < xk+1 < · · ·
上的近似值 y1 , y2 , · · · , yk , yk+1 , · · · . 为便于叙述, 把相邻两个节点的间距 h = xk+1 −
xk 称为步长, 并且如果不作特别说明, 我们总假定 h 为定数. 相应地, 这时节点可
表示为 xk = a + kh (k = 0, 1, · · · ).
实施数值解法的手段是将初值问题式 (4.1) 按一定规则转化成关于近似值 yk
计算的递推关系式 ——差分方程, 并称这一转化过程为离散化过程, 即
离散化
初值问题式 (4.1)−→ 差分方程.
数值解法的主要特点是:采用 “步进方式”, 按节点次序步步向前推进, 即按
y0 → y1 → y2 → · · · → yk → yk+1 → · · ·
进行递推.
4.1.2 离散化方法
1. 用差商代替导数的方法

我们知道, 导数是差商的极限形式. 因此, 当步长 h 不太大时, 在点 xk 处的导


4.1 数值解法的基本思想和途径 · 89 ·

数 y 0 (xk ) 可以近似地用差商表示, 如记 yk ≈ y(xk ).


1) 向前差商
yk+1 − yk
f (xk , y(xk )) = y 0 (xk ) ≈ , k = 0, 1, 2, · · · .
h
则初值问题式 (4.1) 可以化为

yk+1 = yk + hf (xk , yk ), k = 0, 1, 2, · · · , (4.2)

称为欧拉 (Euler) 公式.


2) 向后差商
yk+1 − yk
f (xk+1 , y(xk+1 )) = y 0 (xk+1 ) ≈ , k = 0, 1, 2, · · · .
h
则初值问题式 (4.1) 相应地化为

yk+1 = yk + hf (xk+1 , yk+1 ), k = 0, 1, 2, · · · , (4.3)

称为后退 Euler 公式.


3) 中心差商
yk+1 − yk
f (xk , y(xk )) = y 0 (xk ) ≈ , k = 0, 1, 2, · · · .
2h
这时相应的差分方程为

yk+1 = yk−1 + 2hf (xk , yk ), k = 0, 1, 2, · · · , (4.4)

称为中心 Euler 公式或 Euler 两步公式.


2. 数值积分方法

把 y 0 = f (x, y) 在区间 [xk , xk+1 ] (k = 0, 1, 2, · · · ) 上积分, 得


Z xk+1
y(xk+1 ) − y(xk ) = f (x, y(x))dx.
xk

这样右端积分可用数值积分方法计算其近似值.
(1) 积分用 (左) 矩形公式计算, 得

yk+1 = yk + hf (xk , yk ), k = 0, 1, 2, · · · ,

这就是 Euler 公式.


(2) 积分用梯形求积公式计算, 得
h
yk+1 = yk + [f (xk , yk ) + f (xk+1 , yk+1 )] , k = 0, 1, 2, · · · , (4.5)
2
则相应地称为求解初值问题的梯形公式.
· 90 · 第4章 常微分方程数值解法

3. 泰勒展开法

设 y = y (x) 为初值问题式 (4.1) 的解. 假定函数 y (x) 足够光滑, 则将 y (x) 在


点 xk 处进行泰勒展开, 并令 x = xk+1 , 得
h2 00
y(xk+1 ) = y(xk ) + y 0 (xk )h + y (xk ) + · · · . (4.6)
2
如果右端只保留 h 的线性项, 且以 yk+1 作为 y(xk+1 ) 的近似, 这样又可得
Euler 公式
yk+1 = yk + hf (xk , yk ), k = 0, 1, 2, · · · .

记 T1 = y(xk+1 ) − y(xk ) − hf (xk , y(xk )), 若局部假定有 yk = y(xk ), 则

T1 = y(xk+1 ) − y(xk ) − hf (xk , y(xk )),


= y(xk+1 ) − [yk + hf (xk , yk )]
h2 00
= y (xk ) + O(h3 ) = O(h2 ), (4.7)
2
¡ ¢
其中, O h2 表示 h2 的同阶无穷小量. 称 T1 为 Euler 公式的局部截断误差.
类似地, 将 y (x) 在点 xk+1 处 Taylor 展开, 令 x = xk , 则
h2 00
y(xk ) = y(xk+1 ) − hy 0 (xk+1 ) + y (xk+1 ) + O(h3 ). (4.8)
2
同样地, 考虑函数 y 00 (x) 在点 xk 的 Taylor 展开, 且令 x = xk+1 , 则

y 00 (xk+1 ) = y 00 (xk ) + O(h). (4.9)

将式 (4.6) 减去式 (4.8), 并利用式 (4.9), 得

2[y(xk+1 ) − y(xk )] − h[y 0 (xk ) + y 0 (xk+1 )] = O(h3 ).

同样局部假定 yk = y(xk ), 于是可得梯形公式 (4.5) 的局部截断误差为


h
T2 = y(xk+1 ) − y(xk ) − [f (xk , y(xk )) + f (xk+1 , y(xk+1 ))] = O(h3 ).
2
4.1.3 几个基本概念
1. 单步法与多步法

1) 单步法
为了求得后一点 xk+1 上的数值解 yk+1 , 只要知道前面一点 xk 的数值解 yk
就可以了. 其特征有:①差分方程中关于 y 的下标最大差为 1; ②是自开始的方法,
即 y1 → y2 → y3 → · · · , 如 Euler 公式 (4.2)、梯形公式 (4.5) 等.
4.1 数值解法的基本思想和途径 · 91 ·

2) 多步法
计算 yk+1 时, 要用到前面多点的数值解信息, 比如要用到前面 m(> 1) 点的信
息, 此时差分方程中关于 y 的下标最大差为 m, 这就称为 m 步法. 例如, 中心 Euler
公式是两步法.
2. 显格式与隐格式

如果所求的数值解 yk+1 可以用 xk 和 yk 解析表出, 就称为显格式. 反之, 称


为隐格式. 例如, Euler 公式是显格式, 后退 Euler 公式和梯形公式是隐格式. 对隐
格式而言, 此时计算 yk+1 形式上需要解方程.
对于隐格式而言, 其右端含有待求的数值解 yk+1 , 即需要解方程. 为了避免解
方程, 可先用某显格式提供一个初始近似值 ȳk+1 代入隐格式计算出 yk+1 的改进
值, 即先按某显格式对 yk+1 进行预报, 然后用隐格式对其校正. 这种显格式和隐格
式联合应用, 称为预报–校正公式. 比如我们可以先用 Euler 公式校正预报得 ȳk+1 ,
然后用梯形公式校正, 即

 ȳk+1 = yk + hf (xk , yk ), 预报,
h (4.10)
 yk+1 = yk + [f (xk , yk ) + f (xk+1 , ȳk+1 )] , 校正.
2
这样, 实质上已将隐格式转化为显格式了. 称预报–校正公式 (4.10) 为改进 Euler
公式.
3. 局部截断误差与方法的阶

设 y(xk+1 ) 是初值问题的精确解, yk+1 是差分方程的准确解, 从 Taylor 展开法


的讨论中可以看出, 差分方程是局部假定 yk = y(xk ) 后截去了余项 Tp = O(hp+1 )
得到的近似公式. Tp 称为此近似公式的局部截断误差, 它是与 hp+1 同阶的量. 进
一步我们规定, 若一个方法的局部截断误差为 O(hp+1 ), 则称此方法具有 p阶精度
或称这种方法是 p阶的. 显然, Euler 公式的局部截断误差为 O(h2 ), 故它是一阶方
法. 而梯形公式 (4.5) 的局部截断误差为 O(h3 ), 因此它是一个二阶的方法.
4. 公式的几何意义

Euler 公式有明显的几何意义. 事实上, 设 y = y (x) 是初值问题式 (4.1) 的解,


那么按 Euler 公式

yk+1 = yk + hf (xk , yk ) , k = 0, 1, 2, · · · ,

所得的数值解 y1 就是 y = y (x) 在 P0 (x0 , y0 ) 的切线上的一个点 P1 (x1 , y1 ) 的纵坐


标值 (见图 4-1), 而 y2 则是通过点 P1 斜率为 y 0 (x1 ) 的直线上的一点 P2 (x2 , y2 ) 的
纵坐标值. 依此类推, 这样推得的 yk (k = 0, 1, 2 · · · ) 就取为初值问题式 (4.1) 在点
· 92 · 第4章 常微分方程数值解法

xk (k = 0, 1, 2, · · ·) 上的数值解. 把 P0 , P1 , · · · , Pk , · · · 连成折线, 在几何上这条折线


就是解 y (x) 的近似曲线. 基于这种几何意义, 此方法又称 Euler 折线法.

图 4-1 欧拉公式的几何意义

例 4.1 分别用 Euler 公式 (4.2) 和改进 Euler 公式 (4.10) 计算初值问题



 y 0 = − 0.9y ,
1 + 2x
 y(0) = 1,

的数值解. 取步长 h = 0.02, 计算到 y5 , 并与精确值 y(xk ) = (1 + 2xk )−0.45 进行


比较.
解:由 Euler 公式
µ ¶
0.9h
yk+1 = yk + hf (xk , yk ) = yk 1 − , k = 0, 1, 2, · · · .
1 + 2xk
计算结果如表 4-1 所示.

表 4-1 例 4.1 中使用 Euler 公式的计算结果


k xk yk f (xk , yk ) yk+1
0 0 1 −0.9 0.9820
1 0.02 0.9820 −0.8498 0.9650
2 0.04 0.9650 −0.8042 0.9489
3 0.06 0.9489 −0.7625 0.9336
4 0.08 0.9336 −0.7244 0.9191

由改进 Euler 公式


 ȳk+1 = yk + hf (xk , yk ),

 yk+1 = yk + h [f (xk , yk ) + f (xk , ȳk+1 )],



k = 0, 1, 2, · · · ,
2
4.2 龙格–库塔 (Runge-Kutta) 法 · 93 ·

计算结果如表 4-2 所示.

表 4-2 例 4.1 中使用改进 Euler 公式的计算结果


k xk yk f (xk , yk ) ȳk+1 f (xk , ȳk+1 ) yk+1
0 0 1 −0.9 0.982 −0.849 808 0.982 502
1 0.02 0.982 502 −0.850 242 0.965 497 −0.804 581 0.965 954
2 0.04 0.965 954 −0.804 962 0.949 855 −0.763 276 0.950 272
3 0.06 0.950 272 −0.763 611 0.935 000 −0.725 431 0.935 382
4 0.08 0.935 382 −0.725 727 0.920 867 −0.690 650 0.921 218

Euler 公式与改进 Euler 公式的结果与精确解比较如表 4-3 所示.

表 4-3 例 4.1 计算结果与精确解的比较


xk Euler 法 改进 Euler 法 精确解 (6 位有效数字)
0.02 0.982 000 0.982 502 0.982 506
0.04 0.965 004 0.965 945 0.965 960
0.06 0.948 921 0.950 272 0.950 281
0.08 0.933 670 0.935 382 0.935 393
0.10 0.919 182 0.921 218 0.921 231

可见, 改进 Euler 公式要比 Euler 公式的精确程度好得多.

4.2 龙格–库塔 (Runge-Kutta) 法


4.2.1 Runge-Kutta 法的基本思想

从局部截断误差可以看出, 当步长 h 较小时, 可以想象出阶数越高的方法其局


部截断误差的绝对值越小, 即所得数值解近似效果越好. 事实上, 例 4.1 的数值计算
结果亦表明用二阶的梯形公式校正后精度确实要比一阶的 Euler 公式要高. 而本质
上, 梯形公式仅是在右端对 f (x, y) 不同点的值进行了适当的线性组合, 那么能否
对更多点 f (x, y) 的值进行组合从而产生更高阶的方法呢?
设 y = y (x) 是初值问题式 (4.1) 的解析解. 考虑函数 y (x) 在点 xk 处的 Taylor
展开, 并令 x = xk+1 , 则有
h2 00
y (xk+1 ) = y(xk ) + y 0 (xk )h + y (xk ) + O(h3 ). (4.11)
2
由于 y 0 = f (x, y), 则

y 0 (xk ) = f (xk , y(xk )),


¯
y 00 (xk ) = (fx + f · fy ) ¯(xk ,y(xk )) .

类似地, 可推得 y (x) 更高阶导数在 xk 处的值, 从而


· 94 · 第4章 常微分方程数值解法

y(xk+1 ) =y(xk ) + hf (xk , y(xk ))


h2
+ [fx (xk , y(xk )) + f (xk , y(xk ))fy (xk , y(xk ))] + O(h3 ). (4.12)
2
另一方面, 若假设差分格式具有如下形式:

yk+1 = yk + c1 hf (xk , yk ) + c2 hf [xk + hλ1 , yk + µ1 hf (xk , yk )], (4.13)

即 

 yk+1 = yk + c1 K1 + c2 K2 ,

K1 = hf (xk , yk ),


 K = hf (x + λ h, y + µ hf (x , y )),
2 k 1 k 1 k k

其中, c1 , c2 , λ1 , µ1 是待定参数, 它们的确定需使差分格式 (4.13) 有二阶精度.


为使差分格式 (4.13) 能与式 (4.12) 进行比较, 将 f (xk + λ1 h, yk + µ1 hf (xk ,
yk )) 关于待定参数 λ1 和 µ1 作为变量的二元函数在点 (xk , yk ) 处进行 Taylor 展开,
则有

f (xk + λ1 h, yk + µ1 hf (xk , yk )) =f (xk , yk ) + λ1 hfx (xk , yk )


+ µ1 hf (xk , yk )fy (xk , yk ) + O(h2 ).

将上式代入式 (4.13) 得

yk+1 = yk + c1 hf (xk , yk ) + c2 h [f (xk , yk )


¤
+λ1 hfx (xk , yk ) + µ1 hf (xk , yk )fy (xk , yk ) + O(h2 )
= yk +(c1 +c2 )hf (xk , yk )+c2 h2 [λ1 fx (xk , yk )+µ1 f (xk , yk )fy (xk , yk )]+O(h3 ).
(4.14)
若局部假定 y(xk ) = yk , 当要求差分格式 (4.13) 是二阶的方法时, 则式 (4.12)
与式 (4.14) 关于 h 的一、二次幂的系数必须相等. 比较式 (4.12) 与式 (4.14) 可得


 c1 + c2 = 1,



 1
c2 λ1 = ,

 2


 c2 µ1 = 1 .

2
这样 4 个待定参数仅需满足 3 个方程, 故可以有 1 个自由参量. 因 3 个方程
中都含有 c2 , 为便于讨论, 取 c2 为自由参量 (非零), 于是
1
c1 = 1 − c, λ1 = µ1 = . (4.15)
2c
当 c2 取定一个实数时, 相应地有一组 c1 , λ1 , µ1 , 也就可以得到一种差分格式.
4.2 龙格–库塔 (Runge-Kutta) 法 · 95 ·

1 1
若取 c2 = , 则 c1 = , λ1 = µ1 = 1, 于是式 (4.13) 就可写为
2 2
h
yk+1 = yk + [f (xk , yk ) + f (xk + h, yk + hf (xk , yk ))] ,
2
这就是改进 Euler 公式.
1
取 c2 = 1, 则 c1 = 0, λ1 = µ1 = , 于是式 (4.13) 成为
2
µ ¶
h h
yk+1 = yk + hf xk + , yk + f (xk , yk ) ,
2 2
这就是变形 Euler 公式.
由式 (4.14) 可以看出, 满足式 (4.15) 的参数 c1 , c2 , λ1 , µ1 所产生的差分格式,
¡ ¢
其局部截断误差都为 O h3 , 即都是二阶方法, 统一称为二阶 Runge-Kutta 方法.
4.2.2 四阶 Runge-Kutta 方法
类似地, 我们可以更多地对 f (x, y) 的不同点的值进行组合. 若设差分格式为


 yk+1 = yk + c1 K1 + c2 K2 + c3 K3 + c4 K4 ,




 K1 = hf (xk , yk ),

K2 = hf (xk + λ1 h, yk + µ11 K1 ), (4.16)



 K3 = hf (xk + λ2 h, yk + µ21 K1 + µ22 K2 ),



 K = hf (x + λ h, y + µ K + µ K + µ K ),
4 k 3 k 31 1 32 2 33 3

其中, ci (i = 1, 2, 3, 4), λi (i = 1, 2, 3) 以及 µij (i = 1, 2, 3; j 6 i), 共 13 个待定未知


量. 和二阶 Runge-Kutta 法的讨论一样, 将差分格式 (4.16) 展开, 并与 y (x) 在点
xk 处的 Taylor 展开式 (令 x = xk+1 ) 比较, 当要求差分格式 (4.16) 是四阶方法时,
即关于 h 的各次幂 (直到 h4 ) 的系数须相等, 可得上述 13 个参数应满足的 11 个方
程, 此时可有两个自由参量, 取定两个自由参量值, 就得到相应的一组参数, 即得到
¡ ¢
不同的差分格式. 它们的局部截断误差都是 O h5 , 即都是四阶方法, 统一称为四
阶 Runge-Kutta 法.
目前工程中常用的是所谓标准的四阶 Runge-Kutta 公式

 h

 yk+1 = yk + (K1 + 2K2 + 2K3 + K4 ),

 6




 K1 = f (xk , yk ),




 µ ¶
h h (4.17)
 K2 = f xk + , yk + K1 ,

 2 2

 µ ¶

 h h

 K3 = f xk + , yk + K2 ,

 2 2




K4 = f (xk + h, yk + hK3 ).
· 96 · 第4章 常微分方程数值解法

值得指出的是:Runge-Kutta 方法的推导基于 Taylor 展开, 因而它要求所求


的初值问题的解具有较好的光滑性. 反之, 如果解的光滑性不太好时, 那么用四阶
Runge-Kutta 方法求得的数值解, 其精度可能反而不如改进的 Euler 方法. 因此,
实际计算时, 应针对具体问题选择合适的算法. 对于各阶的 Runge-Kutta 方法, 根
据其差分方程的形式, 再对照前面的基本概念, 可以看出 Runge-Kutta 方法仍是单
步法.
4.2.3 步长的选取
对某具体的一步计算而言, 步长越小, 局部截断误差就越小. 但随着步长的缩
小, 在同样的求解范围所要完成的步数必然增加, 而步数的增加不仅引起计算量的
增加, 且可能导致截断误差和舍入误差的积累. 因此与数值积分一样, 微分方程的
数值解法也有个步长选择问题.
步长选择的依据是:
(1) 所得结果应满足给定精度要求.
(2) 计算结果的精度衡量和检验.
解决的方法是采用结合误差估计的步长自动选择. 为了便于叙述, 以四阶 Runge-
Kutta 方法为例, 考虑从 (xk , yk ) 到 (xk+1 , yk+1 ) 的过程, 首先给定一个初始的步长
h, 由于四阶的 Runge-Kutta 的局部截断误差为
(h)
y(xk+1 ) − yk+1 = Ch5 .
h
然后, 将步长折半为 , 则从 xk 到 xk+1 需要经过两步才能完成, 则有
2
h µ ¶5 µ ¶5
(2) h h
y(xk+1 ) − yk+1 = C1 + C2 .
2 2
若假定 C ≈ C1 ≈ C2 , 则近似有
(h)
y(xk+1 ) − yk+1
h
≈ 16,
(2)
y(xk+1 ) − yk+1

即 · h ¸ h
(2) (2) (h)
15 y(xk+1 ) − yk+1 ≈ yk+1 − yk+1 ,

从而 · h ¸
h
( 2 ≈ ) 1 (2) (h)
y(xk+1 ) − yk+1 yk+1 − yk+1 .
15
¯ h ¯
¯ ( ) (h) ¯¯
¯ 2
记 ∆ = ¯yk+1 − yk+1 ¯, 这样我们可以通过检查步长折半前后两次计算所得的
4.3 单步法的收敛性和稳定性 · 97 ·

∆ 值确定所选步长是否合适.
具体运用时, 将分以下两种情况处理对于给定的精确要求 ε > 0:
(1) 如果 ∆ > ε, 则反复折半进行计算, 直到 ∆ < ε 为止, 此时取最终计算中的
步长为所需的步长.
(2) 如果 ∆ < ε, 则反复将步长加倍, 直到 ∆ > ε 为止, 此时前一次计算中的步
长就是所选择的步长.
这种通过加倍或折半处理步长的手段称为变步长方法.

4.3 单步法的收敛性和稳定性
4.3.1 单步法的收敛性
用差分方程的解 yk 作为初值问题的解 y(xk ) 的近似是数值解法的基本思想.
那么, 当所取步长 h 足够小时, 差分方程的解 yk 也能充分接近 y(xk ) 吗?
当然, 对于 xk = x0 + th, 这里的讨论不是对固定的 k, 否则当 h → 0 时,
xk → x0 , 显然这样的讨论无任何实际意义. 对此, 我们给出:
定义 4.1 若一种数值方法对任意固定的点 xk = x0 + th, 当 h → 0(同时
k → ∞) 时, 有 yk → y(xk ) 成立, 则该数值方法是收敛的.
先考察简单的初值问题 (
y 0 = λy,
(4.18)
y(0) = y0 ,
其准确解为 y = y0 eλx .
对式 (4.18), 若用 Euler 公式进行计算, 则

yk+1 = yk + hf (xk , yk ) = yk + hλyk = (1 + λh)yk , k = 0, 1, 2, · · · ,

于是
yk = y0 (1 + λh)k , k = 1, 2, · · · .
由于 x0 = 0, 则 xk = kh, 故有
· ¸λxk
1
k
yk = y0 (1 + λh) = y0 (1 + λh) λh ,


1
(1 + λh) λh → e, h → 0,
所以, 当 k → ∞ 时, 有
yk → y0 eλxk = y(xk ).
因此差分方程的解 yk (h → 0) 确实能收敛到原初值问题的解.
· 98 · 第4章 常微分方程数值解法

下面考察一般单步法的收敛性. 所谓单步法就是计算 yk+1 时只要用到前一步


yk 的信息即可. 而显格式单步法的特征是:

yk+1 = yk + hϕ(xk, yk, h), (4.19)

其中, ϕ(xk, yk, h) 称为增量函数. 比如:


(1) 对于 Euler 公式, ϕ(x, y, h) = f (x, y).
1
(2) 对于改进 Euler 公式, ϕ(x, y, h) = [f (x, y) + f (x + h, y + hf (x, y))].
2
对于单步法式 (4.19) 有如下收敛性结论.
定理 4.1 假设单步法式 (4.19) 具有 p 阶精度, 且增量函数 ϕ(x, y, h) 关于 y
满足 Lipschitz 条件:
|ϕ(x, ȳ, h) − ϕ(x, y, h)| 6 Lϕ |ȳ − y|. (4.20)

当初值 y0 精确时, 其整体的截断误差为


y(xk ) − yk = O(hp ). (4.21)

证明:设 ȳk+1 表示取 yk = y(xk ) 并用公式 (4.19) 求得的结果, 则


ȳk+1 = y(xk ) + hϕ(xk , y(xk ), h). (4.22)

由于所给方法有 p 阶精度, 则其局部截断误差为


y(xk+1 ) − ȳk+1 = O(hp+1 ),
即有常数 C, 使得
|y(xk+1 ) − ȳk+1 | 6 Chp+1 .

又由式 (4.19) 和 (4.22) 得

|ȳk+1 − yk+1 | = |y(xk ) − yk + h (ϕ(xk , y(xk ), h) − ϕ(xk , yk , h))|


6 |y(xk ) − yk | + h|(ϕ(xk , y(xk ), h) − ϕ(xk , xk , h)|.

利用假设条件式 (4.20) 得

|ȳk+1 − y(xk+1 )| 6 (1 + hLϕ )|y(xk ) − yk |.

从而

|y(xk+1 ) − yk+1 | = |y(xk+1 ) − ȳk+1 + ȳk+1 − yk+1 |


6 |ȳk+1 − yk+1 | + |y(xk+1 ) − ȳk+1 |
6 (1 + hLϕ )|y(xk ) − yk | + Chp+1 ,

即对整体截断误差 ek = y(xk ) − yk 有递推关系


4.3 单步法的收敛性和稳定性 · 99 ·

|ek+1 | 6 (1 + hLϕ ) |ek | + Chp+1 .

据此不等式反复递推, 整理可得
k Chp h k
i
|ek | 6 (1 + hLϕ ) |e0 | + (1 + hLϕ ) − 1 .

若当 xk − x0 = kh 6 M 时, 则有

(1 + hLϕ )k 6 ek(hLϕ ) 6 eM Lϕ .

所以
Chp M Lϕ
|ek | 6 |e0 |eM Lϕ + (e − 1),

即当初值准确时, 即 e0 = 0, 则式 (4.21) 成立. 证毕.
根据这一结论, 判断单步法式 (4.19) 的收敛性, 就归结为证其增量函数能否满
足 Lipschitz 条件式 (4.20).
对于 Euler 方法, 由于增量函数就是 f (x, y), 故当 f (x, y) 关于 y 满足 Lipschitz
条件时它是收敛的.
类似地, 在一定条件下, 改进 Euler 法以及 Runge-Kutta 方程也可分别进行
验证.
4.3.2 单步法的稳定性
定义 4.2 若一种数值方法在某节点值 yk 上的扰动为 δ, 而以后各节点的值
ym (m > k) 上产生的偏差均不超过 δ, 则称该方法是稳定的.
稳定性是比较复杂的问题, 这里仅考察下列简单的模型方程:

y 0 = λy.

基于对微分公式本身的稳定性, 假设 λ < 0.
1) 对于 Euler 公式的稳定性
对模型方程, 其 Euler 公式为

yk+1 = yk + hf (xk , yk ) = (1 + hλ)yk .

设 yk 有一扰动值为 εk , 因它的传播使 yk+1 产生的扰动为 εk+1 , 则有

yk+1 + εk+1 = (1 + hλ)(yk + εk ),


εk+1 = (1 + hλ)εk .

若要方程稳定, 则应有
· 100 · 第4章 常微分方程数值解法

|εk+1 | 6 |εk | ,

则应使
|1 + hλ| 6 1.

由于 λ < 0, 欲使上式成立, 则步长应满足


2
h6− .
λ
所以是条件稳定的, 其稳定条件为
2
h6− .
λ
2) 后退 Euler 公式的稳定性
由于模型方程的后退 Euler 公式为

yk+1 = yk + hλyk+1 ,

则有
1
yk+1 = yk .
1 − λh
类似地, 可得
1
εk+1 = εk .
1 − λh
由于 λ < 0, 故恒有 ¯ ¯
¯ 1 ¯
¯ ¯
¯ 1 − λh ¯ 6 1,

即恒有
|εk+1 | 6 |εk |.

因此后退 Euler 公式是恒稳定(或称为绝对稳定) 的.

4.4 线性多步法
上面我们通过对 f (x, y) 不同点的数值进行组合得到了高阶的公式 (Runge-
Kutta 公式), 但每一步都要对 f (x, y) 的不同点的函数值分别进行计算. 而在逐步
推进的求解过程中, 计算 yk+1 之前已经求出了一系列的近似值 y0 , y1 , · · · , yk , 并且
通常也已经对 f (x0 , y0 ), f (x1 , y1 ),· · · , f (xk , yk ) 进行过计算, 若能充分利用这些已
经计算过的 f (x, y) 的函数值, 即对这些已有的 f (x, y) 的函数值进行适当线性组合,
同样可期望得到阶数较高的差分格式, 这就是构造所谓多步法的基本思想.
一般的 m 步法公式具体形式如下:
4.4 线性多步法 · 101 ·

αm yk+m + αm−1 yk+m−1 + · · · + α0 yk = h(βm fk+m + · · · + β0 fk ), (4.23)

其中, fk+i = f (xk+i , yk+i ); αm 6= 0; |α0 | + |β0 | > 0. 即差分方程中关于 y 的下标


最大差为 m, 故称为 m 步法. 由于式 (4.23) 是将 y 和 f 的函数值线性组合而成的,
故又称为线性多步法.
构造线性多步法有多种途径, 这里仅讨论基于数值积分的构造方法.
4.4.1 Adams 显示公式

对初值问题 (4.1), 将方程 y 0 = f (x, y) 在区间 [xk , xk+1 ](k = 0, 1, 2, · · · ) 上积


分, 则有 Z xk+1
y(xk+1 ) − y(xk ) = f (x, y(x))dx, k = 0, 1, 2, · · · . (4.24)
xk

考虑 f (x, y(x)) 过点 (xk , fk ), (xk−1 , fk−1 ), · · · , (xk−r , fk−r ) 的插值多项式, 则经过


上述 r + 1 点可以构造一个 r 次的插值多项式 pr (x), 进而由 Newton 插值公式得

pr (x) = fk + f [xk , xk−1 ](x − xk ) + · · · + f [xk , xk−1 , · · · , xk−r ](x − xk ) · · · (x − xk−r+1 ).

注意到节点的两两等距以及差商和差分的联系, 并令 x = xk + th(t < 0), 则插值多


项式 pr (x) 可写成
t(t + 1) 2
pr (x) = pr (xk + th) = fk + t∆fk−1 + ∆ fk−2 + · · ·
2
t(t + 1) · · · (t + r − 1) r
+ ∆ fk−r
r!
r
X j
= (−1)j C−t ∆j fk−j , (4.25)
j=0

其中, ∆j 表示 j 阶向前差分; 而

j (−t)!
C−t = .
j!(−t − j)!
Z xk+1 Z xk+1
将 pr (x)dx 作为 f (x, y(x))dx 的近似值, 即得下列 Adams 显式公式:
xk xk
 
Z xk+1 Z 1 Xr
 j
yk+1 = yk + pr (x)dx = yk + h (−1)j C−t ∆j fk−j dt
xk 0 j=0
r
X
= yk + h bj ∆j fk−j , (4.26)
j=0

其中
· 102 · 第4章 常微分方程数值解法

Z 1
j
bj = (−1)j C−t dt, j = 0, 1, 2, · · · , r.
0

分别计算可得表 4-4.

表 4-4 Adams 显示公式各阶差分系数


j 0 1 2 3 4 ···
1 5 3 251
bj 1 ···
2 12 8 720

为便于实际使用, 利用差分展开式
j
X
∆j fk−j = (−1)i Cji fk−i ,
i=0

将式 (4.26) 中的各阶差分全部展开整理, 则式 (4.26) 可改写为


r
X
yk+1 = yk + h βri fk−i . (4.27)
i=0

这里的系数 βri 与 r 的定值有关, 其具体数值见表 4-5.

表 4-5 Adams 显示公式系数表


i 0 1 2 3 4 ···
β0r 1
2β1r 3 −1
12β2r 23 −16 5
24β3r 55 −59 37 −9
720β4r 1901 −2774 2616 −1274 251
.. .. .. .. .. .. ..
. . . . . . .

r = 0 时, 即为 Euler 公式.
r = 3 时, 则相应的差分格式为
h
yk+1 = yk +
(55fk − 59fk−1 + 37fk−2 − 9fk−3 ) . (4.28)
24
Z xk+1 Z xk+1
由于式 (4.27) 最初来自于 pr (x)dx 作为 f (x, y(x))dx 的近似值, 因此
xk xk

Adams 显式公式 (4.27) 的局部截断误差为


Z xk+1 Z xk+1
T = f (x, y(x))dx − pr (x)dx
xk xk
Z xk+1
f (r+1) (ξ)
= (x − xk ) · · · (x − xk−r )dx
xk (r + 1)!
4.4 线性多步法 · 103 ·

Z 1
f (r+1) (ξ)
= (th)[(t + 1)h] · · · [(t + r)h]hdt
0 (r + 1)!
Z 1
hr+2
= f (r+1) (ξ)t(t + 1) · · · (t + r)dt
(r + 1)! 0
= O(hr+2 ),

即 Adams 显式公式 (4.27) 是 r + 1 阶方法.


4.4.2 Adams 隐式公式

类似地, 如考虑 f (x, y(x)) 过点 (xk+1 , fk+1 ), (xk , fk ), · · · , (xk−r+1 , fk−r+1 ) 的


r 次插值多项式 p̃r (x), 同样以 p̃r (x) 作为 f (x, y(x)) 的近似值, 则由式 (4.24) 得
Adams 隐式公式
r
X
yk+1 = yk + h b̃j ∆j fk−j+1 , (4.29)
j=0

其中 Z 0
j
b̃j = (−1)j C−t dt, j = 0, 1, · · · .
−1

它的具体数值见表 4-6.

表 4-6 Adams 隐式公式各阶差分系数表


j 0 1 2 3 4 ···
1 1 1 19
b̃j 1 − − − − ···
2 12 24 720

作差分展开, 式 (4.29) 可改写为


r
X
yk+1 = yk + h β̃ir fk−i+1 , (4.30)
i=0

其中, 同样地, 系数 β̃ir 与 r 的定值有关, 见表 4-7.

表 4-7 Adams 隐式公式系数表


i 0 1 2 3 4 ···
β̃0r 1
2β̃1r 1 1
12β̃2r 5 8 −1
24β̃3r 9 19 −5 1
720β̃4r 251 646 −246 106 −19
.. .. .. .. .. ..
. . . . . .

选定 r, 则 β̃ir 随之确定, 即相应的 Adams 隐式公式也就确定了.


· 104 · 第4章 常微分方程数值解法

r = 0 时, 得后退 Euler 公式; 当 r = 1 时, 得梯形公式; r = 3 时, 则有


h
(9fk+1 + 19fk − 5fk−1 + fk−2 ).
yk+1 = yk + (4.31)
24
仿 Adams 显示公式的局部截断误差推导, 式 (4.31) 的局部截断误差为

T = O(hr+2 ),

即 Adams 隐式公式 (4.29) 也是 r + 1 阶方法. 可是 Adams 隐式公式 (4.27) 在计算


yk+1 时用到了前面 r + 1 步信息, 而 Adams 隐式公式 (4.29) 在计算 yk+1 时仅用
了前面 r 步的信息. 尽管式 (4.27) 和 (4.29) 都是 r + 1 阶的方法, 但是前者是 r + 1
步方法, 而后者是 r 步方法. 可见同样步数的情形下, 隐式的 Adams 公式比显式的
Adams 公式精度高.

4.4.3 Adams 预报-- 校正公式

对于 Adams 公式而言, 在同步数情形下, 虽然隐式公式比显式公式有更好的


精度, 但隐式公式使用不便, 形式上计算 yk+1 需要解方程. 因此在实际应用中, 总
(0)
是将两者联合起来使用:先利用显式公式先提供一个预报值 yk+1 , 然后用隐式公式
通过迭代手段不断对其进行校正. 这样联合起来使用, 就构成了 Adams 预报–校正
公式.
例如, 我们可用具四阶精度的显式公式 (4.28) 作为预报公式, 同样具四阶精度
的隐式公式 (4.31) 作为校正公式, 则可构成下列预报–校正公式:
预报
h
ỹk+1 = yk + (55fk + 59fk−1 + 37fk−2 − 9fk−3 ) ,
24
校正
h ³˜ ´
yk+1 = yk + fk+1 + 19fk − 5fk−1 + fk−2 , (4.32)
24
其中, f˜k+1 = f (xk+1 , ỹk+1 ); fi = f (xi , yi ); i = k, k − 1, k − 2, k − 3.
无论使用 Adams 显式公式还是隐式公式, 由于在计算 yk+1 的值时, 不仅用到
前一步 yk 的信息, 还需要用前面更多步的信息, 因此它不是自开始的. 实际计算
时, 必须借助某种单步法 (如 Runge-Kutta 法) 为它提供 “启动” 的必需信息.
例 4.2 用四阶 Adams 预报–校正公式 (4.32) 求解初值问题

 y 0 = y − 2x ,
y 0 < x < 1,

y(0) = 1,

取步长 h = 0.1, 结果保留 5 位有效数字, 并与准确值比较.


解:先用标准的四阶 Runge-Kutta 法求得的结果 y1 , y2 , y3 作为开始值, 然后启
动预报–校正公式进行计算. 计算结果如表 4-8 所示.
4.5 一阶方程组与高阶方程组的数值解法 · 105 ·

表 4-8 Adams 预报–校正公式计算结果与准确值比较


xk ỹk yk y(xk )
0 1 1
0.1 1.0954 1.0954
0.2 1.1382 1.1382
0.3 1.2649 1.2649
0.4 1.3415 1.3416 1.3416
0.5 1.4141 1.4142 1.4142
0.6 1.4832 1.4832 1.4832
0.7 1.5491 1.5492 1.5492
0.8 1.6125 1.6125 1.6125
0.9 1.6734 1.6734 1.6733
1.0 1.7321 1.7321 1.7321

表 4-8 中 ỹk 和 yk 分别为预报值和校正值, 准确值 y(xk ) 也保留了 5 位有效数字.

4.5 一阶方程组与高阶方程组的数值解法
4.5.1 一阶方程组
为了便于说明, 以两个方程为例, 考察初值问题
(
y 0 = f (x, y(x), z(x))
, y(a) = y0 , z(a) = z0 . (4.33)
z 0 = g(x, y(x), z(x))
初值问题式 (4.33) 的 Euler 公式为
yk+1 = yk + hf (xk , yk , zk ) = yk + hfk ,
(4.34)
zk+1 = zk + hg(xk , yk , zk ) = zk + hgk .
引进向量记号
à ! à ! à ! à !
y f yk fk
Y = , F = , Yk = , Fk = ,
z g zk gk
则初值问题式 (4.33) 可写成
(
Y 0 = F (x, Y ),
(4.35)
Y (a) = Y0 .

相应地, Euler 公式 (4.34) 为


Yk+1 = Yk + hFk , k = 0, 1, 2, · · · .
对初值问题式 (4.35) 的改进 Euler 公式、Runge-Kutta 公式、Adams 显 (隐)
式公式的讨论类同, 即只要把研究单个方程 y 0 = f 的数值方法中 y 和 f 理解为二
维向量即可. 而一般的 n 个方程的一阶方程组讨论又仅需把式 (4.35) 中二维向量
扩充到 n 维向量就可以了.
· 106 · 第4章 常微分方程数值解法

4.5.2 化高阶方程为一阶方程组
对于高阶微分方程的初值问题, 原则上总可以归结为一阶微分方程组进行求
解. 例如, 考察下列 n 阶微分方程:
y (n) = f (x, y, y 0 , · · · , y (n−1) ), (4.36)

初始条件为
(n−1)
y(a) = y0 , y 0 (a) = y00 , ··· , y (n−1) (a) = y0 . (4.37)

只要引进新的变量
y1 = y, y2 = y 0 , ··· , yn = y (n−1) ,

就可以将 n 阶方程式 (4.36) 转化为如下一阶微分方程组:




 y10 = y2 ,



 0
 y2 = y3 ,

······ (4.38)



 0
yn−1 = yn ,



 y 0 = f (x, y , y , · · · , y ).
n 1 2 n

相应的初始化条件为
(n−1)
y1 (a) = y0 , y2 (a) = y00 , ··· , yn (a) = y0 . (4.39)

这样对一阶微分方程组初值问题式 (4.38) 和 (4.39), 就可用上面讨论的数值方法


求解.

4.6 边值问题的差分解法
许多的数学物理问题可抽象为二阶常微分边值问题:

 00 0
 y + p(x)y + q(x)y = f (x),

y(a) = α, a < x < b. (4.40)


 y(b) = β,

下面我们将讨论边值问题式 (4.40) 的差分求解方法. 仿初值问题式 (4.1) 的讨


论, 我们可以采用离散化方法将边值问题式 (4.40) 转化为适当的差分方程.
b−a
为此, 现将区间 [a, b] 进 n 等分, 记 h = , 则等分节点为
n
xk = a + kh, k = 0, 1, · · · , n.

利用差商代替导数的思想, 取
4.6 边值问题的差分解法 · 107 ·

yk+1 − yk−1 yk+1 − 2yk + yk−1


y 0 (xk ) ≈ , y 00 (xk ) ≈ .
2h h2
代入式 (4.40), 于是边值问题相应的差分方程为
yk+1 − 2yk + yk−1 yk+1 − yk−1
+ pk + qk yk = fk , k = 1, 2, · · · , n − 1, (4.41)
h2 2h
其中
pk = p(xk ), qk = q(xk ), fk = f (xk ).

这 n − 1 个方程中含有 y(x) 在 n + 1 个节点的近似值 y0 , y1 , · · · , yn, 但注意到边界


条件为
y(a) = α = y0 , y(b) = β = yn .

整理可得关于特定的节点近似值 yk (k = 1, 2, · · · , n − 1) 构成的线性方程组

AY = b, (4.42)

其中

式 (4.42) 是一个三对角线性方程组, 可用“追赶法”(见 6.4 节) 进行求解, 即


得节点 x1 , x2 , · · · , xn−1 处 y(x) 的近似值 y1 , y2 , · · · , yn−1 .
例 4.3 用差分方法求解边值问题
(
y 00 − y = x, 0 < x < 1,
y(0) = 0, y(1) = 1,

在点 x = 0.1, 0.2, · · · , 0.9 的值, 结果保留到小数点后 5 位, 并与准确值进行比较.


k
解:根据题意取步长 h = 0.1, 节点为 xk = (k = 0, 1, 2, · · · , 10), 由于 p(x) =
10
0, q(x) = 1, f (x) = x, 则差分方程式 (4.42) 的具体形式为
· 108 · 第4章 常微分方程数值解法

    
−2 − 10−2 1 y1 0.001
    
 1 −2 − 10−2 1  y2   0.002 
    
 .. .. ..  ..  .. 
 . . .  .= . 
    
    
 1 −2 − 10−2 1  y8   0.008 
1 −2 − 10−2 y9 −0.991

具体计算结果和准确值 (保留 5 位小数) 的比较, 如表 4-9 所示.

表 4-9 差分方法计算结果与准确值比较
xk yk y(xk )
0.1 0.070 49 0.070 47
0.2 0.142 68 0.142 64
0.3 0.218 30 0.218 24
0.4 0.299 11 0.299 03
0.5 0.386 90 0.386 82
0.6 0.483 57 0.483 48
0.7 0.591 07 0.590 99
0.8 0.711 48 0.711 41
0.9 0.847 00 0.846 96

习 题 4
1. 对于初值问题 (
y 0 = ax + b,
y(0) = 0,
1 2
分别导出 Euler 公式和改进 Euler 公式的近似解答式, 并与准确解 y = ax + bx 相比较.
2
2. 用 Euler 公式求初值问题
(
y 0 = x + y,
0 6 x 6 1,
y(0) = 1,

的数值解 (取 h = 0.1, 结果保留 4 位有效数字), 并与准确解 y = −x − 1 + 2ex 相比较.


3. 导出中心 Euler 公式

yk+1 = yk−1 + 2hf (xk , yk ), k = 1, 2, · · · ,

的局部截断误差表达式, 并说明方法的阶.
4. 用改进 Euler 公式计算积分 Z x 2
et dt
0

在点 x = 0.2, 0.4, 0.6, 0.8, 1.0 的近似值, 结果保留 5 位有效数字.


习 题 4 · 109 ·

5. 用梯形公式解初值问题式 (
y 0 + y = 0,
y(0) = 1,
证明其近似解为 µ ¶k
2−h
yk = , k = 1, 2, · · · ,
2+h
并证明当 h → 0 时, 它收敛于原初值问题式的准确解 e−x .
6. 用标准的四阶 Runge-Kutta 公式求解下列初值问题式 (取步长 h = 0.2, 计算 3 步):
(
y 0 = y + x,
(1)
y(0) = 1.

 y 0 = y − 2x ,
(2) y
 y(0) = 1.

7. 当 f (x, y) 关于 y 满足 Lipschitz 条件时, 对于初值问题式


(
y 0 = f (x, y),
a < x < b (有限区间),
y(a) = y0 ,

验证改进 Euler 方法的收敛性.


8. 分别用二阶显示 Adams 方法和二阶隐式 Adams 方法解初值问题
(
y 0 = 1 − y,
y(0) = 0,

取 h = 0.2, y(0) = 0, y1 = 0.181. 并用 y5 与准确解相比较 (准确解为 y = 1 − e−x ).


9. 将下列方程化为一阶方程组:
(
y 00 − 3y 0 + 2y = 0,
(1)
y(0) = 1, y 0 (0) = 1.
(
y 00 − 0.1(1 − y 2 )y 0 + y = 0,
(2)
y(0) = 1, y 0 (0) = 0.
10. 取 h = 0.25, 用差分法解边值问题
(
y 00 + y = 0,
y(0) = 1, y(1) = 1.68.
第5章 非线性方程求根
正如绪论所述, 科学研究、工程计算以及生产生活中的许多问题常归结为求解
高次代数方程或超越方程, 由于这类方程都含有自变量的非线性项, 因此统称为非
线性方程. 例如:

x21 − 109x11 + x3 − x − 1 = 0 (高次代数方程),

ln x2 − 4x − xex − 1 = 0 (超越方程).
一方面由于非线性方程的求解比较困难, 另一方面在求解这类实际问题时, 人
们只需要获得满足一定精度的近似解就可以了, 所以研究求非线性方程近似解的数
值方法具有重要的现实意义.
绪论中介绍的二分法就是一种常用的求解上述非线性方程近似解的数值方法.
但该方法具有收敛速度慢、不能求偶数重根等不足. 本章将重点介绍求解非线性方
程近似解的基本理论和常用的数值方法.

5.1 迭 代 法
5.1.1 简单迭代法
考虑如下非线性方程:
f (x) = 0, (5.1)

其中, f (x) ∈ C [a, b], 且 f (x) 在 [a, b] 上存在实根. 若方程 (5.1) 可化为形如方程
(5.2) 的等价的不动点方程
x = ϕ(x), (5.2)

据此, 可以构造如下公式:
xk+1 = ϕ(xk ), k = 0, 1, 2, · · · . (5.3)

使用式 (5.3), 则对任意给定初值 x0 , 可得到数列


x0 , x1 , · · · , xk , · · · .
若该数列收敛到数 x∗ , 即
lim xk = x∗ ,
k→∞
则 x∗ 就有可能是非线性方程 (5.1) 的根. 事实上, 若上序列 {xk } 收敛于 x∗ , 则
5.1 迭 代 法 · 111 ·

lim xk+1 = x∗ ,
k→∞

且由函数 f (x) 的连续性知 ϕ (x) 也是连续函数, 于是有

lim xk+1 = lim ϕ(xk ) = ϕ( lim xk ) = ϕ(x∗ ),


k→∞ k→∞ k→∞


x∗ = ϕ(x∗ ).
进而
f (x∗ ) = 0.
当迭代达到一定次数时, 例如算到第 n 步得 xn , 则可以把 xn 作为方程根 x∗ 的近
似值. 一般我们称式 (5.3) 为求解非线性方程 (5.1) 的根 x∗ 的迭代格式, {xk } 称为
迭代序列, x0 为迭代初值, ϕ(x) 为迭代函数. 相应地, 上述求根方法称为简单迭代
法, 也称为逐次逼近法或Picard 迭代法. 且若迭代序列 {xk } 收敛到方程的根, 我
们称之为简单迭代法收敛或迭代格式收敛, 反之, 若迭代序列不收敛, 我们称迭代
格式发散.
现在的问题是:由方程得到的迭代格式是否一定收敛, 是否收敛于方程的根,
以及如何判断收敛性?我们看下面的例子.
例 5.1 求方程 x3 − x − 1 = 0 在区间 (1, 1.5) 上的一个根.
√ √
解:(1) 将方程化为等价方程 x = 3 x + 1, 即令迭代函数 ϕ (x) = 3 x + 1, 于是
可得如下迭代格式:

xk+1 = 3 xk + 1, k = 0, 1, 2, · · · .
以 x0 = 1 为初值, 可得如下近似解序列 (表 5-1):

表 5-1 迭代公式 xk+1 = 3
xk + 1 的近似解序列
迭代次数 1 2 3 4 5 ···
近似解 1.259 92 1.312 29 1.322 35 1.326 48 1.324 71 ···

看来序列可以收敛 (实际上, x∗ = 1.324 717 951 · · · ).


(2) 若将方程化为等价方程 x = x3 − 1, 于是可令 ϕ (x) = x3 − 1, 即可得如下
迭代法:
xk+1 = x3k − 1, k = 0, 1, 2, · · · .
给定初始值 x0 = 1, 则可得如下近似解序列 (表 5-2):

表 5-2 迭代公式 xk+1 = x3k − 1 的近似解序列


迭代次数 0 1 2 3 4 5 ···
近似解 1 0 −1 −2 −9 −730 ···
· 112 · 第5章 非线性方程求根

看来序列是发散的.
由例 5.1 中的 (1) 和 (2) 两种解法, 我们不难发现同一个方程得到的不同迭代
格式, 有的收敛, 有的发散. 那么, 迭代格式要满足什么条件才能使迭代格式收敛
呢?这正是我们下面要讨论的问题.

5.1.2 收敛性问题

假设非线性方程 f (x) = 0 可以等价地转换为方程 x = ϕ(x), 那么关于收敛性


有下面的结论.
定理 5.1 若 ϕ(x) 是 [a, b] 上的连续可微实函数, 且满足如下条件:
(1) 对 ∀x ∈ [a, b], ϕ(x) ∈ [a, b].
(2) 存在正实数 L < 1, 对 ∀x ∈ [a, b], 有 |ϕ0 (x)| 6 L < 1.
则可得如下结论:
(1) 方程在区间 [a, b] 上存在唯一的实根 x∗ .
(2) 对任何初值 x0 ∈ [a, b], 由格式 (5.3) 确定的迭代序列 {xk } 收敛于 x∗ .
证明:(1) 首先证存在性. 构造函数 g(x) = x − ϕ(x), 由已知条件 (1) 可得

g(a) = a − ϕ(a) 6 0,
g(b) = b − ϕ(b) > 0.

又由 ϕ(x) 是 [a, b] 上的连续可微函数, 知 g(x) = x − ϕ(x) 在 [a, b] 上连续, 故由连


续函数的介值定理知, 存在 x∗ ∈ [a, b], 使

g(x∗ ) = 0,


x∗ = ϕ(x∗ ) 或 f (x∗ ) = 0.

存在性得证.
再证唯一性. 用反证法, 设还有一根 x̃∗ , 使 x̃∗ = ϕ (x̃∗ ), 由微分中值定理知

|x∗ − x̃∗ | = |ϕ (x∗ ) − ϕ (x̃∗ )| = |ϕ0 (η)| · |x∗ − x̃∗ | 6 L |x∗ − x̃∗ | < |x∗ − x̃∗ | ,

矛盾 (其中, η 是介于 x∗ 和 x̃∗ 之间的实数), 故 x∗ ∈ [a, b] 是方程的唯一根.


(2) 迭代法的收敛性. 因为

|xk+1 − x∗ | = |ϕ (xk ) − ϕ (x∗ )| = |ϕ0 (η̃)| · |xk − x∗ | 6 L · |xk − x∗ | .

其中, η 是介于 x∗ 和 xk 之间的实数, 即

|xk+1 − x∗ | 6 L2 |xk−1 − x∗ | 6 · · · 6 Lk+1 |x0 − x∗ | → 0(h → 0).


5.1 迭 代 法 · 113 ·

从而
lim xk = x∗ ,
k→+∞

即迭代格式收敛到方程 (5.1) 的唯一实根.


定理 5.2 设方程 x = ϕ (x) 在 [a, b] 内有根 x∗ , 且当 x ∈ [a, b] 时, |ϕ0 (x)| > 1,
则对任意的初始值 x0 ∈ [a , b], 迭代格式 (5.3) 发散.
证明: ∀x0 ∈ [a , b] , 知

|x1 − x∗ | = | ϕ(x0 ) − ϕ(x∗ ) | > | x0 − x∗ |.

若 x1 ∈ [a, b], 则

|x2 − x∗ | = |ϕ(x1 ) − ϕ(x∗ )| > |x1 − x∗ | > |x0 − x∗ |.

如此继续下去, 或者 xk ∈ / [a, b], 或者 |xk − x∗ | > |xk−1 − x∗ | > |x0 − x∗ |, 因此迭代


格式 (5.3) 发散.
下面我们利用定理 5.1 去考察例 5.1 中简单迭代法的收敛性.
例 5.2 将方程 x3 − x − 1 = 0 化为如下两个等价的方程:

(1) x = 3 x + 1.
(2) x = x3 − 1.
试考察它们相应的迭代格式的收敛性.

解:(1) 由已知, 得 ϕ(x) = 3 x + 1. 显然有:
① 对 ∀x ∈ [1, 1.5], ϕ (x) ∈ [1, 1.5].
¯ ¯
¯1 1 ¯ 1
② |ϕ0 (x)| = ¯¯ ¯ 6 < 1, x ∈ [1, 1.5].
3 (x + 1) ¯ 3
2/3

由定理 5.1, 对任何初值 x0 ∈ [1, 1.5], 迭代格式



3
xk+1 = xk + 1, k = 0, 1, 2, · · · ,

收敛于方程的根 x∗ .
(2) 由已知得 ϕ(x) = x3 − 1, 显然 |ϕ0 (x)| = 3x2 > 3 > 1, 由定理 5.2 知, 迭代格
式发散.
注:(1) 从上面的例题可以看出, 要证明一个简单迭代法收敛, 只要证明简单迭
代法的迭代函数满足定理 5.1 中的条件即可.
(2) 但是如果要证明一个迭代法发散, 只是由迭代函数不满足定理 5.1 还不足
以说明迭代法是发散的, 还需要另外用定理 5.2 证明.
(3) 定理 5.1 中的条件 (2) 可以用如下条件代替:
· 114 · 第5章 非线性方程求根

(20 ) 存在正实数 L < 1, 使 ∀x, y ∈ [a, b], 有

|ϕ (x) − ϕ (y)| 6 L |x − y| . (5.4)

式 (5.4) 称为 Lipschitz 条件.


事实上, 简单迭代法及其收敛判定定理 (定理 5.1) 有着明显的几何意义.
首先, 方程 x = g (x) 的求根问题在 xOy 平面上就是要确定曲线 y = ϕ (x)
与直线 y = x 的交点的横坐标 x∗ (如图 5-1 和图 5-2 所示). 对于 x∗ 的某个近似
值 x0 , 在曲线 y = ϕ (x) 上可能确定一点 P0 , 它以 x0 为横坐标, 而纵坐标则等于
x1 = g (x0 ). 过 P0 引平行 x 轴的直线, 设交直线 y = x 于点 Q1 , 然后过 Q1 再
作平行于 y 轴的直线, 它与曲线 y = ϕ (x) 的交点记作 P1 , 则点的横坐标为 x1 , 纵
坐标则等于 x2 = g (x1 ), 按图 5-1 和图 5-2 中箭头所示的路径继续作下去, 在曲线
y = ϕ (x) 上得到点列 P1 , P2 , · · · , 其横坐标分别为按公式 yk+1 = ϕ (xk ) 求得的迭
代值 x1 , x2 , · · · . 如果点列 {Pk } 趋向于点 P ∗ , 则相应的迭代值序列 {xk } 收敛到所
求的根 x∗ .

图 5-1 迭代公式收敛的情况 1 和情况 2

图 5-2 迭代格式发散的情况
5.1 迭 代 法 · 115 ·

其次, 由图 5-1(1) 和 (2) 我们看到 y = ϕ (x) 在根 x∗ 附近的斜率满足

|ϕ0 (x)| 6 L < 1.

从 P0 点出发经 P1 , P2 , · · · 逐渐趋向于 P ∗ , 对应的 x0 , x1 , x2 , · · · 趋向于 x∗ , 可以看


出 {xk } 收敛于方程的解 x∗ .
而由图 5-2 我们发现, P0 处 |ϕ0 (x0 )| > 1, 从而, 从 P0 点出发经 P1 , P2 , · · · 逐
渐远离 P ∗ , 对应的 x0 , x1 , x2 , · · · 逐渐远离 x∗ , 可以看出 {xk } 发散.
对于大范围的有根区间, 定理 5.1 中的条件 (1) 不易验证或者不能在整个区间
[a, b] 上满足. 在实际应用迭代法时, 通常在根 x∗ 的临近考虑, 即是所谓的局部收
敛性问题.
定理 5.3 设 x∗ 为方程 x = ϕ(x) 的根, ϕ0 (x) 在 x∗ 的临近连续, 且满足

|ϕ0 (x∗ )| < 1,

则迭代序列 xk+1 = ϕ(xk ) 在 x∗ 临近具有局部收敛性.


证明:由 ϕ0 (x) 的连续函数性知, 存在 x∗ 的某个领域 ∆:|x − x∗ | 6 δ, 对于任
意x∈∆有
|ϕ0 (x)| 6 L < 1, 对所有的 x ∈ ∆.

此外, 对于 ∀x ∈ ∆, 因为

|ϕ(x) − x∗ | = |ϕ(x) − ϕ(x∗ )| 6 L|x − x∗ | 6 |x − x∗ |,

故总有 ϕ(x) ∈ ∆.
于是由定理 5-1 得迭代序列 xk+1 = ϕ(xk ) 对所有初值 x0 ∈ ∆ 均收敛.
在实际应用中, 往往希望实现对迭代过程中得到的近似解 xk 进行估计, 以便
明确迭代过程终止的时刻. 为此, 我们给出如下的误差估计方法.
定理 5.4 在定理 5.1 的条件下, 有如下误差估计式:
L
(1) |x∗ − xk | 6 |xk − xk−1 |, k = 1, 2, · · · . (5.5)
1−L
Lk
(2) |x∗ − xk | 6 |x1 − x0 |, k = 1, 2, · · · . (5.6)
1−L
证明: (1) 证明公式 (5.5):
由定理 5.1 的条件 (2), ∃ηk 介于 xk 与 xk−1 之间, 使

|xk+1 − xk | = |ϕ(xk ) − ϕ(xk−1 )| = |ϕ0 (ηk )| · |xk − xk−1 | 6 L |xk − xk−1 | , (5.7)

所以

|xk − x∗ | = |xk+1 − x∗ + xk − xk+1 | 6 |xk+1 − x∗ | + |xk − xk+1 |


· 116 · 第5章 非线性方程求根

6 L |xk − x∗ | + |xk+1 − xk | .

将右边第一项移至左边, 有
1 L
|xk − x∗ | 6 |xk+1 − xk | 6 |xk − xk−1 | , k = 1, 2, · · · . (5.8)
1−L 1−L
(2) 证明公式 (5.6):
由式 (5.7) 和 (5.8) 知
L L2 Lk
|xk − x∗ | 6 |xk − xk−1 | 6 |xk−1 − xk−2 | 6 · · · 6 |x1 − x0 | ,
1−L 1−L 1−L
k = 1, 2, · · · .

注:(1) 式 (5.5) 称为迭代格式 (5.3) 的事后误差估计式, 我们可以用该式在迭


1
代过程中逐次估计绝对误差. 特别地, 当 L 6 时, |x∗ − xk | 6 |xk − xk−1 |. 在这
2
种情况下, 当迭代达到某一步, 相邻两次迭代结果的误差满足精度要求时, 即可终
1
止迭代, 取 xk 作为精确解 x∗ 满足精度的近似值. 当然 L > 时, 这种判断就不可
2
靠了.
(2) 式 (5.6) 称为迭代格式 (5.3) 的事先误差估计式, 根据该估计式可求得需要
迭代的步数. 例如, 若要求 |x∗ − xk | < ε, 则用式 (5.6) 可得到迭代次数 k 的值为
 
ε (1 − L)
ln
 |x1 − x0 | 
k= 
 + 1,

ln L

其中, x1 为由初值 x0 经第 1 次迭代得到的值, 符号 [·] 表示对括号内部的值取整.


5.1.3 迭代格式的收敛速度与加速
正如绪论中所提到的那样, 数值计算问题中, 只提供可行的求解算法是远远不
够的, 我们还应该考虑到迭代格式的计算速度. 对简单迭代法而言, 我们应该寻求
对已有方法的加速途径. 为此, 我们有必要先在收敛速度快慢问题上形成共识.
1. 迭代法的收敛速度

针对迭代格式 (5.3), 我们给出如下收敛性定义.


定义 5.1 设迭代序列 {xk } 收敛到方程的根 x∗ , 记 ek = xk − x∗ . 如果存在
非零常数 C 和正常数 p, 使
ek+1 xk+1 − x∗
p = p → C, k → +∞,
ek (xk − x∗ )

则称迭代序列 {xk } 具有 p阶收敛速度, 或称迭代格式 (5.3) 是 p阶收敛的.


5.1 迭 代 法 · 117 ·

特别地, 当 p = 1 且 0 < |C| < 1 时, 称迭代格式为线性收敛; 当 p > 1 时, 称迭


代格式为超线性收敛; 当 p = 2 时, 称迭代格式为平方收敛; 当 p = 3 时, 称迭代格
式为立方收敛等. 由定义我们不难看出, p 值越大, 收敛速度越快.
关于收敛阶数的判定问题, 我们有如下定理.
定理 5.5 设 x∗ 是方程 (5.1) 的实根, 且满足:
(1) 若在 x∗ 的某个邻域内有 |ϕ0 (x)| < 1, ϕ0 (x) 连续, ϕ0 (x∗ ) 6= 0, 则迭代格式
xk+1 = ϕ (xk ) 线性收敛.
(2) 若在 x∗ 的某个邻域内 p 阶连续导数 ϕ(p) (x), ϕ0 (x∗ ) = 0, · · · , ϕ(p−1) (x∗ ) =
ek+1 1 (p) ∗
0, ϕ(p) (x∗ ) 6= 0, 则迭代格式 xk+1 = ϕ (xk ) 是 p 阶收敛的, 且 lim p = ϕ (x ),
k→∞ ek p!
其中, p > 2.
证明:(1) 由定理 5.1 及定理 5.3, {xk } 收敛于方程 x = ϕ(x) 的根 x∗ , 且存在
数 ξk 介于 x∗ 与 xk 之间, 使

x∗ − xk+1 = ϕ0 (ξk ) (x∗ − xk ) .

考虑到 ϕ0 (x) 连续, xk → x∗ (k → +∞), 我们有


ek+1 xk+1 − x∗
= = ϕ0 (ξk ) → ϕ0 (x∗ ) , k → +∞,
ek xk − x∗
即迭代线性收敛.
(2) 将 xk+1 = ϕ (xk ) 展开成 x∗ 处的 Taylor 展式, 并应用已知条件 (2) 得

ϕ0 (x∗ ) ϕ(p−1) (x∗ )


xk+1 =ϕ(xk ) = ϕ(x∗ ) + (xk − x∗ ) + · · · + (xk − x∗ )p−1
1! (p − 1)!
ϕ(p) (x∗ + θ (xk − x∗ )) p
+ (xk − x∗ )
p!
ϕ(p) (x∗ + θ (xk − x∗ )) p
=x∗ + (xk − x∗ ) ,
p!
其中, 0 < θ < 1. 又 xk → x∗ (k → +∞),
ek+1 xk+1 − x∗ 1
lim p = lim = ϕ(p) (x∗ ),
k→∞ ek k→∞ (xk − x∗ )p p!

即迭代格式 xk+1 = ϕ (xk ) 是 p 阶收敛的, 且


ek+1 1
lim= ϕ(p) (x∗ ).
epk
k→∞ p!
µ ¶
1 9
例 5.3 对方程 x = x+ , x∗ = 3 为它的一个根, 在 x∗ 邻近, ϕ00 (x)
2 x
连续, 且
· 118 · 第5章 非线性方程求根

µ ¶
1 9
ϕ(x) = x+ ,
2 x
µ ¶¯
0 ∗ 1 9 ¯¯
ϕ (x ) = 1− 2 ¯ = 0,
2 x x=3
ϕ00 (x∗ ) 6= 0.
故 p = 2, 即迭代格式
µ ¶
1 9
xk+1 = xk + , k = 0, 1, 2, · · · ,
2 xk
平方收敛, 实际上, 经计算所得近似解序列如表 5-3 所示.

表 5-3 例 5.3 的近似解序列


迭代次数 0 1 2 3 ···
近似解 2.5 3.05 3.000 409 836 3.000 000 28 ···

仅需四步, 就使精度达到了 0.5 × 10−7 !

2. 加速方法

接下来讨论如何对迭代格式进行加速的问题. 对于一般的迭代格式, 由定理 5.3


可知, 当 L 接近 1 时, 迭代过程收敛很慢, 这就希望对通常已有的迭代格式进行加
速处理.
首先要介绍的加速方法的基本思想是:对方程 x = ϕ(x), 若 ϕ0 (x∗ ) 6= 0, 即迭
代格式最好的情况是线性收敛. 若我们能够直接构造出于 x = ϕ(x) 的等价方程
x = Φ(x), 且 Φ 0 (x∗ ) = 0, 则迭代格式可能平方收敛或更快.
为此, 我们将 x = ϕ(x) 化为

(1 + c) x = (1 + c) ϕ (x) , c 6= −1.

进而, 通过选择适当的 c, 可达到预期的加速迭代格式 (5.3). 由上式可得

x = ϕ (x) + c [ϕ (x) − x] = Φ (x) .

若令
Φ 0 (x∗ ) = {ϕ(x) + c[ϕ(x) − x]}0 |x=x∗ = 0,


ϕ0 (x∗ )
c= ,
1 − ϕ0 (x∗ )

ϕ0 (x∗ )
x = Φ(x) = ϕ(x) + [ϕ(x) − x].
1 − ϕ0 (x∗ )
5.2 牛顿 (Newton) 迭代法 · 119 ·

因为 Φ 0 (x∗ ) = 0, 故迭代格式
1
xk+1 = [ϕ(xk ) − ϕ0 (x∗ )xk ] (5.9)
1 − ϕ0 (x∗ )
至少平方收敛.
然而, 实际计算时, 由于式 (5.9) 中的 x∗ 未知, 故通常用 x∗ 的近似值代替, 例
如, 用 xk0 代替 x∗ , 可得到如下迭代格式:
1
xk+1 = [ϕ (xk ) − Lxk ] , (5.10)
1−L
其中, L = ϕ0 (xk0 ). 值得注意的是:作这样的处理后迭代速度将可能不是平方收
敛了.

例 5.4 求 x = 3 x + 1 在区间 [1, 1.5] 上的一个根.

解:取 xk0 = 1.3, 则由 ϕ(x) = 3 x + 1 得 L = ϕ0 (xk0 ) ≈ 0.19, 得迭代格式
1 ¡√ 3
¢
xk+1 = xk + 1 − 0.19xk .
0.81
经计算得表 5-4.

表 5-4 例 5.4 的结果


迭代次数 0 1 2 3 ···
近似解 1.5 1.323 714 578 1.324 717 989 1.324 717 957 ···

而 x∗ = 1.324 717 957 · · · .


值得说明的是:上述仅是加速方法的一种. 实际计算中还有其他行之有效的方
法. 例如艾特肯 (Aitken) 加速法, 其基本思想是:若方程的迭代格式为
xn+1 = g(xn ), n = 0, 1, 2, · · · , (5.11)

则构造新的迭代法:
xn g(g(xn )) − g 2 (xn )
xn+1 = , n = 0, 1, 2, · · · . (5.12)
g(g(xn )) − 2g(xn ) + xn
该方法能够将线性收敛的迭代法格式 (5.11) 的收敛的速度变为平方收敛, p 阶收敛
的迭代法变为 2p − 1 阶收敛, 甚至不收敛的迭代格式能变为收敛的. 读者可完成习
题 5 第 3 题.

5.2 牛顿 (Newton) 迭代法


5.2.1 Newton 迭代法

构造迭代法格式是一项具有技巧性的工作, 上一节我们主要立足于建立与原方
程 f (x) = 0 等价的不动点方程 x = ϕ (x), 从而得到迭代格式 xk+1 = ϕ (xk ), 但构
· 120 · 第5章 非线性方程求根

造出的迭代格式是否收敛、收敛速度是否快, 这就很不确定了. 本节中, 我们要介


绍的 Newton 迭代法是一个用近似线性方程代替原方程的构造方法. 从某种角度上
讲, 该方法具有一定的普适性, 是目前使用较广泛的一种迭代法.
对方程 f (x) = 0, 以 x0 为 x∗ 的初近似, 作 Taylor 展开, 得

f (x) = f (x0 ) + f 0 (x0 )(x − x0 ) + · · · = 0,

在上式中, 略去含有二阶及以上导数的各项, 从而得到方程 f (x) = 0 的近似方程:

f (x0 ) + f 0 (x0 )(x − x0 ) = 0. (5.13)

若 f 0 (x0 ) 6= 0, 则从方程 (5.13) 中可求出方程 f (x) = 0 的近似解为


f (x0 )
x1 = x0 − .
f 0 (x0 )

由于方程 (5.13) 是原方程 f (x) = 0 的近似方程, 故可认为 x1 是原方程的近似解,


它有可能较 x0 更接近原方程的解 x∗ . 为了得到较精确的解, 我们不妨再以 x1 为
x∗ 的初近似, 作 Taylor 展开, 进而得到可能更为精确的近似解

f (x1 )
x2 = x1 − .
f 0 (x1 )

如此继续下去, 在 xk 处有近似方程

p (x) = f (xk ) + f 0 (xk ) (x − xk ) = 0, (5.14)

解近似方程 (5.14) 得到 f (x) = 0 的更为近似的解, 即得到如下近似解数列:


f (xk )
xk+1 = xk − , k = 0, 1, 2, · · · . (5.15)
f 0 (xk )

式 (5.15) 即为求 f (x) = 0 的解的 Newton 迭代格式, 由此确定的迭代方法称为


Newton 迭代法, 简称 Newton 法.
我们看到, Newton 法是一种逐步线性化的方法, 它的基本思想是将非线性方
程 f (x) = 0 的求解问题归结为计算一系列线性方程 p(x) = 0 的根.
Newton 法的几何解释是:方程 f (x) = 0 的根 x∗ 在集合上解释为曲线与 x 轴
的交点的横坐标. 设 xk 是根 x∗ 的某个近似值, 过曲线 y = f (x) 上横坐标为 xk 的
点 Pk 引切线, 设该切线与 x 轴的交点的横坐标为 xk+1 (如图 5-3 所示), 则这样获
得的 xk+1 即为按 Newton 法求得的近似值. 由于这种几何背景, Newton 法亦称切
线法或 Newton 切线法.
5.2 牛顿 (Newton) 迭代法 · 121 ·

图 5-3 Newton 法

5.2.2 局部收敛性
f (x) f (x)f 00 (x)
对于 Newton 迭代法, 其迭代函数为 ϕ(x) = x− 0
, 从而 ϕ0 (x) = .
f (x) [f 0 (x)]2
当 x∗ 是 f (x) 的单根时, 即有 f (x∗ ) = 0, f 0 (x∗ ) 6= 0, 则由上式知 ϕ0 (x∗ ) = 0, 从而
由定理 5.5 不难判定:当 x∗ 是方程的单根时, Newton 法具有局部平方收敛速度.
例 5.5 设 c > 0, 试用 Newton 法解二次方程 x2 − c = 0, 从而导出不用开方

而直接计算 c 的算法.
解:令原方程为 f (x) = x2 − c = 0, 则 f (xk ) = x2k − c, f 0 (xk ) = 2xk , 于是求

c 的 Newton 法迭代格式为
x2k − c
xk+1 = xk − , k = 0, 1, · · · ,
2xk
即 µ ¶
1 c
xk+1 = xk + , k = 0, 1, · · · .
2 xk
与例 5.3 比较, 即为 c = 9 的情形. 我们在例 5.3 中已经发现, 它具有非常快的收敛
速度.
以上我们假设 x∗ 是 f (x) = 0 的单根, 当 x∗ 是 m(> 2) 重根时, 即
f (x) = (x − x∗ )m g(x),
其中, g(x∗ ) 6= 0. 则可以证明, 下列迭代格式至少具有二阶收敛速度:
f (xk )
xk+1 = xk − m , k = 0, 1, · · · .
f 0 (xk )
关于至少二阶收敛的证明留给读者 (习题 5 第 6 题).
由于 Newton 法的局部收敛性, 它对初值要求较高. 只有初值 x0 选得充分靠

近 x , 才能保证序列收敛. 为了保证非局部收敛, 必须再增加一些条件. 我们有:
· 122 · 第5章 非线性方程求根

定理 5.6 设 f (x) 在有限区间 [a, b] 上二阶导数存在, 且满足:


(1) f (a)f (b) < 0.
(2) f 0 (x) 6= 0, x ∈ [a, b].
(3) f 00 (x) 不变号, x ∈ [a, b].
(4) 初值 x0 ∈ [a, b], 使 f 00 (x0 )f (x0 ) > 0.
则 Newton 迭代序列 {xk } 收敛于 f (x) = 0 在区间 [a, b] 内的唯一根.
对此定理我们不作分析证明, 只给出它的几何解释:条件 (1) 保证根的存在;
条件 (2) 表示函数单调, 所以根唯一; 条件 (3) 保证曲线的凹向不变; 条件 (4) 保
证 x ∈ [a, b] 时, 迭代函数 ϕ(x) ∈ [a, b], 即第一步迭代得到的近似值不能超出区间
[a, b].

5.2.3 Newton 下山法

在 Newton 迭代法中, 若函数较复杂, 初值的选取较困难, 可改用迭代式


f (xk )
xk+1 = xk − λ 0 , (5.16)
f (xk )
从而扩大初值的选取范围. 其中, λ 为待定参数, 它的选取应使
|f (xk+1 )| < |f (xk )| .
当 |f (xk+1 )| 或 |xk+1 − xk | 小于事先给定的小正数 ε(事先给定的允许误差上限) 时,
停止迭代, 并取 x∗ ≈ xk+1 , 否则减小 λ, 继续迭代. 式 (5.16) 称为 Newton 下山法,
λ 称为下山因子, 常以 λ = 1 作为开始时的取值.
作为习题, 请读者给出牛顿下山法的计算步骤 (习题 5 第 5 题).
5.2.4 解非线性方程组的 Newton 迭代法
非线性方程组的一般形式是


 f1 (x1 , x2 , · · · , xn ) = 0,


 f (x , x , · · · , x ) = 0,
2 1 2 n
(5.17)

 ······



fn (x1 , x2 , · · · , xn ) = 0,
其中, fi (x1 , x2 , · · · , xn )(i = 1, 2, · · · , n) 是未知实变量 x1 , x2 , · · · , xn 的非线性实函
数. 一般需要求方程组 (5.17) 在指定范围的一组解 x∗i (i = 1, 2, · · · , n).
为便于叙述, 仅以二元非线性方程组
(
f1 (x, y) = 0,
(5.18)
f2 (x, y) = 0,
为例来介绍其解法. 其中, fi (x, y) (i = 1, 2) 是未知实变量 x, y 的非线性实函数. 对
于更多元的情形, 方法是不难类推的.
5.2 牛顿 (Newton) 迭代法 · 123 ·

5.2.1 节中的求非线性方程的 Newton 迭代法可以推广到多元的情形, 即将多


元非线性方程组线性化, 从而构成一种迭代格式, 藉此迭代格式逐次逼近所求的解.
设式 (5.18) 中的 f1 (x, y) 和 f2 (x, y) 在其解 (x∗ , y ∗ ) 的某个邻域 ∆ 内, 具有关
于 x, y 的二阶连续偏导数, 且 Jacobi 行列式
¯ ¯
¯ ∂f1 (xk , yk ) ∂f1 (xk , yk ) ¯
¯ ¯
¯ ∂x ∂y ¯
Jk = ¯ ¯ ¯ 6= 0, (5.19)
∂f (x , y ) ∂f (x , y ) ¯
¯ 2 k k 2 k k ¯
¯ ¯
∂x ∂y
其中, (xk , yk ) ∈ ∆(k = 1, 2, · · · ). 将 f1 (x, y) 和 f2 (x, y) 在 (xk , yk ) 处按二元函数的
Taylor 公式展开, 并取其线性部分得

 ∂f1 (xk , yk ) ∂f1 (xk , yk )

 f1 (x, y) ≈ f1 (xk , yk ) + (x − xk ) + (y − yk ) ,
∂x ∂y
(5.20)

 ∂f (x , y ) ∂f (x , y )
 f2 (x, y) ≈ f2 (xk , yk ) + 2 k k (x − xk ) + 2 k k (y − yk ) .
∂x ∂y
在式 (5.20) 中令 f1 (x, y) = f2 (x, y) = 0, 并以 xk+1 , yk+1 分别代替式中的 x, y, 得到
关于 xk+1 , yk+1 的线性方程组:

 ∂f1 (xk , yk ) ∂f1 (xk , yk )

 (xk+1 − xk ) + (yk+1 − yk ) = −f1 (xk , yk ),
∂x ∂y
(5.21)

 ∂f2 (xk , yk ) ∂f2 (xk , yk )
 (xk+1 − xk ) + (yk+1 − yk ) = −f2 (xk , yk ).
∂x ∂y
由式 (5.21) 的系数行列式 Jk 6= 0, 故解之得
 ¯ ¯
 ¯ ∂f1 (xk , yk ) ¯

 ¯ f1 (xk , yk ) ¯

 1 ¯ ∂y ¯

 xk+1 = xk − ¯ ¯,

 Jk ¯¯ ∂f2 (xk , yk ) ¯

 ¯
¯ f2 (xk , yk ) ¯
¯ ∂y ¯ (5.22)

 ¯ ∂f 1 (xk , y k ) ¯

 ¯ f1 (xk , yk ) ¯

 1 ¯¯ ∂x ¯
¯.

 y = y −
Jk ¯¯ ∂f2 (xk , yk ) ¯
k+1 k

 ¯
 ¯ f2 (xk , yk ) ¯
∂x
只要初始值 (x0 , y0 ) 充分靠近 (x∗ , y ∗ ), 就可按式 (5.22) 迭代计算, 得到序列
(x1 , y1 ) , (x2 , y2 ) , · · · , 直到相邻两次近似值 (xk , yk ) 和 (xk+1 , yk+1 ) 满足条件:

max(δx , δy ) < ε (5.23)


 

 |xk+1 − xk |, |xk | < c, 
 |yk+1 − yk |, |yk | < c,
时为止, 其中, δx = |x − xk | ; δy = ;

 k+1 , |xk | > c,  |yk+1 − yk | , |y | > c,
 k
|xk | |yk |
· 124 · 第5章 非线性方程求根

而 ε 是允许误差; c 是取绝对误差或相对误差的控制数, 它可以根据具体问题的要


求而定.
在满足式 (5.19) 的条件下, 可以证明当初始值充分靠近 (x∗ , y ∗ ) 时, Newton 迭
代法格式 (5.23) 是二阶收敛的, 但若初值取不好, 迭代法很可能发散.

5.3 弦 截 法
5.3.1 单点弦截法
Newton 法的一个不足之处是需要计算导数值 f 0 (xk ), 而当 f (x) 比较复杂时
计算起来就比较麻烦. 此外, 由于要计算导函数 f 0 (xk ), 往往会影响运算速度. 当
f 0 (x) 在某些点不存在时, 还可能导致意外情况发生. 因此, 人们希望导出不含导函
数 f 0 (x) 的迭代公式. 很自然的一个想法就是用某个数值去近似代替 f 0 (xk ).
f (xk ) − f (x0 )
若用平均变化率 近似代替 f 0 (xk )(瞬时变化率), 则可得迭代格
xk − x0
式:
f (xk )
xk+1 = xk − (xk − x0 ), k = 0, 1, · · · . (5.24)
f (xk ) − f (x0 )

由式 (5.24) 进行迭代, 称为单点弦截法.


单点弦截法的几何解释如图 5-4 所示. 式 (5.24) 求得的 xk+1 实际上是弦 AB
与 x 轴交点的横坐标, 下一步再以点 (xk+1 , f (xk+1 )) 和 (x0 , f (x0 )) 作弦交 x 轴得
xk+2 , 依此类推, 每次作新的弦都以 (x0 , f (x0 )) 作为一个端点, 因只有一个端点不
断变换, 故名为单点弦截法.

图 5-4 单点弦截法的几何解释

由式 (5.24) 易知其迭代函数为
f (x)
ϕ(x) = x − (x − x0 ).
f (x) − f (x0 )
5.4 代数方程求根 · 125 ·

因 f (x∗ ) = 0, 故求导数得
¯ ¯ ¯ ¯
¯ f 0 (x∗ ) ∗ ¯ ¯ f 0 (x∗ ) ¯
0 ∗ ¯
|ϕ (x )| = ¯1 + ¯ ¯
(x − x0 )¯ = ¯1 − ¯.
f (x0 ) [f (x∗ ) − f (x0 )]/(x∗ − x0 ) ¯
f (x∗ ) − f (x0 )
当初值 x0 充分接近 x∗ 时, 很接近 f 0 (x∗ ), 且符号也相同, 所以
x∗ − x0
0 < |ϕ0 (x∗ )| < 1.

由 5.1 节中的定理 5.4 即知式 (5.24) 仅为线性收敛的.


5.3.2 双点弦截法
f (xk ) − f (xk−1 )
若用 来近似代替式 (5.15) 中的 f 0 (xk ), 就可以得到迭代公式:
xk − xk−1
f (xk )
xk+1 = xk − (xk − xk−1 ). (5.25)
f (xk ) − f (xk−1 )
由该公式 (5.25) 确定的迭代法称为双点弦截法.
双点弦截法的几何意义如图 5-5 所示. 它用弦 AB 与 x 轴交点的横坐标 xk+1
代替曲线 y = f (x) 与 x 轴交点的横坐标 x∗ 的近似值.

图 5-5 双点弦截法的几何解释

双点弦截法的收敛性与 Newton 迭代法一样, 即在根的某个邻域内, f (x) 有


直至二阶的连续导数, 且 f 0 (x) 6= 0 时, 具有局部收敛性, 同时在邻域内任何取
初值 x0 , x1 迭代均收敛. 可以证明, 双点弦截法具有超线性收敛速度, 收敛的阶
1 √
p = (1 + 5) ≈ 1.618(请读者自己证明).
2

5.4 代数方程求根
如果 f (x) 是多项式, 则特别地, f (x) = 0 称作代数方程. 前面介绍的方程求根
方法原则上也适用于解代数方程, 但由于多项式的特殊性, 我们可以针对其特点提
· 126 · 第5章 非线性方程求根

供另外一些有效的算法.
5.4.1 秦九韶算法
多项式的一个重要特点是求值方便. 设给定多项式

f (x) = a0 xn + a1 xn−1 + · · · + an−1 x + an ,

其中, 系数 ai (0 6 i 6 n) 均为实数. 用一次式 x − x0 除 f (x), 记商为 p(x), 余数显


然等于 f (x0 ), 即
f (x) = f (x0 ) + (x − x0 )p(x). (5.26)

接下来研究具体如何确定 p(x) 与 f (x0 ), 令

p(x) = b0 xn−1 + b1 xx−2 + · · · + bn−2 x + bn−1 ,

代入式 (5.26), 并比较两端同次幂的系数, 得




 a0 = b0 ,

ai = bi − x0 bi−1 , 1 6 i 6 n − 1,


 a = f (x ) − x b
n 0 0 n−1 ,

从而 

 b0 = a0 ,

bi = ai + x0 bi−1 , 1 6 i 6 n, (5.27)


 f (x ) = b .
0 n

式 (5.27) 就是计算函数值 f (x0 ) 的算法, 称为秦九韶算法 (这种算法是我国


宋代数学家秦九韶最先提出的, 外国文献中通常称这种算法为 Horner 算法, 其实
Horner 的工作比秦九韶晚了五六个世纪). 这种算法的优点是计算量小、结构紧凑、
容易编制计算程序.
进一步考察 f (x) 的 Taylor 展开式:
f 00 (x0 ) f (n) (x0 )
f (x) = f (x0 ) + f 0 (x0 )(x − x0 ) + (x − x0 ) + · · · + (x − x0 )n .
2! n!
将它表示为式 (5.26) 的形式, 则式中

f 00 (x0 ) f (n) (x0 )


p(x) = f 0 (x0 ) + (x − x0 ) + · · · + (x − x0 )n−1 .
2! n!
由此可见, 导数 f 0 (x0 ) 又可看做 p(x) 用因式 x − x0 相除得出的余数, 即

p(x) = f 0 (x0 ) + (x − x0 )q(x),

其中, q(x) 是 n − 2 次多项式. 设


5.4 代数方程求根 · 127 ·

q(x) = c0 xn−2 + c1 xn−3 + · · · + cn−3 x + c,

那么, 再用秦九韶算法, 可得求导数值 f 0 (x0 ) 的计算公式为




 c0 = b0 ,

ci = bi + x0 ci−1 , 1 6 i 6 n − 1, (5.28)


 f 0 (x ) = c
0 n−1 .

继续这一过程, 可以依次求出 f (x) 在点 x0 的各阶导数.


5.4.2 代数方程的 Newton 法
再就多项式方程

f (x) = a0 xn + a1 xn−1 + · · · + an−1 x + an = 0,

考察 Newton 公式
f (xk )
xk+1 = xk − , k = 0, 1, 2, · · · . (5.29)
f 0 (xk )

式 (5.29) 中的函数值 f (xk ) 和导数值 f 0 (xk ) 可根据式 (5.27) 和 (5.28) 求出, 即




 b0 = a0 ,

bi = ai + xk bi−1 , 1 6 i 6 n, (5.30)


 f (x ) = b ,
k n

且 

 c0 = b0 ,

ci = bi + xk ci−1 , 1 6 i 6 n − 1, (5.31)


 f 0 (x ) = c .
k n−1

5.4.3 劈因子法
如果能从多项式

f (x) = a0 xn + a1 xn−1 + · · · + an−1 x + an

中分离出一个二次因式
w∗ (x) = x2 + u∗ x + v ∗ ,

我们就能获得多项式方程 f (x) = 0 的两个实根或一对共轭复根.


劈因子法的基本思想是:从某个近似的二次因子 w(x) = x2 + ux + v 出发, 通
过某种迭代过程使之逐步逼近 w∗ (x) = x2 + u∗ x + v ∗ .
用二次式 w(x) 除 f (x), 记商为 p(x)(它是个 n − 2 次多项式), 余式为一次多项
式, 记为 r0 x + r1 , 即
· 128 · 第5章 非线性方程求根

f (x) = (x2 + ux + v)p(x) + r0 x + r1 , (5.32)

显然 r0 , r1 均为 u, v 的函数 (
r0 = r0 (u, v),
(5.33)
r1 = r1 (u, v).
如果 (r0 , r1 ) ≈ (0,0), 则 w (x) 就是满足精度的二次因子. 但遗憾的是, 一般情
况下, (r0 , r1 ) 6= (0, 0). 于是应该修正 u 和 v 使之分别变成 u + ∆u 和 v + ∆v, 并
满足 (
r0 (u + ∆u, v + ∆v) = 0,
(5.34)
r1 (u + ∆u, v + ∆v) = 0.
如果在上述方程组中求出 ∆u 和 ∆v, 则所求的二次因子变为

w∗ (x) = x2 + (u + ∆u) x + (v + ∆v) = x2 + u∗ x + v ∗ . (5.35)

因此, 问题转化为求解式 (5.25) 的未知量 ∆u 和 ∆v. 劈因子法的目的是:逐步修


改式 (5.33) 中 u, v 的值, 使余式系数 r0 , r1 变得很小.
下面给出劈因子法求解未知量 ∆u 和 ∆v 的步骤. 考察方程
(
r0 (u, v) = 0,
(5.36)
r1 (u, v) = 0,

这是关于 u, v 的非线性方程组, 设它有解 (u∗ , v ∗ ). 将 r0 (u∗ , v ∗ ) = 0 与 r1 (u∗ , v ∗ ) = 0


的左端在 (u, v) 处用二元函数的 Taylor 展开式展开到一阶导数项, 得


 ∂r0 ∗ ∂r0 ∗
 r0 + (u − u) + (v − v) ≈ 0,
∂u ∂v
(5.37)

 r1 + ∂r1 (u∗ − u) + ∂r1 (v ∗ − v) ≈ 0.

∂u ∂v
这样做实际上是运用 Newton 法的处理思想将非线性方程组 (5.36) 线性化, 归
结到求下列线性方程组:


 ∂r0 ∂r0
 r0 + ∆u + ∆v = 0,
∂u ∂v
(5.38)

 ∂r 1 ∂r 1
 r1 + ∆u + ∆v = 0.
∂u ∂v
从方程组 (5.38) 解出增量 ∆u, ∆v, 即可得到改进的二次因子式:

w(x) = x2 + (u + ∆u)x + v + ∆v. (5.39)

下面的问题是如何计算方程组 (5.38) 的各个系数.


5.4 代数方程求根 · 129 ·

(1) 第一步:计算 r0 和 r1 . 将

p(x) = b0 xn−2 + b1 xn−3 + · · · + bn−3 x + bn−2

代入式 (5.32), 并比较各次幂的系数, 易知




 a0 = b0 ,




 a1 = b1 + ub0 ,

ai = bi + ubi−1 + vbi−2 , 2 6 i 6 n − 2,



 an−1 = ubn−2 + vbn−3 + r0 ,



 a = vb
n n−2 + r1 ,

于是 r0 , r1 的计算公式为


 b0 = a0 ,




 b1 = a1 − ub0 ,

bi = ai − ubi−1 − vbi−2 , 2 6 i 6 n, (5.40)



 r0 = bn−1 ,



 r = b + ub
1 n n−1 .

∂r0 ∂r1
(2) 第二步:计算 , . 将式 (5.32) 关于 v 求导, 得
∂v ∂v
∂p
p(x) = −(x2 + ux + v) + s0 x + s1 , (5.41)
∂v
其中 

 ∂r0
 s0 = − ,
∂v
(5.42)

 s1 = − ∂r1 .

∂v
可见, 用 x2 + ux + v 除 p(x), 作为余式可以得到 s0 x + s1 . 由于 p(x) 是 n − 2 次多
∂p
项式, 其中, 商 是 n − 4 次多项式, 记
∂v
∂p
= −(c0 xn−4 + c1 xn−5 + · · · + cn−5 x + cn−4 ),
∂v
则相当于式 (5.40), 这里有


 c0 = b0 ,




 c1 = b1 − ub0 ,

ci = bi − uci−1 − vci−2 , 2 6 i 6 n − 2,



 s0 = cn−3 ,



 s =c
1 n−2 + ucn−3 .
· 130 · 第5章 非线性方程求根

∂r0 ∂r1
(3) 第三步:计算 , . 再将式 (5.32) 关于 u 求导, 得
∂u ∂u

∂p ∂r0 ∂r1
xp(x) = −(x2 + ux + v) − x− .
∂u ∂u ∂u
另外, 由式 (5.41) 得

∂p
xp(x) = −(x2 + ux + v)x + (s0 x + s1 )x
µ ∂v ¶
∂p
= −(x + ux + v) x − s0 − (us0 − s1 )x − vs0 .
∂v

比较上面两个式子知 

 ∂r0
 = us0 − s1 ,
∂u
 ∂r1

 = vs0 .
∂v

习 题 5
1. 用简单迭代法求解方程 x = e−x 在 x = 0.5 附近的一个根. 要求事先确定有根区间并
判断迭代格式的收敛性, 误差上限 ε = 10−5 .
2. 分别用简单迭代法和加速后的迭代法计算方程 x = lg(x + 2) 在 x = 0.5 附近的近似
根, 要求 |x∗ − xk | < 10−4 , 并比较收敛的快慢.
3. 利用简单迭代法的艾特肯 (Aitken) 加速方法, 求解方程 x = x3 − 1, 要求 |x∗ − xk | <
10−4 .
4. 用简单迭代法求解下列方程的根, 并验证收敛性, 结果精确至 4 位有效数字:
(1) x5 − x − 1 = 0. (2) ex = 8x.
(3) 12 − 3x = tan x. (4) e2x − 5x2 + 2 = 0.
5. 设 x∗ 是 f (x) = 0 在区间 [a, b] 上的根, x ∈ [a, b] 是 x∗ 的近似值, 且
¯ ¯
m = min ¯f 0 (x)¯ 6= 0,
x∈[a,b]

|f (xk )|
证明 |xk − x∗ | 6 .
m
6. 如果 x∗ 满足 x∗ = ϕ (x∗ ), 则称 x∗ 为 ϕ (x) 的不动点. 设 x∗ 是 ϕ (x) 在区间 [a, b] 上
的不动点, 且对任意 x ∈ [a, b] 有 0 6 ϕ (x) 6 1, 试证:对任意 x ∈ [a, b] 有 ϕ (x) ∈ [a, b].
7. 用 Newton 法解方程 xex − 1 = 0, 并与第 1 题中的方法比较哪种方法收敛速度更快.
8. 构造求解方程 x2 + 2x − 3 = 0 的 Newton 迭代格式, 并证明:
(1) 当 x0 ∈ (−∞, −1) 时, lim xk = −3.
k→∞
(2) 当 x0 ∈ (−1, +∞) 时, lim xk = 1.
k→∞
习 题 5 · 131 ·

1
9. 试列出 Newton 下山法的计算步骤, 并取初值 x0 = 0.6, λ = , 求 x3 − x − 1 = 0 在
32
x = 1.5 附近的一个根.
10. 设 x∗ 是方程 f (x) = 0 的 m(m > 2) 重根, 即 f (x) = (x−x∗ )m g(x), 其中, g(x∗ ) 6= 0,
证明 Newton 法线性收敛, 并证明改进的 Newton 法:
f (xk )
xk+1 = xk − m
f 0 (xk )

至少平方收敛.
11. 对方程 f (x) = 0, 若 f (x) 在 x∗ 的某邻域内二阶可微, 且在该邻域内 f 0 (x) 6= 0, 取该

1+ 5
邻域内的 x0 , x1 为初值. 证明:当该邻域充分小时, 双点弦截法将按 p = 收敛到根 x∗ .
2
12. 用双点弦截法求方程 x3 − x − 1 = 0 在 x = 1.5 附近的根, 使绝对误差精确到 10−4 ,
并与 Newton 法比较哪种方法收敛性更好, 哪种方法收敛速度更快.

13. 证明例 5.5 中的 Newton 迭代法的收敛性, 并用该方法计算 135.607, 结果精确到 6
位有效数字.
14. 用解非线性方程组的 Newton 迭代法, 求方程组
(
f1 (x, y) = x2 + y 2 − 1 = 0,
f2 (x, y) = x3 − y = 0,

在 (0.8, 0.6) 附近的根 (作 3 次迭代).


15. 用劈因子法求方程 f (x) = x4 + x3 + 5x2 + 4x + 4 = 0 的一对复根.
16. 用劈因子法求方程 f (x) = x4 − 3x3 + 20x2 + 44x + 54 = 0 的一对复根, 初值由
x0 = 2.5 + 4.5i 确定.
第6章 线性方程组的直接解法

6.1 引 言
前述各章的若干问题, 无论是插值公式 (包括样条插值) 的建立, 还是微分方程
的差分格式的构造, 都包含着将原问题转化为代数问题的思想, 即常将问题归结为
求解线性代数方程组. 而事实上, 这仅仅是线性代数方程组求解应用的一个方面.
几乎所有科学与工程实际问题都或多或少地涉及应用的问题, 例如建筑结构设计问
题、计算机网络问题、计算机辅助设计问题、实验数据的曲线拟合问题、管理科学
中的规划问题等. 可见, 线性代数方程组的求解不仅在计算方法课程中, 而且在科
学与工程领域中都占有极其重要的地位.
在线性代数和高等数学中, 我们已熟悉了解线性代数方程组的克拉默 (Cramer)
法则. 但是该方法的计算速度实在是太慢, 以至于当方程组阶数较高 (CT 的图像
重建时常要解成百上千阶的方程组) 时, 用其求解线性代数方程组几乎是不可能的.
事实上, 要求解 n 阶的方程组, 依 Cramer 法则要计算 n + 1 个行列式, 而每个行列
式包含 n! 个乘积的值, 其中, 每个乘积需作 n − 1 次乘法. 若不考虑其他运算, 仅
这些计算就需
N = n!(n + 1)(n − 1)
次乘法运算. 不要说成百上千阶的方程, 即便是 20 阶的方程, 当 n = 20 时, N ≈
9.7 × 1020 , 若在每秒可进行 1 亿次乘法运算的计算机上运算, 至少需三十多万年!
总之, 寻求解线性代数方程组的快速而有效的算法是十分重要的. 本章及下章
我们主要介绍有关的直接法和迭代法.
(1) 直接法:在不考虑舍入误差的情况下, 通过有限步四则运算可求得准确解
的方法. 上面提到的 Cramer 法则就是一种直接法, 只不过它中看不中用. 本章主
要介绍计算机上常用而有效的 Gauss 消去法及其相关算法、有关矩阵分解和求矩
阵逆等问题.
(2) 迭代法:用某种极限过程去逐步逼近方程组的精确解的方法. 其有关思想
类似于第 5 章求解非线性方程中的基本思想. 迭代法具有占用计算机内存少、程序
设计简单等优点, 但存在着收敛性、收敛速度等问题.

6.2 高斯 (Gauss) 消去法


在介绍 Gauss 消去法之前, 我们先来求解两种比较特殊的方程组.
6.2 高斯 (Gauss) 消去法 · 133 ·

6.2.1 系数矩阵为三角形的方程组

设有系数矩阵为上三角形的方程组:


 u11 x1 + u12 x2 + · · · + u1,n−1 xn−1 + u1n xn = b1 ,




 u22 x2 + · · · + u2,n−1 xn−1 + u2n xn
 = b2 ,
······ (6.1)



 un−1,n−1 xn−1 + un−1,n xn = bn−1 ,



 u x
nn n = bn ,

且 uii 6= 0(i = 1, 2, · · · , n), 则自下而上可得方程的解为




 xn = bn /unn ,



 xn−1 = (bn−1 − un−1,n xn )/un−1,n−1 ,



 ······

 xi = (bi − ui,i+1 xi+1 − · · · − ui,n xn )/uii ,





 ······


x1 = (b1 − u12 x2 − u13 x3 − · · · − u1n xn )/u11 ,

记为 Ã !
n
X
xi = bi − uik xk /uii , i = n, n − 1, · · · , 1, (6.2)
k=i+1

n
X
这里约定 · = 0.
k=n+1
同样, 对系数矩阵为下三角形的方程组:


 l11 x1 = b1 ,


 l x +l x = b2 ,
21 1 22 2
(6.3)

 ······



ln1 x1 + ln2 x2 + · · · + lnn xn = bn ,

且 lii 6= 0(i = 1, 2, · · · , n), 可得它的解为


à i−1
!
X
xi = bi − lik xk /lii , i = 1, 2, · · · , n, (6.4)
k=1

0
X
这里约定 · = 0.
k=1
· 134 · 第6章 线性方程组的直接解法

6.2.2 Gauss 消去法

对一般的线性代数方程组


 a11 x1 + a12 x2 + · · · + a1n xn = b1 ,


 a x + a x + ··· + a x = b ,
21 1 22 2 2n n 2
(6.5)

 ······



an1 x1 + an2 x2 + · · · + ann xn = bn ,

或写成矩阵形式
Ax = b,

其中
     
a11 a12 ··· a1n x1 b1
     
 a21 a22 ··· a2n   x2   b2 
     
A= .. .. .. , x= .. , b= .. .
 . . .   .   . 
     
an1 an2 ··· ann xn bn

若 A 为非奇异矩阵, 则方程组 (6.5) 存在唯一解. 若对此方程组进行初等变换,


将其变成如式 (6.1) 的上三角方程组或如式 (6.3) 的下三角方程组, 则对其求解将变
得非常方便. 如何将形如式 (6.5) 的方程经过初等变换而消去方程中的部分项, 从
而成为式 (6.1) 和 (6.3) 形式的等价方程组, 便成了所谓的消去法所关心的问题.
我们先通过一个例子来认识消去法的基本思想.
例 6.1 将方程组


 7x1 + 8x2 + 11x3 = −3, ①

5x1 + x2 − 3x3 = −4, ②


 x + 2x + 3x = 1, ③
1 2 3

等价地化为上三角形方程组, 进而求得方程的解.
解:消元步骤如下: µ ¶
5
第 1 步, 消去方程组 ②, ③ 中的 x1 . 将方程 ① × − 加到方程 ② 中, 方
7
µ ¶
1
程 ①× − 加到方程 ③ 中, 得等价方程
7


 7x1 + 8x2 + 11x3 = −3, ①


 33 76 13 0
− x2 − x3 = − , ②

 7 7 7


 6 x + 10 x = 10 . ③
0
2 3
7 7 7
6.2 高斯 (Gauss) 消去法 · 135 ·

· µ ¶Áµ ¶¸
6 33
0 0
第 2 步, 消去方程 ③ 中的 x2 . 将 ② × − − 加到方程 ③0 中,
7 7
得等价方程 

 7x1 + 8x2 + 11x3 = −3, ①


 33 76 13 0
− x2 − x3 = − , ②

 7 7 7


 − 6 x = 12 . ③
00
3
11 11
逐次由 ③00 , ②0 , ① 可求得 x1 = −2, x2 = 5, x3 = −3.
这种解法先把方程组化成同解的上三角形方程组 (相应的处理方程称为消去
过程或消元过程), 然后按方程相反顺序求解上三角形方程组 (相应的处理过程称
为回代过程), 得出原方程组的解. 我们称此法为 Gauss 消去法或 Gauss 消元法 (必
须强调, 早在公元前 250 年我国就已经掌握了解三元一次联立方程组的消去法).
下面我们来介绍一般的 n 阶方程组的处理过程. 为了便于说明问题. 我们用
(1) (1)
A(1) , b(1) 分别表示第 1 步消元前方程组的系数矩阵及方程的常数项, 并以 aij , bi
分别表示相应的元素. 此时等价的方程为
A(1) x = b(1) , (6.6)

     
(1) (1) (1) (1)
a11 a12 ··· a1n x1 b1
 (1) (1) (1)     (1) 
 a21 a22 ··· a2n   x2   b2 
(1)     (1)  
A = . .. .. .. , x= .. , b = . , (6.7)
 .. . . .   .   .. 
     
(1) (1) (1) (1)
an1 an2 ··· ann xn bn
其中
(1) (1)
aij = aij , bj = bj , i, j = 1, 2, · · · , n.
第 1 步, 消去方程组 (6.6) 中第 2 至第 n 个方程中的 x1 , 即在 A(1) 中消去
(1) (1) (1) (1) (1)
a21 , · · · , an1 . 为此, 若 a11 6= 0, 则将第 1 个方程乘以 (−a21 /a11 ) 加到第 2 个
方程中去, · · · , 将第 1 个方程乘以 (−a(1) (1)
n1 /a11 ) 加到第 n 个方程中去. 即, 若记
(1) (1)
mi1 = ai1 /a11 , 则为将第 1 个方程乘以 (−mi1 ) 加到第 i 个方程中去. 从而得到等
价的方程
A(2) x = b(2) , (6.8)
即     
(1) (1) (1) (1)
a11 a12 ··· a1n x1 b1
 (2) (2)    (2) 
 0 a22 ··· a2n  x2   b2 
    
 .. .. .. ..  .. = . ,
 . . . .  .   .. 
    
(2) (2) (2)
0 an2 ··· ann xn bn
· 136 · 第6章 线性方程组的直接解法

其中
(2) (1) (1)
aij = aij − mi1 a1j , i, j = 2, 3, · · · , n,
(2) (1) (1)
bi = bi − mi1 b1 , i = 2, 3, · · · , n.
第 2 步, 消去方程组 (6.8) 中第 3 至第 n 个方程中的 x2 , 即将 A(2) 中第 2 列
第 2 行以下的元素消为零. 若 a(2) (2) (2)
22 6= 0, 记 mi2 = ai2 /a22 (i = 3, 4, · · · , n), 将方程
组 (6.8) 中第 2 个方程分别乘以 (−mi2 ) 加到第 i 个方程中, 得

A(3) x = b(3) ,

即     
(1) (1) (1) (1) (1)
a11 a12 a13 ··· a1n x1 b1
 (2) (2) (2)     (2) 
 0 a22 a23 ··· a2n   x2   b2 
    (3) 
 0 0
(3)
a33 ··· a3n 
(3)  x3   
   =  b3 .
 .. .. .. ..  
 ..  
 
 ..   . 
 . . . . .  .   .. 
(3) (3) (3)
0 0 an3 ··· ann xn b3
依此类推, 一般设经第 k − 1 步得等价方程组

A(k) x = b(k) , (6.9)

即     (1) 
(1) (1) (1)
a11 ··· a1k ··· a1n x1 b1
 .. ..     
 ..
.   ..   .. 
 0 . .  .   . 
    (k) 
 (k)
akn   xk 
(k)    .
 0 0 akk ···  =  bk 
 .. .. .. .. ..   ..  
   .. 
 . . . . .  .   
  . 
(k) (k) (k)
0 0 ank ··· ann xn bn
第 k 步, 消去方程组 (6.9) 中第 k + 1 至第 n 个方程中的 xk , 即将 A(k) 中第 k
列第 k 行以下的元素消为零. 若 a(k) (k) (k)
kk 6= 0, 记 mik = aik /akk (i = k + 1, · · · , n), 将
方程组 (6.9) 中第 k 个方程分别乘以 (−mik ) 加到第 i 个方程中, 得

A(k+1) x = b(k+1) ,

即     
(1) (1) (1) (1)
a11 ··· a1,k+1 ··· a1n x1 b1
 .. .. .. ..  ..   .. 
 . .    
 0 . .  .   . 
    (k+1) 
 0 0
(k+1)
ak+1,k+1 ···
(k+1)
ak+1,n   xk+1 = b ,
    k+1 
 .. .. .. .. ..  .   .. 
 . . . . .   ..   . 
    
(k+1) (k+1) (k+1)
0 0 an,k+1 ··· ann xn bn
6.2 高斯 (Gauss) 消去法 · 137 ·

其中
(k+1) (k) (k)
aij = aij − mik akj , i, j = k + 1, k + 2, · · · , n,
(k+1) (k) (k)
bi = bi − mik bk , i = k + 1, k + 2, · · · , n.

而 A(k+1) 中前 k 行与 A(k) 相同, b(k+1) 中前 k 个元素与 b(k) 中相同.


设 a(i) (i)
ii 6= 0(i = 1, 2, · · · , n − 1), aii 称为消元过程中的主元素, 经 n − 1 步, 最
后可得到与原方程组等价的上三角形方程组

A(n) x = b(n) ,

即     
(1) (1) (1)
a11 ··· a1n x1 b1
 . .. ..   .   . 
 .   =  . .
 . . .   ..   .  (6.10)
(n) (n)
0 ··· ann xn bn
从而完成了消元过程.
由此, 因为 a(k) kk 6= 0 (k = n, n − 1, · · · , 1), 我们可以方便地经回代过程得到原
方程组 (6.5) 的解为
 (n) (n)

 xn = bn /ann ,

  ,
n
X (6.11)

  (k) (k) (k)
akj xj  akk , k = n − 1, n − 2, · · · , 1.
 xk = bk −

j=k+1

值得说明的是:上述公式中的 A(k) 、b(k) 、a(k) (k)


ij 、bi 中的上标 k 仅仅是用来区
别消去过程中第 k 步用到的量. 在用计算机实际解题时, 无需分别引用变量, 可把
(k) (k)
aij 存在 aij 位置, bj 存在 bj 位置. 这也表明此方法占用机器内存很少.
上述消去法解方程看起来比较繁杂, 但实际上运算量并不大. 消元过程中第 k
步的运算量约为

乘除法次数:(n − k)2 + 2(n − k) = (n − k)(n − k + 2),


加减法次数:(n − k)2 + (n − k) = (n − k)(n − k + 1).

做完 n − 1 步后累计总运算量为
n−1
X n3 n2 5n
乘除法次数: (n − k)(n − k + 2) = + − ,
3 2 6
k=1
n−1
X n3 n
加减法次数: (n − k)(n − k + 1) = − .
3 3
k=1
· 138 · 第6章 线性方程组的直接解法

回代过程的运算量为
n
X n2 n
乘除法次数: (n − k + 1) = + ,
2 2
k=1
Xn
n2 n
加减法次数: (n − k) = − .
2 2
k=1

故 Gauss 消去法解线性代数方程组的总运算量为
n3 n
乘除法次数: + n2 − ,
3 3
n3 n2 5n
加减法次数: + − .
3 2 6
由此可知, 对于一个 20 阶的线性代数方程组, 若用 Gauss 消去法, 如果在每秒
1 万次乘除运算的计算机上计算, 从理论上讲, 不到 1 秒即可算完; 而若用 Cramer
法则运算, 即便在每秒 1 亿次乘除运算的计算机上计算, 也要用三十多万年!
6.2.3 列主元消去法
(k)
Gauss 消去法中的 akk 称为第 k 步的主元. 在上述消元过程中, 我们假定了
(k)
akk 6= 0, k = 1, 2, · · · , n,

否则 Gauss 消元过程不能进行. 实际上即使 a(k) kk 6= 0, 而其绝对值相对其他元素很


小时, 其计算结果通常可能是不准确的.
例 6.2 对方程组 (
0.0001x1 + 2x2 = 1,
2x1 + 3x2 = 2,

其准确到小数点后第 9 位的解是 x1 = 0.250 018 751, x2 = 0.499 987 499.


若依照计算机运算, 用 4 位浮点十进制数先对阶后计算, 按 Gauss 消元得
(
0.0001x1 + 0.2000 × 10x2 = 0.1000 × 10,
−0.4000 × 104 x2 = −0.2000 × 104 .

经回代得解 x2 = 0.5000, x1 = 0, 可见解严重失真. 这是由于使用了小主元, 导致在


作加法运算之前的对阶过程中, 将较小的数当成了零, 从而扩大了舍入误差. 若是
较高阶的线性方程组, 这种失真再经传递, 还会扩大.
一种计算方法, 若在计算过程中舍入误差迅速增长, 造成计算解与真解相差甚
远, 那么这一方法就是不稳定的; 反之, 若在计算过程中舍入误差的增长能得到控
制, 那么该方法就是稳定的. 稳定的方法是获得精确度高的近似解的重要保证.
6.2 高斯 (Gauss) 消去法 · 139 ·

例 6.2 说明, 小主元是不稳定的根源. 因此, 在每一步消元之前, 先把方程的次


序适当地交换一下, 以避免小主元 (包括 a(k) kk 6= 0) 的出现, 然后再消元, 这就是列
主元消元法.
它的具体做法是:在进行第 k 步消元时 (k = 1, 2, · · · , n − 1), 对第 k 列选绝对
值最大的元素 a(k)
ik ,k 为主元, 即
¯ ¯ ¯ ¯
¯ (k) ¯ ¯ (k) ¯
¯aik ,k ¯ = max ¯ai,k ¯ .
k6i6n

随即交换第 ik 个方程与第 k 个方程的位置, 然后再按 Gauss 消去法顺序消元. 回


代过程和 Gauss 消去法完全一样.
在计算机上实际计算时, 也可以不作行的交换, 只要记下主元所在的行号即可.
在下一步主元以后的消元过程均不参加, 而在回代过程中, 按所记行号的先后次序
的最末一个行号开始, 逐次反顺序回代.
可以证明, 列主元消去法在计算过程中的舍入误差是基本能控制的, 或说基本
上是数值稳定的. 只要系数矩阵 A 为非奇异矩阵, 通过列主元消去法可将方程组
(6.5) 化为上三角形方程组.
下面再用列主元消去法解例 6.2.
例 6.3 对方程组 (
0.0001x1 + 2x2 = 1,
2x1 + 3x2 = 2,
第一列应选 2 为主元, 故交换方程位置得
(
2x1 + 3x2 = 2,
0.0001x1 + 2x2 = 1.

仍按 4 位浮点十进制数对阶计算, 由 Gauss 消元法得


(
0.2000 × 10x1 + 0.3000 × 10x2 = 0.2000 × 10,
0.2000 × 10x2 = 0.1000 × 10.

经回代解得 x2 = 0.5000, x1 = 0.2500. 与真解比较, 此解已经准确到最末一位.


6.2.4 全主元消去法
全主元消去法和列主元消去法基本相同, 只是扩大了选主元的范围:不仅要交
换行的位置, 还要交换列的位置. 如在第 k 步消元时 (k = 1, 2, · · · , n − 1), 把对第 k
2
列选主元改成从所剩的¯ ¯(n − k + 1) 行和 (n − k + 1) 列共 (n − k + 1) 个元素中选
¯ ¯
绝对值最大的元素 ¯a(k)
i,j ¯ 为主元, 即
¯ ¯ ¯ ¯
¯ (k) ¯ ¯ (k) ¯
¯aik ,jk ¯ = max ¯ai,j ¯ ,
k6i,j6n
· 140 · 第6章 线性方程组的直接解法

并将第 ik 个方程与第 k 个方程交换位置, 第 jk 列与第 k 列 (包括相应的未知数)


交换位置, 然后再按 Gauss 消去法消元.
全主元消元法的数值稳定性当然更好, 而且只要方程组的系数矩阵是非奇异矩
阵即可使用. 但所选主元占用计算机较多的时间, 且程序设计麻烦, 所以当方程组
的阶数很高时, 要谨慎考虑.
以上是就一般方程组而言, 如果方程组的系数矩阵具有某些特殊性质, 即使用
按顺序的 Gauss 消去法 (即不选主元), 也能始终保证主元素 a(k) kk (k = 1, 2, · · · , n)
在所在的列中是按模最大的. 例如, A 是对称的严格对角占优和对称正定阵时, 就
可不选主元而直接消元. 线性代数中我们已经学过了正定矩阵的概念, 这里我们给
出对角占优矩阵的定义.
定义 6.1 若矩阵 A = (aij )n×n 的元素对所有 i(1 6 i 6 n) 有不等式
n
X
|aii | > |aij |
j=1
j6=i

成立, 则称 A 为对角占优矩阵, 若上式不等号严格成立, 则称 A 为严格对角占优


矩阵.
可以证明, 若矩阵 A = (aij )n×n 是严格对角占优矩阵 (或对称正定阵), 经 1 步
Gauss 消元化为形式 Ã !
a11 αT
1
,
0 A1
其中  
(1) (1)
a22 ··· a2n
 . .. 
α1 = (a12 , a13 , · · · , a1n ) , A1 = 
T
 .
. 
. .
(1) (1)
an2 ··· ann
则 A1 仍是严格对角占优阵 (或对称正定阵)(证明留给读者). 据此易知, 对于严格
对角占优阵和对称正定阵, 用 Gauss 消去法和用列主元消去法的效果是一样的.
此外, 我们还有如下结论.
定理 6.1 Gauss 消去法消元过程中的主元素 a(i) ii 6= 0(i = 1, · · · , n) 的充要条
件是矩阵 A 的顺序主子式 Ai 6= 0, 即
¯ ¯
¯ a11 · · · a1i ¯
¯ ¯
¯ . .. ¯¯
Ai = ¯¯ .. . ¯ 6= 0, i = 1, · · · , n
¯ ¯
¯ ai1 · · · aii ¯

证明:略.
6.3 高斯–若尔当 (Gauss-Jordan) 消去法与矩阵求逆 · 141 ·

由此定理可知, 若 n 阶矩阵 A 的所有顺序主子式均不为零, 即 Ai 6= 0(i =


1, · · · , n), 则可通过 Gauss 消去法 (不需要进行选主元), 将方程组 (6.5) 化为三角
形方程组 (6.10).

6.3 高斯–若尔当 (Gauss-Jordan) 消去法与矩阵求逆


6.3.1 Gauss-Jordan 消去法

Gauss 消去法的消元过程是把原方程组化成上三角形方程组, 即消去系数矩阵


中对角线以下的元素, 但还需经回代过程才可得到方程的解. 我们自然想到, 若在
消去过程中把对角线以上的未知量的系数也消去, 甚至将对角线元素化为 1, 则得
到等价的方程组
    
(1)
1 0 x1 b1
    
 1   x2   b(2) 
    2 
 .  .  =  . .
 ..   ..   .. 
    
(n)
0 1 xn bn

显然, 因系数矩阵为单位矩阵, 则无需再计算即可得到原方程组的解为


   (1) 
x1 b1
 .   . 
 .  =  . .
 .   . 
(n)
xn bn

我们将这种方法称为Gauss-Jordan 消去法, 其基本过程可简述如下.


为便于讨论, 我们将方程组的系数及常数项表示成一个所谓的增广矩阵, 即
 
a11 a12 · · · a1n b1
 
 a21 a22 · · · a2n b2 
 
[A, b] =  . .. .. ..  ,
 .. . . . 
 
an1 an2 · · · ann bn

从而将对线性代数方程组的消元过程看做对此增广矩阵的约化过程, 一旦该增广矩
阵约化为如下等价形式:
 
(n)
1 0 · · · 0 b1
 
 0 1 · · · 0 b(n) 
 2 
 . . .. ..  ,
 .. .. . . 
 
(n)
0 0 · · · 1 bn
· 142 · 第6章 线性方程组的直接解法

则原方程组的解即  
(n)
b1
 (n) 
 b2 
∗ 
x = . .
 .. 
 
(n)
bn

下面我们来看看基于上述思想的 Gauss-Jordan 消去法.


第 1 步, 类似于 Gauss 消去法 (与 Gauss 消去法不同的是, 还需将第 1 行第 1
列的元素化为 1), 增广矩阵可等价地化为
 (1) (1) (1)

1 a12 ··· a1n b1
 
 0 a22
(1)
··· a2n
(1)
b2
(1) 
 
 ,
 .. .. .. .. 
 . . . . 
 
(1) (1) (1)
0 an2 ··· ann bn

其中
(1)
a1j = a1j /a11 , j = 2, · · · , n,
(1)
b1 = b1 /a11 ,
(1)
aij = aij − mi1 a1j , i, j = 2, 3, · · · , n,
(1)
bi = bi /mi1 b1 , i = 2, 3, · · · , n,
mi1 = ai1 /a11 , i = 2, 3, · · · , n.

设经过 k − 1 步, 增广矩阵等价地化为
 (k−1) (k−1) (k−1)

1 · · · 0 a1k ··· a1n b1
 
 .. . . .. .. .. .. 
 . . . . . . 
 
 
 0 · · · 1 a(k−1) · · · (k−1)
ak−1,n bk−1
(k−1) 
 k−1,k 
 .
 0 · · · 0 a(k−1) · · · akn
(k−1)
bk
(k−1) 
 kk 
 
 .. .. .. .. .. 
 . . . . . 
 
(k−1) (k−1) (k−1)
0 ··· 0 ank ··· ann bn

这里与 Gauss 消去法不同的是:前 k − 1 行 k − 1 列的子矩阵不仅仅是上三角性矩


阵, 而且是单位矩阵, 即主对角线元素化为 1, 主对角线以上元素化为零.
第 k 步, 除了将第 k 列第 k 个元素以下的元素化为零以外, 还需将第 k 列第
k 个元素化为 1, 其以上元素也化为零, 从而得到等价的增广矩阵
6.3 高斯–若尔当 (Gauss-Jordan) 消去法与矩阵求逆 · 143 ·

 (k) (k) (k)



1 ··· 0 a1,k+1 ··· a1n b1
 
 .. . . .. .. .. .. 
 . . . . . . 
 
 
 0 ··· 1
(k)
ak,k+1 ··· ak,n
(k) (k)
bk 
 
 ,
 0 ···
(k)
0 ak+1,k+1 ···
(k)
ak+1,n
(k)
bk+1 
 
 
 .. .. .. .. .. 
 . . . . . 
 
(k) (k) (k)
0 ··· 0 an,k+1 ··· ann bn

其中
(k) (k−1) (k−1)
akj = akj /akk , j = k + 1, · · · , n,
(k) (k−1) (k−1)
bk = bk /akk ,
(k) (k−1) (k−1)
aij = aij − mik akj , i = 1, · · · , k − 1, k + 1, · · · , n, j = k + 1, · · · , n,
(k) (k−1) (k−1)
bi = bi − mik bk , i = 1, · · · , k − 1, k + 1, · · · , n,
(k−1) (k−1)
mik = aik /akk , i = 1, · · · , k − 1, k + 1, · · · , n.

经 n 步后, 增广矩阵等价地化为
 (n)

1 b1
 
 1
(n)
b2 
 
 ,
 .. .. 
 . . 
 
(n)
1 bn

其中
(n) (n−1) (n−1)
bn = bn /ann ,
(n) (n−1) (n−1)
bi = bi − min bnn , i = 1, 2, · · · , n − 1,
(n−1) (n−1)
min = ain /ann , i = 1, 2, · · · , n − 1.

从而得到原方程的解为  
(n)
b1
 (n) 
 b2 
∗ 
x = . .
 .. 
 
(n)
bn

类似于 Gauss 消去法, 可以估计出上述 Gauss-Jordan 消去法的乘除法次数为


n3 n n3
+ n2 − , 即 数量级, 这超过了 Gauss 消去法!
2 2 2
· 144 · 第6章 线性方程组的直接解法

可见, 用该方法去解线性代数方程组的意义不大. 不过我们将发现 ³ , 由于它将方


程组 (6.6) 的系数矩阵 A 等价地化为单位矩阵时相应得到的 b = b(n)
(n) (n)
1 , b2 , · · · ,
´T
(n)
bn 自然成了方程组的解, 即 x∗ = b(n) , 当若干具有相同系数矩阵 A 的方程组
(常数项 b 不同) 需要同时进行求解时, 用 Gauss-Jordan 消去法还是比较合算的.

6.3.2 用 Gauss-Jordan 方法求逆矩阵

作为 Gauss-Jordan 消去法的一个应用, 我们来考虑 n × n 阶非奇异矩阵 A 的


逆矩阵 A−1 的计算问题.
由逆矩阵的定义知 AA−1 = I. 因此, 求逆矩阵 A−1 即为求 X n×n , 使

AX = I. (6.12)

若记
X = (x1 , x2 , · · · , xn ) , I = (e1 , e2 , · · · , en ) ,

其中, xi 与 ei 分别为矩阵 X 与 I 的第 i 列元素构成的向量. 则矩阵方程 (6.12)


的求解等价于如下 n 个线性代数方程组的求解. 即求 xi , 使

Axi = ei , i = 1, 2, · · · , n. (6.13)

由于这 n 个方程组具有相同的系数矩阵, 若用 Gauss-Jordan 消去法求解, 对


应的增广矩阵约化为单位矩阵的计算相同, 无需分别计算, 仅需考虑约化过程中对
(n)
ei 的不同影响, 即仅需考虑对应的 ei (i = 1, 2, · · · , n) 的计算. 为此, 我们考虑将
方程组 (6.13) 合并写成如下的增广矩阵:
 
a11 a12 ··· a1n 1 0 ··· 0
 
 a21 a22 ··· a2n 0 1 ··· 0 
 
[A, I] =  . .. .. .. .. . . .. .
 .. . . . . . . 
 
an1 an2 ··· ann 0 0 ··· 1

经过 n 步 Gauss-Jordan 消去法的消元过程, 若其约化为


 
(n) (n) (n)
1 0 ··· 0 e11 e12 ··· e1n
 (n) (n) (n) 
 0 1 ··· 0 e21 e22 ··· e2n 
 
[A, I] −→  .. .. .. .. .. .. ..  = [I, X ∗ ],
 . . . . . . . 
 
(n) (n) (n)
0 0 ··· 1 en1 en2 ··· enn
6.3 高斯–若尔当 (Gauss-Jordan) 消去法与矩阵求逆 · 145 ·

则 X ∗ 即为矩阵 A 的逆矩阵 A−1 , 即


 
(n) (n) (n)
e e12 ··· e1n
 11 
 e(n) (n)
e22 ···
(n)
e2n 
 21 
A−1 = X ∗ =  . .. .. .
 .. . . 
 
(n) (n) (n)
en1 en2 ··· enn
读者不难估计, 用上述方法求解 A−1 约需 n3 次乘除法, 而若用 Gauss 消去
4n3
法消元, 再分别回代求解, 则约需 次乘除法, 可见 Gauss-Jordan 消去法用于求
3
A−1 比用 Gauss 消去法在时间上具有一定的优越性.
与 Gauss 消去法一样, 为了保证方法的稳定性, 可采用选主元的技术. 运算中
只增加选主元与交换行的步骤.
例 6.4 用 Gauss-Jordan 法求
 
1 2 3
 
A= 
 2 4 5 
3 5 6

的逆矩阵 A−1 .
解:将 A 写成增广矩阵 C = [A, I], 逐次完成 Gauss-Jordan 消元, 过程如
下:
   
1 2 3 1 0 0 3 5 6 0 0 1
  选主元  
C = [A, I] = 
 2 4 5 0 1 0  
 −−−−−−−−−→  2 4 5 0 1 0 

交换 1,3 行
3 5 6 0 0 1 1 2 3 1 0 0
 
5 1
1 2 0 0
 3 3 
第一次消元   2 2 

−−−−−−−−−→  10 1 0 1 − 
 3 3 
 1 1 
0 1 1 0 −
3 3
 
1 5
1 0 − 0 − 2
 2 2 
第二次消元   3 3


−−−−−−−−−→  0 1 0 −1 
 2 2 
 1 1 
0 0 1 − 0
 2 2 
1 0 0 1 −3 2
第三次消元  
−−−−−−−−−→  
 0 1 0 −3 3 −1  = [I, A ].
−1

0 0 1 2 −1 0
· 146 · 第6章 线性方程组的直接解法

6.4 解三对角方程组的追赶法
在前面第 1 章、第 4 章的学习中我们已经发现, 在求解三次样条函数、常微分
方程边值问题时, 需要求解所谓的三对角方程组. 其实, 在解热传导方程、应力应
变关系、电路等问题时, 我们都会遇到此类问题. 这些问题由于系数矩阵非零元素
少, 且往往又具有主对角线元素较大的优势, 使得我们在求解这类方程时可以利用
相关特点, 设计出更为快速有效的算法. 本节介绍的追赶法就是一例.
对方程组
    
b1 c1 x1 d1
    
 a2 b2 c2   x2   d2 
    
 .. .. ..   ..   .. 
 . . .  .   . 
    
    
 ai bi ci   xi  =  di 
    
 .. .. ..   ..   .. 
 . . .  .   . 
    
    
 an−1 bn−1 cn−1   xn−1   dn−1 
an bn xn dn

或简记为
Ax = d.

用消元法求解仅需消去主对角线元素以下的次对角线元素, 故可构造一组递推公
式, 使得算法更为简便. 我们先来做有关的推导工作.
第 1 步, 对第 1 行进行约化, 得同解方程
    
1 v1 x1 u1
    
 a2 b2 c2   x2   d2 
    
 .. .. ..   ..   .. 
 . . .  .   . 
    
    
 ai bi ci   xi  =  di ,
    
 .. .. ..   ..   .. 
 . . .  .   . 
    
    
 an−1 bn−1 cn−1   xn−1   dn−1 
an bn xn dn

其中
c1 d1
v1 = , u1 = . (6.14)
b1 b1
第 2 步, 对第 2 行进行约化, 消去 a2 , 并将 b2 元素所在位置约化为 1, 得
6.4 解三对角方程组的追赶法 · 147 ·

    
1 v1 x1 u1
    
 0 1 v2   x2   u2 
    
 .. .. ..   ..   .. 
 . . .  .   . 
    
    
 ai bi ci   xi  =  di ,
    
 .. .. ..   ..   .. 
 . . .  .   . 
    
    
 an−1 bn−1 cn−1   xn−1   dn−1 
an bn xn dn

其中
c2 d1 − u1 a2
v2 = , u2 = .
b2 − v1 a2 b2 − v1 a2
第 i 步, 消去 ai , 并将 bi 元素所在位置约化为 1, 得
    
1 v1 x1 u1
    
 0 1 v2     u2 
   x2   
 .. .. ..  .   . 
 . . .   ..   .. 
    
    
 0 1 vi   xi   ui 
  = ,
 ai+1 bi+1 ci+1  x   d 
   i+1   i+1 
  .   . 
 .. .. ..  .   . 
 . . .  .   . 
    
 an−1 bn−1 cn−1     d 
   xn−1   n−1 
an bn xn dn

其中
ci di − ui−1 ai
vi = , ui = . (6.15)
bi − vi−1 ai bi − vi−1 ai
第 n 步, 消去 an , 并将 bn 元素所在位置约化为 1, 得
    
1 v1 x1 u1
    
 1 v2   x2   u2 
    
 . . . .   ..   .. 
 . .  .  =  . ,
    
    
 1 vn−1   xn−1   un−1 
1 xn un

其中
dn − un−1 an
un = . (6.16)
bn − vn−1 an
从而经回代得
xn = un ,
(6.17)
xi = ui − vi xi+1 , i = n, n − 1, · · · , 1.
· 148 · 第6章 线性方程组的直接解法

以上求 vi , ui 的过程称为 “追” 的过程, 求 xi 的过程称为 “赶” 的过程, 有关递


推公式可以总结为
ci di − ui−1 ai
vi = , ui = , i = 1, · · · , n, (6.18)
bi − vi−1 ai bi − vi−1 ai
xk = uk − vk xk+1 , k = n, n − 1, · · · , 1. (6.19)

其中, 规定 v0 = u0 = 0, vn = 0.
我们将以上求三对角方程的方法称为 “追赶法”. 计算顺序为

v1
u1 → · · · →vun−1
n−1
→ un = xn (vn = 0) → xn−1 → · · · → x1 .

例 6.5 求解三对角方程组
    
−2 1 x1 −2
    
 1 −2 1   x2  =  1 .
    
1 −2 x3 −4

解:由方程组可知

b1 = b2 = b3 = −2, a2 = a3 = 1, c1 = c2 = 1.

由式 (6.15) 计算得
1 2
v1 = − , u1 = 1, v2 = − , u2 = 0, u3 = 3.
2 3
再由式 (6.16) 计算得
x3 = u3 = 3, x2 = 2, x1 = 2.

追赶法的优点是:仅需 5n − 4 次乘除法, 且算法简单, 便于程序设计; 仅需一维存


贮单元, 能最大程度地节省计算机的内存. 但追赶法的运算中含有大量的除法运算,
当分母为零时, 将会中断运算 (溢出). 不过根据 6.2 节最后的讨论可知, 当三对角
矩阵 A 是严格对角占优矩阵时, 即 |bi | > |ai | + |ci |(i = 1, 2, · · · , n) 时, 可以保证追
赶法的计算不会发生中断, 而且是数值稳定的. 事实上, 不难发现上述 “追” 的过程
实质上就是 Gauss 消去法的消元过程.

6.5 矩阵的三角分解及 Gauss 消去法的变形


Gauss 消去法有很多变形, 有的是 Gauss 消去法的改进或改写, 有的是用于某
类特殊性矩阵的 Gauss 消去法的简化处理. 例如, 前述的 Gauss-Jordan 方法、选
6.5 矩阵的三角分解及 Gauss 消去法的变形 · 149 ·

主元方法、追赶法等. 本节将要介绍的是基于矩阵三角分解的 Gauss 消去法的另


一种表现形式, 并可直接应用于对系数矩阵为对称矩阵的方程组的求解. 这种方法
是把 Gauss 消去法改写成紧凑形式, 建立起由系数矩阵 A 的元素得到的递推公式,
而省去中间步骤.
我们已知形如式 (6.1) 和 (6.3)的上三角形方程组与下三角形方程组可以直接
用式 (6.2) 和 (6.4) 求解. 若一般的系数矩阵 A 可以分解成一个下三角形矩阵与一
个上三角性矩阵的乘积, 即
A = LU , (6.20)

其中
   
1 u11 u12 ··· u1n
   
 l21 1   u22 ··· u2n 
   
L= .. .. .. , U = .. .. .
 . . .   . . 
   
ln1 ln2 ··· 1 unn

则方程组 (6.6) 的求解可等价于 LU x = b, 从而令 U x = y, 可将问题转化为如下


两个三角形方程的求解, 即
Ly = b, (6.21)

U x = y, (6.22)

从而显得方便些. 其中, L 的主对角线元素为 1, 我们称这种下三角矩阵为单位下


三角矩阵.

6.5.1 矩阵的 LU 分解

为了对矩阵 A 进行上述的 LU 分解, 我们不妨将上述 L、U 之元素 lij , uij 视


为未知数, 从而利用矩阵乘法的定义, 由关系式 (6.20) 求出 lij , uij , 进而得到矩阵
A 的 LU 分解. 为此考虑
   
a11 a12 · · · a1j ··· a1n 1
   
 a21 a22 · · · a2j ··· a2n   l21 1 0 
   
 . .. .. ..   .. .. .. 
 .. . . .   . . . 
   
 = 
 ai1 ai2 · · · aij ··· ain   li1 li2 ··· 1 
   
 . .. .. ..   .. .. .. .. 
 .. . . .   . . . . 
   
an1 an2 · · · anj ··· ann ln1 ln2 ··· lnj ··· 1
· 150 · 第6章 线性方程组的直接解法

 
u11 u12 ··· u1j ··· u1n
 
 u22 ··· u2j ··· u2n 
 
 .. .. .. 
 . . . 
 
 .
 0 ujj ··· ujn 
 
 .. .. 
 . . 
 
unn
第 1 步, 比较左边及右端乘积第 1 行元素, 可得出矩阵 U 的第 1 行元素, 有

u1j = a1j , j = 2, · · · , n.

比较左边及右端乘积第 1 列元素, 得

li1 u11 = ai1 , i = 2, · · · , n.

由此可计算出矩阵 L 的第 1 列元素 (若 u11 6= 0)

li1 = ai1 /u11 , i = 2, · · · , n.

第 2 步, 比较第 2 行元素, 有

a2j = l21 u1j + u2j , j = 2, 3, · · · , n.

由此可计算出矩阵 U 的第 2 行元素

u2j = a2j − l21 u1j , j = 2, 3, · · · , n.

再比较第 2 列元素, 有

ai2 = li1 u12 + li2 u22 , i = 3, 4, · · · , n.

由此可计算出矩阵 L 的第 2 列元素 (若 u22 6= 0)

li2 = (ai2 − li1 u12 )/u22 , i = 3, 4, · · · , n.

第 k 步, 设已经定出 U 的第 1 到第 k − 1 行元素与 L 的第 1 到第 k − 1 列元
素. 比较第 k 行元素, 有

akj = lk1 u1j + lk2 u2j + · · · + lk,k−1 uk−1,j + ukj , j = k, · · · , n.

由此可计算出矩阵 U 的第 k 行元素
k−1
X
ukj = akj − lks usj , j = k, · · · , n.
s=1
6.5 矩阵的三角分解及 Gauss 消去法的变形 · 151 ·

再比较第 k 列元素, 有

aik = li1 u1k + li2 u2k + · · · + li,k−1 uk−1,k + lik ukk , i = k + 1, · · · , n.

由此可计算出矩阵 L 的第 k 列元素 (设 ukk 6= 0)


à k−1
!,
X
lik = aik − lis usk ukk , i = k + 1, · · · , n.
s=1

经 n 步后, 可计算出 L, U 的全部元素. 从而得到 A 的三角分解, 即矩阵 A 的 LU


分解, 也称Doolittle 分解.
6.5.2 方程组的求解
得到 L, U 后, 可直接由式 (6.21) 和 (6.22) 给出求解方程组的计算公式


 y1 = b1 ,

i−1
X

 y i = b i − lik yk , i = 2, 3, · · · , n,

k=1

和 

 xn = yn /unn ,

i−1
X

 y i = bi −
 lik yk , i = n − 1, · · · , 1.
k=1

例 6.6 用直接三角分解法解方程组
    
1 2 3 x 14
  1   
 2 5 2   x2  =  18  .
    
3 1 5 x3 20

解:由分解公式计算得
   
1 0 0 1 2 3
   

L= 2  
1 0 , U =  0 1 −4 

3 −5 1 0 0 −24

求解
Ly = (14, 18, 20)T

y = (14, −10, −72)T .
再求解方程组
U x = (14, −10, −72)T
· 152 · 第6章 线性方程组的直接解法


x = (1, 2, 3)T .
在用计算机计算时, U , L 不必单独开辟单元, 占用内存. 可将逐步计算出的 U
与 L 的各行各列分别对应存放在 A 的对应位置. 这是因为一旦 U 的第 k 行、L
的第 k 列算出后, A 的第 k 行、第 k 列之前的元素就不再参与运算了. 此外, y 可
存入 b 所占的单元, 回代时 x 可存入 y 所占的单元. 因而在整个计算过程中, 除了
存放 A 与 b 的存贮单元及部分下标变量外, 不需增加新的存储单元.
与 Gauss 消去法一样, 为了保证运算能顺利进行以及方法的稳定性, 三角分解
法一般也应采用选主元的技术. 不过, 由于 LU 分解方法实际上是 Gauss 消去法的
另一种形式, 故在定理 6.1 条件下, 无需选主元即可顺利进行. 换言之, 此时 LU 分
解存在唯一性.
6.5.3 平方根法
在控制理论、有限元法应用等问题中, 常需要解系数矩阵为对称正定矩阵的方
程组. 此时可应用由 LU 分解方法改进得到的所谓平方根法. 由于对称性, 可使得
三角分解的计算量大大减少. 对此我们有:
定理 6.2 若 A 是对称正定矩阵, 则可以分解为
A = LLT ,
其中, L 为形如  
l11
 
 l21 l22 
 
 .. .. .. 
 . . . 
 
ln1 ln2 ··· lnn
的下三角矩阵. 若限定 L 的主对角线上元素取正值, 则这种分解是唯一的.
证明:请读者自己证明.
那么, 如果 A 是对称正定矩阵, 求解方程组 Ax = b 就等价于求解方程组
Ly = b 和 LT x = y. 这种求解方法被称为平方根法.

6.5.4 改进的平方根法
实际上, 在一定条件下矩阵 A 可以分解为式 (6.20), 此时若再将 U 分解为
  
u11 u12 u1n
1 ···
  u11 u11 
 u22  .. .. 
  . 
 ..  .  = DU 0 ,
U = .  u 
  n−1,n

 
 un−1,n−1  u n−1,n−1 

unn 1
6.5 矩阵的三角分解及 Gauss 消去法的变形 · 153 ·


A = LDU 0 .

由对称性
A = AT = U 0 DLT .

比较以上两式可知
A = LDLT ,

此即矩阵的 LDLT 分解, 又称改进的平方根法.


定理 6.3 设 A 为对称矩阵, 若各阶顺序主子式 Ai 6= 0, 即
¯ ¯
¯ a11 · · · a1i ¯
¯ ¯
¯ . . ¯
¯
Ai = ¯ .. .. ¯¯ 6= 0.
¯ ¯
¯ ai1 · · · aii ¯

则有唯一的分解
A = LDLT ,

其中    
1 d1
   
 l21 1   d2 
   
L= .. .. .. , D= .. .
 . . .   . 
   
ln1 ln2 ··· 1 dn

由矩阵乘法, 类似于 LU 分解, 可得到 LDLT 分解的计算公式为


à j−1

X
lij = aij − lis ds ljs dj , j = 1, 2, · · · , n, i = j + 1, · · · , n.
s=1
i−1
X
2
di = aii − lis ds , i = 1, 2, · · · , n.
s=1

进一步, 为避免计算重复, 可引进

tij = lij dj , j = 1, 2, · · · , n, i = j + 1, · · · , n.

从而可得到另一组计算公式
i−1
X
di = aii − tis lis , i = 1, 2, · · · , n,
s=1
· 154 · 第6章 线性方程组的直接解法

j−1
X
tij = aij − tis ljs , j = 1, 2, · · · , n, i = j + 1, · · · , n,
s=1

lij = tij /dj , i = k + 1, · · · , n, j = 1, 2, · · · , i − 1.

从而, 可求解 Ly = b 和 DLT x = y, 相应的计算公式为



 y 1 = b1 ,

i−1
X

 yi = bi − lis ys , i = 2, 3, · · · , n,
s=1

和 

 xn = Ã
 yn /dn ,

n
X

 x = yi − lis xs di , i = n − 1, n − 2, · · · , 1.
 i
s=i+1

上述方法称为改进平方根方法, 可以很方便地求解系数矩阵为对称矩阵的方程组.

6.6 向量范数和矩阵范数
在数值方法中, 经常要分析解向量的误差, 比较误差向量的 “大小”, 那么如何
定义向量的 “大小” 并以此比较呢? 这可以对向量按确定的法则定义一个非负实数
作它的 “长度”, 如可以取向量中按模 (绝对值) 最大的分量作其 “长度” 等, 然后以
这个 “长度” 为标准进行比较, 这就是计算方法中广泛使用的范数的概念.
6.6.1 向量范数
定义 6.2 若向量 x = (x1 , x2 , · · · , xn )T ∈ Rn (n 维实向量空间) 的某个实函
数 k · k 同时满足下列三个条件:
(1) kxk > 0, 其中, kxk = 0 当且仅当 x = 0 时成立 —— 非负性.
(2) kλxk = |λ| kxk, 其中, λ 为任何实数 —— 齐次性.
(3) kx + yk 6 kxk + kyk, 其中, x, y ∈ Rn —— 三角不等式.
则称 k·k 为 Rn 上的一个向量范数 (或模).
常用的向量范数有
n
X
1- 范数: kxk1 = |xi |,
i=1
à n
! 12
X
2- 范数: kxk2 = x2i ,
i=1
∞- 范数:kxk∞ = max |xi |.
16i6n
6.6 向量范数和矩阵范数 · 155 ·

可以证明上述三种范数都满足定义 6.2 的三个条件. 现以 kxk1 为例证明如下.


条件 (1)、(2) 显然满足, 只需证明条件 (3) 满足即可. 实际上, 我们有
n
X n
X n
X
kx + yk1 = |xi + yi | 6 |xi | + |yi | = kxk1 + kyk1 .
i=1 i=1 i=1

上述三种范数可统一地表示为 p- 范数, 即
à n !1/p
X
p
kxkp = |xi | .
i=1

例 6.7 计算向量 x = (1, 2, −3)T 的向量范数 kxk1 , kxk2 和 kxk∞ .


解:
kxk1 = 1 + 2 + 3 = 6,
√ √
kxk2 = 12 + 22 + 32 = 14,
kxk∞ = 3.

下面给出向量范数的两个常用的性质.
(1) 如果 x, y ∈ Rn , 那么 |kxk − kyk| 6 kx − yk. 事实上, 因为

kxk = k(x − y) + yk 6 kx − yk + kyk ,


kxk − kyk 6 kx − yk .

类似地,
kyk − kxk 6 ky − xk = kx − yk .

这样我们有
|kxk − kyk| 6 kx − yk .

(2) 如果 k·kα 和 k·kβ 是 Rn 上的任意两种向量范数, 那么存在正数 M 和 m,


使得对所有的 x ∈ Rn , 有

m kxkβ 6 kxkα 6 M kxkβ .

这个性质又称为向量范数的等价关系. 不等式表明:若 kxkβ 趋于零 (或 ∞)


时, kxkα 也必趋于零 (或 ∞), 只是趋于零 (或 ∞) 的快慢不同而已, 反之亦一样.
· 156 · 第6章 线性方程组的直接解法

有了范数的概念, 就能讨论向量序列的收敛性问题了.
定义 6.3 设有 Rn 中的向量 x∗ = (x∗1 , x∗2 , · · · , x∗n )T ∈ Rn 和向量序列 x(k) =
(k) (k) (k)
(x1 , x2 , · · · , xn )T (k = 1, 2, · · · , n), 若对所有的 i(i = 1, 2, · · · , n) 有

(k)
lim xi = x∗i ,
k→∞

© ª
则称向量序列 x(k) 收敛于向量 {x∗ }, 记作

lim x(k) = x∗ .
k→∞
© ª
定理 6.4 向量序列 x(k) 收敛于 {x∗ } 的充要条件是
° °
° (k) °
°x − x∗ ° → 0, k → ∞,

其中, k·k 是 Rn 上的任何一种向量范数.


证明:因为
° °
(k) ° °
lim x(k) = x∗ ⇐⇒ lim xi = x∗i (i = 1, 2, · · · , n) ⇐⇒ °x(k) − x∗ ° → 0, k → ∞.
k→∞ k→∞ ∞

由性质 (2), 对于 Rn 上任何一种向量范数 k·k 存在 M, m > 0, 使


° ° ° ° ° °
° ° ° ° ° °
m °x(k) − x∗ ° 6 °x(k) − x∗ ° 6 M °x(k) − x∗ ° .
∞ ∞

那么 ° ° ° °
° (k) ° ° °
°x − x∗ ° → 0 ⇐⇒ °x(k) − x∗ ° → 0, k → ∞,

即 ° °
° °
lim x(k) = x∗ ⇐⇒ °x(k) − x∗ ° → 0, k → ∞.
k→∞

6.6.2 矩阵范数
向量的范数概念还可以推广到矩阵上去. 用 Rn×n 表示 n × n 阶实矩阵的集
合, 则有:
定义 6.4 若矩阵 A = (aij )n×n ∈ Rn×n 的某个实函数 k·k 同时满足于下列
条件:
(1) kAk > 0, 等号当且仅当 A = 0 时成立. (非负性)
(2) kλAk = |λ|kAk, 其中, λ 为任何实数. (齐次性)
(3) kA + Bk 6 kAk + kBk, 对任意 A, B ∈ Rn×n .
(4) kABk 6 kAkkBk, 对任意 A, B ∈ Rn×n .
则称 kAk 为 Rn×n 上的一个矩阵范数 (或模).
6.6 向量范数和矩阵范数 · 157 ·

 1/2
n
X
例如, kAkF =  a2ij  就是满足于上述 4 个条件的 Rn×n 上的一个矩阵
i,j=1

范数, 它称为矩阵 A 的Frobenius 范数, 简称F-范数.


定义 6.5 设 x ∈ Rn , A ∈ Rn×n , k·k 是 Rn 上的一种向量范数, 称

kAxk
kAk = max (6.23)
x6=0 kxk

为 Rn×n 上的矩阵算子范数.
算子范数与其相应的向量范数满足一个不等式, 即若 x ∈ Rn , A ∈ Rn×n 时有

kAxk 6 kAk · kxk ,

称之为相容性条件. 该不等式容易由式 (6.23) 得到, 因为

kAxk kAxk
kAk = max > .
x6=0 kxk kxk

相容性条件对研究同时含有矩阵和向量的误差估计问题是不可或缺的.
算子范数也完全满足矩阵范数的定义条件. 事实上, 定义 6.4 的条件 (1)、(2)
对于算子范数显然成立, 下面只需证明条件 (3)、(4) 对于算子范数成立即可. 事
实上,
k(A + B)xk kAxk + kBxk kAxk kBxk
kA + Bk = max 6 max 6 max + max
x6=0 kxk x6=0 kxk x6=0 kxk x6=0 kxk

= kAk + kBk ,

由相容性条件易得另一个不等式, 即
kABxk kAk · kBxk
kABk = max 6 max = kAk · kBk .
x6=0 kxk x6=0 kxk

矩阵的算子范数 kAk 依赖于向量范数 kxk 的具体含义, 即给出一种具体的向


量范数 kxk 时, 就确定了一种矩阵的算子范数 kAk.
直接按定义计算矩阵的算子范数是很不方便的. 下面我们给出常用的矩阵算
子范数, 它们的计算较为方便, 设 A = (aij )n×n ∈ Rn×n , 则可以证明:
n
X
∞-范数:kAk∞ = max |aij | (行范数),
16i6n
j=1
n
X
1-范数: kAk1 = max |aij | (列范数),
16j6n
i=1
· 158 · 第6章 线性方程组的直接解法

r
2-范数:kAk2 = max λi (AT A)
16i6n

[λi (AT A)是 AT A 的最大特征值].


例 6.8 求矩阵 Ã !
−1 3
A=
0 2
的算子范数 kAk∞ , kAk1 , kAk2 .
解:显然有 kAk∞ = 4, kAk1 = 5. 因为
à !
T 1 −3
A A= ,
−3 13

易得 AT A 的特征值 λ1,2 = 7 ± 45, 所以

kAk2 = 7 ± 45.

定义 6.6 设 λ1 (i = 1, 2, · · · , n) 是矩阵 A ∈ Rn×n 的特征值, 称

ρ(A) = max |λi |


16i6n

为矩阵 A 的谱半径.
定理 6.5 如果 A ∈ Rn×n , 那么对任一算子范数 k·k, 有

ρ(A) 6 kAk .

证明 设 λ 是矩阵 A 的任何一个特征值, 则必有非零向量 x ∈ Rn 使

Ax = λx.

由算子范数的相容性条件知

|λ| kxk = kλxk = kAxk 6 kAk · kxk ,

由于 x 6= 0, 有
|λ| 6 kAk ,

又由于 λ 的任意性, 有
ρ(A) 6 kAk .

定理 6.6 设 kAkα , kAkβ 是 Rn×n 上的任何两种矩阵范数, 则存在正数 C1 ,


C2 使
C1 kAkβ 6 kAkα 6 C2 kAkβ .
6.7 误差分析 · 159 ·

这是矩阵范数的等价定理 (证明略), 它也意味着有

kAkα → 0 (或 ∞) ⇐⇒ kAkβ → 0(或∞).

定义 6.7 一个 n × n 矩阵 A 称作收敛的, 如果对任意的 i = 1, 2, · · · , n 和


j = 1, 2, · · · , n, 有 h i
lim (Ak )ij = 0.
k→∞

定理 6.7 下列命题等价:
(1) 矩阵 A 是收敛的. ° °
° °
(2) 对任意算子范数, 有 lim °Ak ° = 0.
k→∞
(3) ρ(A) < 1.
(4) lim Ak x = 0, 对任意 x ∈ Rn .
k→∞

6.7 误 差 分 析
6.7.1 方程组的性态和条件数
由一个实际问题建立方程组时, 方程组的系数和右端常数项通常都或多或少地
带有一定的误差 (或扰动), 这种扰动有时使方程组的解面目全非, 有时却对解的影
响并不大. 下面来考察两个例子.
例 6.9 解下列两个方程组:
(
2x1 + x2 = 5,
(6.24)
2x1 + 1.0001x2 = 5.0001,
(
2x1 + x2 = 5,
(6.25)
2x1 + 0.9999x2 = 5.0002.
这两个方程组的常数部分只有极微小的不同, 我们可以认为方程组 (6.25) 是方程组
(6.24) 的常数部分产生小的扰动而造成的. 但是方程组 (6.24) 的准确解是 x1 = 2,
x2 = 1, 而方程组 (6.25) 的准确解是 x1 = 3.5, x2 = −2, 两者相差甚远.
例 6.10 对方程组 (
x1 + 2x2 = 7,
(6.26)
2x1 − x2 = −1,
其准确解是 x1 = 1, x2 = 3.
若将方程组改成 (
x1 + 2x2 = 7,
(6.27)
2x1 − 1.0009x2 = −1.003,
· 160 · 第6章 线性方程组的直接解法

其最大的绝对误差不超过 10−5 的近似解是 x1 = 0.999 88, x2 = 3.000 06. 可见方


程组 (6.27) 常数部分的扰动虽然比方程 (6.25) 相对大, 但对解的影响甚微.
若一个方程组由于初始数据的小扰动而使解严重失真时, 这样的方程组称作病
态方程组(如例 6.9 的方程组); 反之称为良态方程组(如例 6.10 的方程组).
下面来讨论刻画方程组这种性态的方法.
先分析方程组 Ax = b(b 6= 0) 中只有 b 有扰动 δb 的情况. 设此时解 x 的扰动
为 δx, 则它们满足
A(x + δx) = b + δb,

由于 Ax = b, 故上式为

Aδx = δb 或 δx = A−1 δb.

由算子范数的相容性条件得
° °
kδxk 6 °A−1 ° · kδbk , (6.28)

kbk = kAxk 6 kAk · kxk . (6.29)

由式 (6.28) 和 (6.29) 得扰动解的相对误差的关系式为


kδxk ° ° kδbk
6 kAk · °A−1 ° · . (6.30)
kxk kbk

若方程组 Ax = b(b 6= 0) 中, 只有 A 扰动 δA, 相应的解 x 产生的扰动是 δx,


即满足
(A + δA)(x + δx) = b,

化简得
Aδx = −δA(x + δx).


° ° ° °
kδxk = °A−1 δA(x + δx)° 6 °A−1 ° kδAk (kxk + kδxk),


° ° ° °
(1 − °A−1 ° kδAk) kδxk 6 °A−1 ° kδAk kxk .

当 kA−1 k kδAk < 1 时便有


° −1 °
° −1 ° °A ° kAk kδAk
kδxk °A ° kδAk kAk
6 ° ° = . (6.31)
kxk 1 − °A−1 ° kδAk ° −1 ° kδAk
°
1− A ° kAk
kAk
6.7 误差分析 · 161 ·

可以证明:若方程组 Ax = b(b 6= 0) 中 A 为非奇异阵, A 有扰动 δA, b 有扰


动 δb, 从而 x 有扰动 δx, 即

(A + δA)(x + δx) = b + δb,

且 kA−1 k kδAk < 1 时, 有


° −1 ° µ ¶
kδxk °A ° kAk kδAk kδbk
6 ° ° + . (6.32)
kxk kδAk kAk kbk
1 − °A−1 ° kAk
kAk
° °
由式 (6.30), (6.31) 和 (6.32) 可知, A 和 b 有扰动时, °A−1 ° kAk 的大小标志着
° °
方程组解 x 的敏感程度, 解 x 的某种范数含义下的相对误差的上界随 °A−1 ° kAk
的增大而增大, 并且这种影响完全是由系数矩阵 A 的特性所确定的. 鉴于此, 我们
给出如下定义.
定义 6.8 设 A 为非奇异阵, 称
° °
Cond(A) = °A−1 ° kAk

为矩阵 A 的条件数.
至此可知, 方程组 Ax = b 的病态程度可以不太严格地借助于系数矩阵条件数
Cond(A) 的大小来刻画:Cond(A) 的值越大, 方程组的病态可能越严重.
比如, 例 6.9 的方程组 (6.24) 的系数矩阵
à !
2 1
A= ,
2 1.0001
° °
因为 kAk∞ = 3.0001, °A−1 °∞ = 20 000, 我们可以得到
° °
Cond∞ (A) = kAk∞ °A−1 °∞ ≈ 60 002.

由于条件数很大, 方程组 (6.24) 是严重病态的, 其初始数据的微小扰动, 就可能导


致严重的失真.
再看例 6.10 的方程组 (6.26) 的系数矩阵
à !
1 2
B= ,
2 −1

其条件数为
9
Cond∞ (B) = .
5
故有理由认为方程组 (6.26) 是良态的.
· 162 · 第6章 线性方程组的直接解法

6.7.2 精度分析
当求得方程组 Ax = b 的近似解 x̃ 后, 检验该解精度的一个简单办法, 是将 x̃
代回到原方程组计算残向量 r, 即

r = b − Ax̃.

如果残向量 r 的某种范数 krk 很小, 一般可以认为解 x̃ 是好的. 但对于病态方程


组, 这一办法是不可靠的. 若设方程组 Ax = b 的准确解为 x∗ , 则 x̃ = x∗ + δx 由
式 (6.30) 易得
kx∗ − x̃k krk
6 Cond(A) · .
kxk kbk
可见方程组的解在范数意义下的相对误差取决于 Cond(A) 和 krk 这两个因
素, 所以尽管 krk 很小, 方程组在病态条件下, Cond(A) 可能很大, 因而解的相对误
差就不一定很小了.
例如, 方程组 (6.24) 的解 x1 = 3.5, x2 = −2 作为方程组 (6.33) 近似解计算残
向量 Ã !
0
r= .
0.0003

显然 krk 很小, 但实际上这个近似解与方程组 (6.24) 的准确解 x1 = 2, x2 = 1 相差


很大.

习 题 6
1. 用 Gauss 消去法解下列方程组:
 
 3x − x + 2x = −3, 

 1 2 3  2x1 + 4x2 − 2x3 = 3,

(1) x1 + x2 + x3 = −4, (2) x1 − x2 + 5x3 = 0,

 

 2x + x − x = −4.  4x + x − 2x = 2.
1 2 3 1 2 3

2. 用列主元消去法解下列方程组:
 
 
 x1 − x2 + x3 = −4,
  −x1 + 2x2 − 2x3 = −1,

(1) 5x1 − 4x2 + 3x3 = −12, (2) 3x1 − x2 + 4x3 = 7,

 

 2x + x + x = 11.  2x − 3x − 2x = 0.
1 2 3 1 2 3

3. 对方程组


 0.4096x1 + 0.1234x2 + 0.3678x3 + 0.2943x4 = 0.4043,


 0.2246x + 0.3872x + 0.4015x + 0.1129x = 0.1150,
1 2 3 4
 0.3645x1 + 0.1920x2 + 0.3781x3 + 0.0643x4
 = 0.4240,



0.1784x1 + 0.4002x2 + 0.2786x3 + 0.3927x4 = −0.2557,
习 题 6 · 163 ·

(1) 用 Gauss 消去法解方程组 (用 4 位小数计算).


(2) 用列主元消去法解上述方程组且与 (1) 比较.
4. 用 Gauss-Jordan 消去法求下列矩阵的逆矩阵:
 
  0 2 0 1
11 −3 −2  
   3 2 3 2 
(1) 
 −23 11 1  
. (2)  4 −3
.

 0 1 
1 −2 2
6 1 −6 −5
5. 用追赶法解三对角方程组 Ax = d, 其中,
 
−2 1 0 0
 
 1 −2 1 0 

(1) A =   , d = (1, 1, 0, −1)T .

 0 1 −2 1 
0 0 1 −2
 
−4 1 0 0
 
 0 −4 1 0 
(2) A = 

 , d = (1, 1, 1, 1)T .

 0 1 −4 1 
0 0 1 −4
6. 试给出 6.5.3 节中 LLT 分解的计算公式.
7. 证明 6.5.3 节中的定理 6.2.
8. 试判别矩阵 A 是否正定, 若是正定阵, 将其作 LLT 分解.
   
4 2 −1 2 −1 2
   
(1) A = 
 2 3 0 . (2) A =  −1
  3 0 .

−1 0 2 2 0 4
9. 用 LDLT 分解法分解下列方程组:
    
2 −1 1 x1 4
    
(1)     
 −1 −2 3   x2  =  5 .
1 3 1 x3 6
    
5 −4 1 x1 12
    
(2) 
 −4 6 −4   x2  =  −1
  
.

1 −4 6 x3 −1
10. 下述矩阵能否分解为 LU (其中, L 为单位下三角阵; U 为上三角阵)?若能分解, 那
么分解是否唯一?
     
1 2 3 1 1 1 1 2 6
     
A=
 2 4 1 
, B=
 2 2 1 
, C=
 2 5 15 
.
4 6 7 3 3 1 6 15 46

11. 证明 kxk∞ = max |xi | 是一种向量范数, 其中, x = (x1 , x2 , · · · , xn )T ∈ Rn .


16j6n
· 164 · 第6章 线性方程组的直接解法

12. 求证:对任意 x = (x1 , x2 , · · · , xn )T ∈ Rn , A = (aij )n×n ∈ Rn×n ,


(1) kxk∞ 6 kxk1 6 n kxk∞ .

(2) kxk∞ 6 kxk2 6 n kxk∞ .
1
(3) √ kxk1 6 kxk2 6 n kxk1 .
n
1
(4) √ kAkF 6 kAk2 6 kAkF .
n
13. 求矩阵 A 的 kAk∞ , kAk1 , kAk2 , kAkF :
 
à ! −2 1 0 à !
1 2   0.6 0.5
(1) A = 
. (2) A =  1 −2 1 . (3) A = .
−3 4  0.1 0.3
0 1 −2
14. 设 A ∈ Rn×n 为对称正定阵, 定义

kxkA = (Ax, x)1/2 ,

证明 kxkA 为 Rn 上向量的一种范数.
15. 设 x = (x1 , x2 , · · · , xn )T ∈ Rn , 试证
à n !1/p
X
lim kxkp = lim |xi |p = max |xi | = kxk∞ .
p→+∞ p→+∞ 16i6n
i=1

16. 对于 Ã !
2 6
A= ,
2 0.0001
(1) 研究矩阵 A 的性态.
(2) 分别解方程组
à ! à !
8 8
① Ax = , ② Ax = .
8.00001 8.00002

17. 已知方程组 (
x1 + 0.99x2 = 1,
0.99x1 + 0.98x2 = 1,
的解为 x1 = 100, x2 = −100. 试计算其系数矩阵的条件数, 并就近似解 x1 = 1, x2 = 0 和
x1 = 100.5, x2 = −99.5 分别计算其残向量 r, 并讨论本题的计算结果说明什么问题.
第7章 解线性方程组的迭代法
对于线性方程组
Ax = b, (7.1)
其中      
a11 a12 ··· a1n x1 b1
     
 a21 a22 ··· a2n   x2   b2 
     
A= . .. .. , x =  .. , b =  .. .
 .. . .   .   . 
     
an1 an2 ··· ann xn bn
A 为非奇异矩阵时, 当 A 为阶数不太高且稠密的矩阵时, 上章讨论的直接解法是
非常有效的. 但对由工程技术中产生的大型稀疏矩阵方程组 (A 的阶数 n 很大, 但
有较多零元素), 为了减少计算量、节约内存、充分利用 A 中有大量零元素的特点,
使用迭代方法求解方程组 (7.1) 更为合适.
仿非线性方程组迭代解法的思想, 我们同样可以先将方程组 (7.1) 改写成适合
建立迭代格式的等价方程组
x = Gx + g, (7.2)
据此建立迭代公式
x(k+1) = Gx(k) + g, k = 0, 1, 2, · · · . (7.3)
³ ´T © ª
(0) (0) (0)
设初始向量为 x(0) = x1 , x2 , · · · , xn , 由公式 (7.3) 得到一向量序列 x(k) .
如果存在一个向量 x∗ = (x∗1 , x∗2 , · · · , x∗n )T 使得 lim x(k) = x∗ , 那么可以证明向
k→∞
量 x∗ 是线性方程组 (7.1) 的解. 但是矩阵 G 和向量 g 等于什么?是否一定有
lim x(k) = x∗ ? 这就是我们本章讨论的内容.
k→∞

7.1 雅可比 (Jacobi) 迭代法与赛德尔 (Seidel) 迭代法


7.1.1 Jacobi 迭代法

n 阶线性方程组 (7.1) 为


 a11 x1 + a12 x2 + · · · + a1n xn = b1 ,


 a x + a x + ··· + a x = b ,
21 1 22 2 2n n 2
(7.4)

 ······



an1 x1 + an2 x2 + · · · + ann xn = bn .
· 166 · 第7章 解线性方程组的迭代法

如果假定 aii 6= 0 (i = 1, 2, · · · , n), 则可把方程组 (7.4) 改写成



 1

 x1 = a11 (b1 − 0 − a12 x2 − a13 x3 − · · · − a1n xn ) ,





 1
x2 = (b2 − a21 x1 − 0 − a23 x3 − · · · − a2n xn ) ,
a22



 ······



 1
 xn = (bn − an1 x1 − an2 x2 − · · · − an,n−1 xn−1 ) .
ann

据此建立迭代公式

 (k+1) 1 ³ (k) (k) (k)
´

 x = b 1 − a12 x − a13 x − · · · − a1n xn ,


1
a11 2 3

 ³ ´
 x(k+1) = 1 b − a x(k) − a x(k) − · · · − a x(k)

,
2 2 21 1 23 3 2n n
a22 (7.5)



 ······



 (k+1) 1 ³ (k) (k) (k)
´
 xn = bn − an1 x1 − an2 x2 − · · · − an,n−1 xn−1 ,
ann

即  
n
X
(k+1) 1  (k) 
xi = bi − aij xj  , i = 1, 2, · · · , n. (7.6)
aii j=1
j6=i

³ ´T
如果给定初始向量 x(0) = x(0)
1 , x
(0)
2 , · · · , x
(0)
n , 那么由公式 (7.5) 或公式 (7.6)
© (k) ª
得到一个向量序列 x , 这一方法称为Jacobi 迭代法或简单迭代法.

7.1.2 Gauss-Seidel 迭代法


© ª
显然, 如果由迭代格式 (7.5) 得到的序列 x(k) 收敛于 x∗ = (x∗1 , x∗2 , · · · , x∗n )T ,
则 x(k+1)
i 应该能比 x(k)
i 更接近于方程组 (7.4) 的解 x∗i (i = 1, 2, · · · , n). 而由于是
按方程的次序逐个进行迭代的, 因此, 在迭代过程中进行第 i 个方程迭代时, 可以
用上面 i − 1 个方程迭代已得到的 x(k+1)
j
(k)
(1 6 j 6 i − 1) 来替换 xi , 这样可期望得
到更好的数值效果. 即在迭代过程一旦有 “好” 的分量值产生, 就立即将它用到正
在进行的迭代格式中, 这样, 公式 (7.5) 就可写成

 (k+1) 1 ³ (k) (k) (k)
´

 x1 = b 1 − a12 x2 − a13 x3 − · · · − a 1n xn ,

 a11

 ³ ´
 x(k+1) = 1 b − a x(k+1) − a x(k) − · · · − a x(k) ,
2 2 21 1 23 3 2n n
a22 (7.7)



 ······

 ³ ´

 x(k+1) 1 (k+1) (k+1) (k+1)
n = bn − an1 x1 − an2 x2 − · · · − an,n−1 xn−1 .
ann
7.1 雅可比 (Jacobi) 迭代法与赛德尔 (Seidel) 迭代法 · 167 ·

这种方法称为Gauss-Seidel 迭代法, 简称为Seidel 迭代法. 类似地, 式 (7.7) 可简


写为
 
i−1
X Xn
(k+1) 1 bi − (k+1) (k)
xi = aij xj − aij xj  , i = 1, 2, · · · , n. (7.8)
aii j=1 j=i+1

对于 Jacobi 迭代公式 (7.5) 和 Seidel 迭代公式 (7.7), 它们的收敛准则可仿非


线性方程求根的迭代法处理, 设 ε 为允许的误差, 则可以通过检验
¯ ¯
¯ (k+1) (k) ¯
max ¯xi − xi ¯ < ε
16i6n

以决定是否终止迭代. 并且为防止不收敛或者收敛太慢, 可以设置迭代次数控制 N ,


当 k > N 时, 则迭代失败. 为方便起见, 一般就取这两种迭代公式的初值 x(0) =
T
(0, 0, · · · , 0) .
例 7.1 分别用 Jacobi 迭代法和 Seidel 迭代法求解线性方程组


 10x1 − x2 − 2x3 = 7.2,

−x1 + 10x2 − 2x3 = 8.3,


 −x − x + 5x = 4.2.
1 2 3

解:把方程组改写成

 1

 x1 = (7.2 + x2 + 2x3 ),

 10

1
x2 = (8.3 + x1 + 2x3 ),

 10


 x3 = 1 (4.2 + x1 + x2 ).

5
据此建立 Jacobi 迭代公式为

 (k+1) 1 ³ (k) (k)
´

 x1 = 7.2 + x2 + 2x3 ,

 10

(k+1) 1 ³ (k) (k)
´
x2 = 8.3 + x1 + 2x3 , k = 0, 1, 2, · · · .

 10

 1 ³ ´

 x (k+1) (k) (k)
3 = 4.2 + x1 + x2 ,
5
类似地, Seidel 迭代公式为

 (k+1) 1 ³ (k) (k)
´

 x1 = 7.2 + x2 + 2x3 ,

 10

(k+1) 1 ³ (k+1) (k)
´
x2 = 8.3 + x1 + 2x3 , k = 0, 1, 2, · · · .

 10

 ³ ´
 x(k+1) = 1 4.2 + x(k+1) + x(k+1) ,

3 1 2
5
· 168 · 第7章 解线性方程组的迭代法

以上两种迭代公式的初值都取 x(0) = (0, 0, 0)T , 具体计算结果如表 7-1 所示.

表 7-1 例 7.1 中 Jacobi 迭代法与 Seidel 迭代法计算结果


步数 Jacobi 迭代法 Seidel 迭代法
(k) (k) (k) (k) (k) (k)
k x1 x2 x3 x1 x2 x3
0 0 0 0 0 0 0
.. .. .. .. .. .. ..
. . . . . . .
5 1.095 01 1.195 01 1.294 14 1.099 89 1.199 93 1.299 96
6 1.098 34 1.198 34 1.298 04 1.099 99 1.199 99 1.300 00
7 1.099 44 1.199 44 1.299 35
8 1.099 81 1.199 81 1.299 78
9 1.099 94 1.199 94 1.299 92

事实上, 方程组的准确解为 x∗ = (1.1, 1.2, 1.3)T , 可见由 Jacobi 迭代法或 Seidel


© ª
迭代法产生的向量序列 x(k) 确能逼近方程组的精确解 x∗ , 而且 Seidel 迭代法也
确能有比 Jacobi 迭代法更好的数值效果. 但并不是任何一种迭代格式都能最终求
得方程组的解.
例 7.2 用迭代法解方程组
(
x1 + 2x2 = 5,
3x1 + x2 = 5.

解:同样将方程组改写为
(
x1 = 5 − 2x2 ,
x2 = 5 − 3x1 .

据此建立迭代格式
( (k+1) (k)
x1 = 5 − 2x2 ,
(k+1) (k) k = 0, 1, 2, · · · .
x2 = 5 − 3x1 ,

取 x(0) = (0, 0)T , 计算结果如表 7-2 所示.

表 7-2 迭代法发散的计算结果
k 0 1 2 3 4 5 6 ···
(k)
x1 0 5 −5 25 −35 145 −215 ···
(k)
x2 0 5 −10 20 −70 110 −430 ···

由此看出, 随着 k 的增大, x(k) 与精确解 x∗ = (1, 2)T 相差越来越大, 这样的


迭代过程称为发散的. 为了便于分析迭代方法的敛散情况, 下面我们将迭代格式用
矩阵形式表示.
7.1 雅可比 (Jacobi) 迭代法与赛德尔 (Seidel) 迭代法 · 169 ·

7.1.3 迭代公式的矩阵表示
对于线性方程组 (7.1), 若系数矩阵 A 为非奇异, 且 aii 6= 0 (i = 1, 2, · · · , n), 则
可将 A 分解为
A = D − L − U,

其中
 
  0
a11  
   a21 0 
 a22   
   
D= .. , L = −  a31 a32 0 ,
 .   . .. .. 
   . . 
 . . 
ann
an1 an2 · · · ··· 0
 
0 a12 a13 ··· a1n
 
 0 a23 ··· a2n 
 
 .. 
U = −
 0 . .

 .. 
 . 
 
0
由 Jacobi 迭代公式,
 
i−1
X n
X
(k+1) 1  (k) (k)
xi = bi − aij xj − aij xj  , i = 1, 2, · · · , n,
aii j=1 j=i+1

可得向量矩阵表示
h i
x(k+1) = D −1 (b + Lx(k) + U x(k) ) = D −1 (L + U )x(k) + b
= (I − D −1 A)x(k) + D −1 b. (7.9)

类似地, 由 Seidel 迭代公式


 
i−1
X Xn
(k+1) 1 b i − (k+1) (k)
xi = aij xj − aij xj  , i = 1, 2, · · · , n,
aii j=1 j=i+1

可得向量矩阵形式

x(k+1) = D −1 (b + Lx(k+1) + U x(k) ),


(D − L)x(k+1) = U x(k) + b.
· 170 · 第7章 解线性方程组的迭代法

所以有
x(k+1) = (D − L)−1 U x(k) + (D − L)−1 b. (7.10)

将它们写成统一的迭代形式

x(k+1) = Gx(k) + g, k = 0, 1, 2, · · · . (7.11)

G 称为迭代矩阵. 显然有

Jacobi 迭代法:GJ = I − D −1 A, g J = D −1 b,
Seidel 迭代法:GS = (D − L)−1 U , g S = (D − L)−1 b.

7.2 迭代法的收敛性
7.2.1 迭代法收敛的充要条件
由于统一的迭代格式 (7.11) 来源于线性方程组 Ax = b 的等价方程组 x =
Gx + g, 若 x∗ 是方程组 Ax = b 的精确解, 则有

x∗ = Gx∗ + g. (7.12)

由式 (7.11) 和 (7.12), 于是有


³ ´ ³ ´
x(k) − x∗ = G x(k−1) − x∗ = Gk x(0) − x∗ . (7.13)
© ª
因此, 当初始向量 x(0) 不是方程组的解时, 向量序列 x(k) 是否收敛于向量
x∗ 依赖于矩阵 Gk 是否收敛于零矩阵, 即矩阵 G 是否是收敛的 (定义 6.7). 首先
给出下面的定理:
定理 7.1 如果矩阵 G 的谱半径 ρ(G) < 1, 那么 (I − G)−1 存在且

(I − G)−1 = I + G + G2 + · · · .

证明:设 λ 是矩阵 G 的任一特征值, 则 1 − λ 是矩阵 I − G 的特征值. 因为


|λ| 6 ρ(G) < 1, 所以矩阵 I − G 的特征值非零. 因而, 矩阵 I − G 可逆.
令 S m = I + G + G2 + · · · + Gm , 那么

(I − G)S m = I − Gm+1 .

由定理 6.7 知矩阵 G 是收敛的, 因而

lim (I − G)S m = lim (I − Gm+1 ) = I.


m→∞ m→∞
7.2 迭代法的收敛性 · 171 ·

从而 lim S m = (I − G)−1 .
m→∞ © ª
因此, 当 x(0) 不是方程的解时, x(k) 能否收敛于 x∗ 取决于 Gk 能否收敛于
零矩阵. 为此给出:
定理 7.2 (迭代法基本原理) 对任意初始向量 x(0) , 则由迭代公式

x(k+1) = Gx(k) + g, k = 0, 1, · · · ,
© ª
产生的向量序列 x(k) 收敛到 x = Gx + g 的唯一解的充要条件是 ρ(G) < 1.
证明:(必要性) 由迭代公式得

x(k) = Gx(k−1) + g = G(Gx(k−2) + g) + g


= Gk x(0) + (Gk−1 + Gk−2 + · · · + G + I)g.

如果 ρ(G) < 1, 由定理 6.7 有 lim Gk x(0) = 0. 根据定理 7.1 得


k→∞

lim x(k) = (I − G)−1 g,


k→∞

即 x = Gx + g 的唯一解.
© ª
(充分性) 反过来, 如果向量序列 x(k) 收敛到 x = Gx + g 的唯一解, 记为
x∗ = (I − G)−1 g, 那么由式 (7.13) 得
³ ´
lim (x(k) − x∗ ) = lim Gk x(0) − x∗ = 0,
k→∞ k→∞

由定理 6.7 得到 ρ(G) < 1.


这一结论说明, 迭代公式 (7.11) 的收敛性仅与迭代矩阵的谱半径有关, 即线性
方程组 Ax = b 的系数矩阵相关. 而对于 Jacobi 迭代公式和 Seidel 迭代公式而言,
既然 Seidel 迭代公式是在 Jacobi 迭代公式的基础上延伸出来的, 那么这两种迭代
公式对相同的线性方程组而言, 它们的收敛性之间是否有联系呢?
例 7.3 对于系数矩阵
   
1 2 −2 2 −1 1
   
A=  
 1 1 1 , B =  1 1 1 
,
2 2 1 1 1 −2

试分别讨论 Jacobi 迭代法和 Seidel 迭代法关于 A, B 的收敛性.


解:(1) 关于系数矩阵 A
① 对 Jacobi 迭代法, 由于
 
0 −2 2
 
GJ =  
 −1 0 −1  ,
−2 −2 0
· 172 · 第7章 解线性方程组的迭代法


det(λI − GJ ) = λ3 ,

即 λ1 = λ2 = λ3 = 0. 从而 ρ(GJ ) = 0 < 1, 所以 Jacobi 迭代法收敛.


② 对 Seidel 迭代法, 由于
 
0 −2 2
 
GS =  0 2 −3  ,

0 0 2


det(λI − GS ) = λ(λ − 2)2 ,

从而 λ1 = 0, λ2 = λ3 = 2. 有 ρ(GS ) = 2 > 1. 因此, Seidel 迭代法是发散的.


(2) 关于系数矩阵 B
① 对 Jacobi 迭代法, 由于
 
1 1
0 −
 2 2 
 
GJ =  −1 0 −1  ,
 1 1 
0
2 2
故 µ ¶
5
det(λI − GJ ) = λ λ2 + ,
4
√ √ √
5 5 5
即 λ1 = 0, λ2 = i, λ3 = − i. 从而 ρ(GJ ) = > 1, 因此 Jacobi 迭代发散.
2 2 2
② 对 Seidel 迭代法, 由于
 
1 1
0 −
 2 2 
 
 1 1 
GS =  0 − − ,
 2 2 
 1 
0 0 −
2
故 µ ¶2
1
det(λI − GS ) = λ λ + ,
2
1 1
即 λ1 = 0, λ2 = λ3 = − . 从而 ρ(GS ) = < 1, 所以, Seidel 迭代法是发散的.
2 2
由对 A, B 两矩阵的讨论可见, Jacobi 迭代法和 Seidel 迭代法的收敛性无任何
联系.
7.2 迭代法的收敛性 · 173 ·

对于收敛速度, 由式 (7.13) 知
³ ´
x(k) − x∗ = Gk x(0) − x∗ .
¡ ¢
因此, 若迭代格式 (7.11) 收敛, 其收敛速度取决于 Gk x(0) − x∗ → 0 的快慢程度.
设迭代矩阵 G 有 n 个线性无关的特征向量 u1 , u2 , · · · , un , 其相应的特征值满

|λ1 | > |λ2 | > · · · > |λn |.

对于 x(0) − x∗ , 存在 n 个常数满足

x(0) − x∗ = α1 u1 + α2 u2 + · · · + αn un .


n
X
(k) ∗ k (0) ∗
x − x = G (x −x )= αi λki ui .
i=1
¡ ¢
可以看出 x(k) − x∗ → 0(k → ∞) 的速度取决于谱半径 ρ(G) = |λ1 | < 1 小于 1 的
速度, 即当 ρ(G)(< 1) 越小时, 式 (7.11) 收敛越快, 而若 ρ(G) ≈ 1, 收敛就很慢, 因
此可以用量 ρ(G) 来刻画迭代法的收敛快慢.
定义 7.1 称 R(G) = − ln ρ(G) 为迭代法的收敛速度.
由此看出, ρ(G)(< 1) 越小, − ln ρ(G) 就越大, 式 (7.11) 收敛速度就越快. 就
Jacobi 迭代法和 Seidel 迭代法而言, 一般地, 由于这两种迭代的收敛性之间无任何
联系, 故它们的收敛速度也就不能明确地比较. 但大量数据实验表明. 在两种迭代
法都收敛的情况下, Seidel 迭代法通常有更好的数值效果. 例 7.1 的数值效果表明了
这一点. 基于这种现状, 从一定意义上我们也不可武断地说 Seidel 迭代法比 Jacobi
迭代法 “好”.
7.2.2 迭代法收敛的充分条件
当方程组阶数 n 比较大时, 矩阵特征值计算比较困难, 使基本定理 7.2 的条
件不易验证, 所以最好能建立与迭代矩阵元素直接有关的条件来判别迭代法的收
敛性.
定理 7.3 若矩阵 G ∈ Rn×n 的某种算子范数 kGk < 1, 则矩阵 I − G 是非
奇异阵.
证明:用反证法. 若 I − G 是奇异阵, 则有非零向量 x 6= 0 ∈ Rn , 使得

(I − G)x = 0,


x = Gx.
· 174 · 第7章 解线性方程组的迭代法

由范数的相容性条件
kxk = kGxk 6 kGk · kxk ,

而 x 6= 0, 故
kGk > 1,

与定理条件矛盾, 证毕.
定理 7.4 若迭代矩阵 G 的某种算子范数 kGk < 1, 则对任意的初值 x(0) , 由
迭代格式
x(k+1) = Gx(k) + g, k = 0, 1, · · · ,
© ª
产生的序列 x(k) 均收敛于方程组 x = Gx + g 的唯一解 x∗ .
证明:因为 kGk < 1, 由定理 7.3 知矩阵 I − G 可逆. 从而方程组 x = Gx + g
有唯一解 x∗ = (I − G)−1 g. 由定理 6.5 有

ρ(G) 6 kGk < 1.

根据定理 7.2, 对任意初始向量 x(0) , 由迭代格式

x(k+1) = Gx(k) + g, k = 0, 1, · · · ,
© ª
产生的序列 x(k) 收敛于 x∗ .
例 7.4 考察用 Jacobi 迭代法解方程组


 8x1 − 3x2 + 2x3 = 20,

4x1 + 11x2 − x3 = 33,


 6x + 3x + 12x = 36,
1 2 3

的收敛性.
解:由于方程组的系数矩阵为
 
8 −3 2
 
A=
 4 11 −1 
,
6 3 12

故 Jacobi 迭代法得迭代法矩阵为
 
3 1
0 −
 8 4 
 
 4 1 
GJ =  − 0 .
 11 11 
 1 1 
− − 0
2 4
7.2 迭代法的收敛性 · 175 ·

而迭代矩阵 GJ 的 ∞-范数为
½ ¾
5 5 3 3
kGJ k∞ = max , , = < 1.
8 11 4 4

故 Jacobi 迭代法是收敛的.
值得提出的是:定理 7.4 是充分判别条件, 即当定理 7.4 的条件不满足时, 得
不出迭代不收敛的结论. 例如, 迭代矩阵为
à !
0.9 0
G= ,
0.3 0.8

则 kGk1 = 1.2, kGk2 = 1.043, kGk∞ = 1.1, kGkF = 1.54. 虽然 G 的这些范数均
大于 1, 但 G 的特征值为 λ1 = 0.9, λ2 = 0.8. 由定理 7.2 知, 迭代是收敛的.
7.2.3 系数矩阵是对角占优情形
从充分判别条件可以得到一定的启发, 即要建立收敛的迭代公式时应使迭代矩
阵所有元素的绝对值都尽量小些, 也就是说, 在建立迭代格式之前, 我们应先适当
调整方程组的次序, 把绝对值较大的元素调整到系数矩阵的对角元位置. 而对于系
数矩阵为对角占优的方程组是不需要进行调整的, 那么用于这类方程组的迭代方法
的收敛性如何呢?
定理 7.5 如果矩阵 A ∈ Rn×n 是严格对角占优矩阵, 则 A 非奇异.
证明:因为 A 为严格对角占优矩阵, 则其主对角元 aii (i = 1, 2, · · · , n) 全不为
零. 故对角线矩阵
D = diag (a11 , a22 , · · · , ann )

非奇异.
考察矩阵
 a12 a13 a1n 
0 − − ··· −
 a11 a11 a11 
 
 a21 a23 a2n 
 − 0 − ··· − 
I − D −1 A = 
 a. 22 a22 a22 ,

 .. .. .. .. 
 . . . 
 an1 an2 an3 
− − − ··· 0
ann ann ann

由于 A 严格对角占优, 则
Xn ¯ ¯ Xn
° ° ¯ aij ¯
°I − D −1 A° = max ¯ ¯ = max 1 |aij | < 1. (7.14)
∞ i ¯ aii ¯ i |aii | j=1
j=1
j6=i j6=i
· 176 · 第7章 解线性方程组的迭代法

故由定理 7.3 知
¡ ¢
I − I − D −1 A = D −1 A

为非奇异, 从而矩阵 A 也非奇异. 证毕.


定理 7.6 如果 A ∈ Rn×n 是严格对角占优矩阵, 则方程组 Ax = b 的 Jacobi
迭代法和 Seidel 迭代法均收敛.
证明:对 Jacobi 迭代法, 迭代矩阵为
° °
kGJ k∞ = °I − D −1 A°∞ < 1,

故 Jacobi 迭代法收敛.
下面证明 Seidel 迭代法的收敛性. 由于其迭代矩阵为
−1
GS = (D − L) U.

设 λ 是 GS 的任意一个特征值, 则 λ 应满足

det (λI − GS ) = 0.


³ ´
−1
det (λI − GS ) = det λI − (D − L) U
³ ´
−1
= det (D − L) [λ (D − L) − U ]
³ ´
−1
= det (D − L) det (λ (D − L) − U ) .
³ ´
由于 A 的严格对角占优, 则 aii 6= 0 (i = 1, 2, · · · , n), 所以 det (D−L)−1 6= 0,
因此必有
det (λ (D − L) − U ) = 0.

现在只要证明只有 |λ| < 1, 否则 det (λ (D − L) − U ) 6= 0.


事实上, 如果 |λ| > 1, 记 C = λ (D − L) − U , 则
 
λa11 a12 · · · a1n
 
 λa21 λa22 · · · a2n 
 
C= . .. ..  .
 .. . . 
 
λan1 λan2 · · · λann

因为
n
X
|aii | > |aij |, i = 1, 2, · · · , n,
j=1
j6=i
7.2 迭代法的收敛性 · 177 ·

从而
n
X i−1
X n
X
|λaii | > |λaij | > |λaii | + |aij |, i = 1, 2, · · · , n.
j=1 j=1 j=i+1
j6=i

这说明当 |λ| > 1 时矩阵也是严格对角矩阵, 由定理 7.5 知

det(C) = det (λ (D − L) − U ) 6= 0.

故只有 |λ| < 1, 而由 λ 的任意性得 ρ (GS ) < 1, 因此 Seidel 迭代法收敛.


例 7.5 对于方程组


 x1 + 5x2 − x3 = 2,

5x1 − 2x2 + x3 = 4,


 2x + x − 5x = −11,
1 2 3

试建立解此方程组的收敛的 Seidel 迭代格式并说明收敛理由.


解:将原方程组调整为


 5x1 − 2x2 + x3 = 4,

x1 + 5x2 − x3 = 2,


 2x + x − 5x = −11,
1 2 3

进而将其改写成 
 1

 x1 = (4 + 2x2 − x3 ) ,

 5

1
x2 = (2 − x1 + x3 ) ,

 5

 1

 x3 = (11 + 2x1 + x2 ) .
5
据此建立 Seidel 迭代格式为

 (k+1) 1³ (k) (k)
´

 1x = 4 + 2x 2 − x3 ,

 5
 ³ ´
(k+1) 1 (k+1) (k)
x2 = 2 − x1 + x3 , k = 0, 1, 2, · · · .

 5

 ³ ´
 x(k+1) = 1 11 + 2x(k+1) + x(k+1) ,

3 1 2
5
上述 Seidel 迭代公式对任意初值 x(0) 都是收敛的. 因为调整后的线性方程组的系
数矩阵  
5 −2 1
 
A= 1 5 −1 

2 1 −5
是严格对角占优的.
· 178 · 第7章 解线性方程组的迭代法

7.3 迭代法的误差估计
在前面导出 Jacobi 迭代法和 Seidel 迭代法时, 我们曾仿非线性方程求根迭代
处理, 以检验
¯ ¯
¯ (k+1) (k) ¯
max ¯xi − xi ¯ < ε
16i6n

作为线性方程组迭代法的终止准则. 事实上, 这种检验手段是有一定理论依据的.


定理 7.7 若迭代公式

x(k+1) = Gx(k) + g, k = 0, 1, 2, · · · ,

中的迭代矩阵 G 的某种算子范数 kGk = q < 1, 则


° ° q ° °
(1) °x(k) − x∗ ° 6 °x(k) − x(k−1) °.
1−q
° (k) ° qk ° °
(2) °x − x∗ ° 6 °x(1) − x(0) °.
1−q
其中, x∗ 是方程组 x = Gx + g 的精确解.
证明:(1) 由于

x(k+1) = Gx(k) + g, x(k) = Gx(k−1) + g, x∗ = Gx∗ + g,


° ° ° ³ ´°
° (k+1) ° ° °
°x − x(k) ° = °G x(k) − x(k−1) °
° ° ° °
° ° ° °
6 kGk· °x(k) −x(k−1) ° = q °x(k) −x(k−1) ° , k = 1, 2, 3, · · · , (7.15)


° ° ° ³ ´° ° ° ° °
° (k+1) ° ° ° ° ° ° °
°x − x∗ ° = °G x(k) − x∗ ° 6 kGk · °x(k) − x∗ ° = q °x(k) − x∗ ° .

从而
° ° ° ° ° ° ° °
° (k) ° ° ° ° ° ° °
°x − x∗ ° = °x(k) − x(k+1) + x(k+1) − x∗ ° 6 °x(k+1) − x(k) ° + °x(k+1) − x∗ °
° ° ° °
° ° ° °
6 q °x(k) − x(k−1) ° + q °x(k) − x∗ ° ,


° ° ° °
° ° ° °
(1 − q) °x(k) − x∗ ° 6 q °x(k) − x(k−1) ° .
7.4 超松弛迭代 (SOR) 法 · 179 ·

由于 kGk = q < 1, 故
° ° q ° °
° (k) ° ° (k) °
°x − x∗ ° 6 °x − x(k−1) ° . (7.16)
1−q
(2) 反复利用式 (7.15) 可得
° ° ° °
° (k) ° ° °
°x − x(k−1) ° 6 q (k−1) °x(1) − x(0) ° .

将上式代入式 (7.16) 即得
° ° qk ° °
° (k) ° ° (1) °
°x − x∗ ° 6 °x − x(0) ° .
1−q
证毕.
1
显然, 若在式 (7.16) 中选取的是 k·k∞ , 且当迭代矩阵的 kGk∞ 6 时, 则有
2
° ° q ° ° ° ° ¯ ¯
° (k) ° ° ° ° ° ¯ (k) (k−1) ¯
°x −x∗ ° 6 °x(k) −x(k−1) ° 6 °x(k) −x(k−1) ° = max ¯xi − xi ¯.
∞ 1−q ∞ ∞ 16i6n

这就是终止准则的一些理论依据所在.

7.4 超松弛迭代 (SOR) 法


由上面的讨论我们知道, 迭代方法的收敛性和收敛速度仅与迭代矩阵 G 的谱
半径相关, 即当迭代格式建立后, 若收敛, 则其收敛速度也就固定下来了. 实际应用
中, 如果我们采用数值效果相对较好一些的 Seidel 迭代法, 收敛速度仍太慢, 那么
能否采取一定的补救措施呢?
对于方程组 (7.1), 设有近似结果 x(k) i (i = 1, 2, · · · , n), 则可用数值效果较好的
Seidel 迭代法 (假设是收敛的) 得新的近似
 
i−1
X Xn
(k+1) 1  (k+1) (k) 
x̃i = bi − aij xj − aij xj , i = 1, 2, · · · , n.
aii j=1 j=i+1

由于 x(k) (k+1)
i , x̃i 都是 x∗i (i = 1, 2, · · · , n) 的某种程度的近似, 我们把两近似结果进
行适当的线性组合为 x∗i 更新的近似, 则有
(k+1) (k) (k+1)
xi = (1 − ω)xi + ωx̃i , i = 1, 2, · · · , n,

其中, ω 是待定参数, 称为松弛因子. 于是有


 
i−1
X Xn
(k+1) (k) ω bi − (k+1)
xi = (1 − ω)xi + aij xj − aij xkj 
aii j=1 j=i+1
· 180 · 第7章 解线性方程组的迭代法

 
i−1
X Xn
(k) ω bi − (k+1)
= xi + aij xj − aij xkj  , i = 1, 2, · · · , n. (7.17)
aii j=1 j=i

如果能选取适当的 ω, 就可期望式 (7.17) 的组合数值效果能比 Seidel 迭代法


更好. 这样的迭代方法称为松弛迭代法. 一般地说, 当 ω < 1 时, 称为低松弛法; 当
ω = 1 时, 就是 Seidel 迭代法; 当 ω > 时, 称为超松弛法.
类似于 Jacobi 迭代法和 Seidel 迭代法的矩阵向量表示形式的讨论, 一样沿用
系数矩阵 A 的分解记号. 对于迭代格式 (7.17), 则有

x(k+1) = x(k) + ωD −1 [b + Lx(k+1) + (U − D)x(k) ],


Dx(k+1) = Dx(k) + ωb + ωLx(k+1) + ω(U − D)x(k) .

于是

x(k+1) = (D − ωL)−1 [(1 − ω)D + ωU ]x(k) + ω(D − ωL)−1 b, k = 0, 1, 2, · · · .

对照统一迭代格式 (7.11), 则松弛迭代法的迭代矩阵为

Gω = (D − ωL)−1 [(1 − ω)D + ωU ], g ω = ω(D − ωL)−1 b. (7.18)

从而根据定理 7.2, 则有:


定理 7.8 对线性方程组 Ax = b, 若 aii 6= 0(i = 1, 2, · · · , n), 则解此方程组的
松弛方法式 (7.17) 收敛的充要条件是

ρ(Gω ) < 1.

显然, 松弛法式 (7.17) 的收敛性与我们选取的松弛因子 ω 有关, 那么如何确定


ω 的选取范围呢?对此有:
定理 7.9 设求解线性方程组 Ax = b[aii 6= 0(i = 1, 2, · · · , n)] 的松弛方法式
(7.17) 收敛, 则必有 0 < ω < 2.
证明:因为迭代公式(7.17) 是收敛的, 所以

ρ(Gω ) < 1.

设矩阵 Gω 的特征值为 λ1 , λ2 , · · · , λn , 有

n
det(Gω ) = |λ1 · λ2 · · · · λn | 6 [ρ(Gω )] .
习 题 7 · 181 ·

由式 (7.18) 得到
¡ ¢
det(Gω ) = det (D − ωL)−1 det ((1 − ω)D + ωU ) = (1 − ω)n .

从而
|1 − ω| 6 ρ(Gω ) < 1,


0 < ω < 2.

定理 7.9 的结论说明:只有当 0 < ω < 2 时, 松弛方法式 (7.17) 才可能收敛, 即


松弛因子满足 0 < ω < 2 是松弛迭代收敛的必要条件. 但当方程组的系数矩阵是对
称正定时, 我们有:
定理 7.10 对方程组 Ax = b, 如系数矩阵 A ∈ Rn×n 对称正定, 且 0 < ω < 2,
则解此方程组的松弛迭代法式 (7.17) 收敛.
证明:略.

习 题 7
1.对于方程组 

 5x1 + 2x2 + x3 = −12,

−x1 + 4x2 + 2x3 = 20,


 2x − 3x + 10x = 3,
1 2 3

分别写出解此方程组的 Jacobi 迭代格式和 Seidel 迭代格式以及它们的迭代矩阵.


2.设方程组的系数矩阵为
 
a 1 3
 
A=
 1 a 2 
,
−3 2 a

试求 Jacobi 迭代法收敛时 a 的取值范围.


3.对于方程组     
1 0.4 0.5 x1 1
    
 0.5 0.8     
 1   xx  =  2  ,
0.4 0.8 1 x3 3
试考察解此方程组的 Jacobi 迭代法和 Seidel 迭代法的收敛性.
4.对于方程组     
1 6 −2 x1 1
    
 3 5     
 −2   x2  =  1  ,
4 1 −1 x3 1
· 182 · 第7章 解线性方程组的迭代法

试建立解此方程组的收敛的 Jacobi 迭代格式和 Seidel 迭代格式, 并分别说明其收敛的理由.


5.对于方程组 Ax = b, 如果系数矩阵 A ∈ Rn×n 为严格对角占优矩阵, 证明此方程组
的 Seidel 迭代法的迭代矩阵 GS 满足

kGS k∞ < 1.

6. 设有方程组 Ax = b, 其中 A 为对称正定矩阵, 对于迭代公式

x(k+1) = x(k) + ω(b − Ax(k) ), k = 0, 1, 2, · · · ,


2
试证:当 0 < ω < 时, 上述迭代法收敛 [其中, A 的特征值满足 0 < α 6 λ(A) 6 β].
β
7. 设方程组 Ax = b 中的 A 为严格对角占优矩阵, 证明:当 0 < ω < 1 时, 解此方程组
的松弛迭代法是收敛的.
第8章 矩阵的特征值与特征向量计算
许多实际的工程技术问题, 如各种类型的振动问题、控制系统的稳定性问题等,
最后往往归结为求矩阵的特征值和特征向量. 而由线性代数知识可知, 理论上矩阵
A 的所有特征值能从特征方程

det(A − λI) = 0 (8.1)

中求得. 但首先 det(A − λI) 很难求, 其次求代数方程 (8.1) 所有根的计算过程并


不方便, 有时甚至非常困难, 所以这种办法缺乏实用意义. 因此, 我们需要研究求矩
阵 A 的特征值和特征向量的计算方法.

8.1 幂法与反幂法
8.1.1 幂法
某些应用场合下通常不需要知道矩阵的全部特征值和特征向量, 而仅要求得到
矩阵的按模最大的特征值 (或称为矩阵的主特征值) 和相应的特征向量, 如线性方
程组迭代解法的收敛性问题. 这里我们将讨论的幂法正是适用此类问题的方法, 它
是用于求矩阵按模最大特征值及相应的特征向量的一种迭代方法, 尤其适用于稀疏
矩阵的情形. 其算法的思想基于如下结论.
定理 8.1 设矩阵 A ∈ Rn×n 有 n 个线性无关的特征向量 x(i) (i = 1, 2, · · · , n),
其对应的特征值 λi (i = 1, 2, · · · , n) 满足

|λ1 | > |λ2 | > |λ3 | > · · · > |λn | .


n
X
对任意的非零向量 v (0) = αi x(i) ∈ Rn (α1 6= 0), 构造向量序列
i=1

v (k+1) = Av (k) , k = 0, 1, 2, · · · . (8.2)


(k)
vi
lim (k−1)
= λ1 , i = 1, 2, · · · , n, (8.3)
k→∞ vi

其中, vi(k) 表示向量 v (k) 的第 i 个分量.


· 184 · 第8章 矩阵的特征值与特征向量计算

证明:因为 A 有 n 个线性无关的特征向量 x(i) (i = 1, 2, · · · , n), 所以对任给的


非零向量 v (0) 都可用 x(i) (i = 1, 2, · · · , n) 的线性组合表示, 即

v (0) = α1 x(1) + α2 x(2) + · · · + αn x(n) (假设 α1 6= 0).

用 A 构造向量序列 

 v (1) = Av (0) ,



 (2) (1) 2 (0)
 v = Av = A v ,

······



 v = Av (k−1) = Ak v (0) ,
(k)



 ······
由矩阵特征值的定义知

Ax(i) = λi x(i) , i = 1, 2, · · · , n.

v (k) = Ak v (0) =α1 Ak x(1) + α2 Ak x(2) + · · · + αn Ak x(n)


=α1 λk1 x(1) + α2 λk2 x(2) + · · · + αn λkn x(n)
" n µ ¶k #
X λi
k (1) (i)
=λ1 α1 x + αi x . (8.4)
i=2
λ1

同理可得 " #
n
X µ ¶k−1
λi
v (k−1)
= λk−1
1 α1 x (1)
+ αi x (i)
.
i=2
λ1
¯ ¯
¯ λi ¯
又由于 ¯¯ ¯¯ < 1(i = 2, 3, · · · , n), 故对足够大的 k, 有
λ1

v (k) = λk1 (α1 x(1) + ε(k) ),

v (k−1) = λk−1
1 (α1 x(1) + ε(k−1) ), (8.5)

其中, ε(k−1) , ε(k) ∈ Rn , 且当 k → ∞ 时, ε(k−1) , ε(k) → 0 . 当 x(1)


i 6= 0 时, 由式 (8.5)

(k) (1) (k)
vi α1 xi + εi
lim (k−1) = λ1 , lim = λ1 .
k→∞ v k→∞ α x(1) + ε(k−1)
i 1 i i
© ª
这种由已知非零向量 v (0) 和 Ak 构造的向量序列 v (k) 以计算 A 的按模最
大特征值 λ1 的方法称为幂法. 而定理 8.1 的证明过程事实上已给出了幂法的实施
步骤, 但值得说明的是:
8.1 幂法与反幂法 · 185 ·

(1) 任取的非零向量 v (0) 应使 α1 6= 0, 通常可取 v (0) = (1, 1, · · · , 1)T . 事实上,


因舍入误差的影响 α1 最终总不等于零.
(2) 当 k 足够大时, 为避免 λ1 对所选的 i 个分量值的过分依赖, 可用各分量比
(k)
vi
的平均值代替 (k−1) , 即取
vi
n
1 X vi
(k)
λ1 ≈ .
n i=1 v (k−1)
i
(k+1)
(3) 关于 λ1 的特征向量:由于 v = Av (k) , 而 v (k+1) ≈ λ1 v (k) , 即 v (k) 就
是 λ1 的近似特征向量.
(4) 定理 8.1 的结论式 (8.3) 是假定按模最大的特征值是单个的. 若 |λ1 | > |λ2 |
的要求不能满足时, 应视下列不同情形具体分析.
① 当 λ1 = λ2 = · · · = λr (即按模最大的特征值是实 r 重的) 时, 则仿定理 8.2
的证明可得
(k)
vi
(k−1)
→ λ1 , k → ∞,
vi
且有
X r
v (k)
lim = αi x(i) 6= 0 .
k→∞ λ1
i=1

② |λ1 | = |λ2 | , 但 λ1 = −λ2 时, 则有


(k+1)
vi
(k−1)
→ λ2i , k → ∞.
vi

③ |λ1 | = |λ2 |, 但 λ1 = peiθ , λ2 = pe−iθ , 则在迭代过程中相继的 3 个向量


v (k−1) , v (k) 和 v (k+1) 各对应的分量就有近似线性关系

(k+1) (k) (k−1)


vi + pv i + qv i ≈ 0, i = 1, 2, · · · , n.

选定两个分量代入上述关系, 构成二阶线性方程组, 解出 p, q, 再将 p, q 代入一元二


次方程
λ2 + pλ + q = 0,

就可求得矩阵 A 的按模最大的一对复特征值 λ1,2 .


例 8.1 求矩阵  
−1 −1 −2
 

A= 1 1 −80 

0 1 1
· 186 · 第8章 矩阵的特征值与特征向量计算

的按模最大的特征值.
解:取初始向量 v (0) = (0.0003, −0.0119, −0.0003)T , 按式 (8.2) 迭代得数据, 如
表 8-1 所示.

表 8-1 例 8.1 的迭代结果表


(k) (k) (k)
k v1 v2 v3
0 0.0003 −0.0119 −0.0003
1 0.0122 0.0122 −0.0122
2 0 1 0
3 −1 1 1
4 −2 −80 2
5 78 −242 −78

选第 1, 2 分量构成方程组
(
78 − 2p − q = 0,
−242 − 80p + q = 0,

解之得 p = −2, q = 82. 显然这组 p, q 也能使第 3 个分量满足此关系, 由此可以断


定 λ1 , λ2 确为共轭复根, 代入一元二次方程得

λ2 − 2λ + 82 = 0,

解之得 λ1,2 = 1±9i. 事实上该矩阵的 3 个特征值为 λ1 = 1+9i, λ2 = 1−9i, λ3 = −1.


(k)
vi
上述②和③两点的处理方法, 适用于迭代过程式 (8.2) 产生的 (k−1) 总是波动
vi
不定的情形.
另外, 当 k 足够大时, 由式 (8.5) 得

v (k) ≈ α1 λk1 x(1) .

于是当 k → ∞ 时, 有
(k)
(1) 当 |λ1 | > 1 时, vi → ∞.
(k)
(2) 当 |λ1 | < 1 时, vi → 0.
分量的变化太大, 使得计算过程可能产生 “溢出”. 为了克服这一不足, 通常采用规
范化迭代方式. 具体做法为:
任取非零微量 v (0) = u(0) = α1 x(1) + α2 x(2) + · · · + αn x(n) , 同样应使 α1 6= 0,
习惯上, 我们一样可以取 v (0) = (1, 1, · · · , 1)T . 用记号 max(v) 表示向量 v 的绝对
值最大的分量, 构造序列
v (1) Av (0)
v (1) = Au(0) = Av (0) , u(1) = = ,
max(v (1) ) max(Av (0) )
8.1 幂法与反幂法 · 187 ·

A2 v (0) v (2) A2 v (0)


v (2) = Au(1) = , u(2)
= = , (8.6)
max(Av (0) ) max(v (2) ) max(A2 v (0) )
······
Ak v (0) v (k) Ak v (0)
v (k) = Au(k−1) = k−1 (0)
, u(k) = = ,
max(A v ) max(v (k) ) max(Ak v (0) )
······

则有
" n µ ¶k #
X λi (i)
λk1 α1 x(1) + αi x
Ak v (0) i=2
λ1
(k) ( " #)
u = = µ ¶k
max(Ak v (0) ) n
X λi (i)
max λk1 α1 x(1) + αi x
i=2
λ1
" n µ ¶k #
X λi
(1) (i)
α1 x + αi x
i=2
λ1
= " n µ ¶k #
X λi
max α1 x(1) + αi x(i)
i=2
λ1
x(1)
→ , k → ∞.
max(x(1) )

这说明规范化迭代向量序列收敛到按模最大特征值 λ1 对应的特征向量.
同理, 可得到
 " n µ ¶k # 
X λi (i)
 λk1 α1 x(1) + αi x 
 λ1 
max(v (k)
) = max 
 ( " ¶k−1
i=2
n µ #) 

 λi X 
max α1 λk−1
+
1 αi x(1)x (i)

i=2
λ1
" n µ ¶k #
X λi
(1) (i)
max α1 x + αi x
i=2
λ1
=λ1 " n µ ¶k−1 # → λ1 , k → ∞.
X λ i (i)
max α1 x(1) + αi x
i=2
λ1

综合上述分析, 于是有:
定理 8.2 设 A ∈ Rn×n 有 n 个线性无关的特征向量, 其按模最大的特征值
λ1 满足

|λ1 | > |λ2 | > |λ3 | > · · · > |λn | ,


· 188 · 第8章 矩阵的特征值与特征向量计算

则对任意的非零向量 v (0) ∈ Rn , 按下列方法构造的向量序列:




 v (0) = u(0) 6= 0 , α1 6= 0,

 (k)
v = Au(k−1) , k = 1, 2, · · · , (8.7)

 (k) v (k)

 u = ,
max(v (k) )

则有
x(1)
lim max(v (k) ) = λ1 , lim u(k) = . (8.8)
k→∞ k→∞ max(x(1) )
例 8.2 用 (规范化) 幂法计算
 
2 4 6
 
A=
 3 9 15 

4 16 36

的按模最大的特征值和相应的特征向量, 结果精确到 3 位有效数字.


解: 取 v (0) = (1, 1, 1)T , 用矩阵 A 按式 (8.6) 构造向量序列, 具体计算结果如
表 8-2 所示.

表 8-2 用幂法计算的结果
(k) (k) (k) (k) (k) (k)
k v1 v2 v3 u1 u2 u3 λ1
0 1 1 1 1 1 1
1 12.00 27.00 56.00 0.2143 0.4820 1.000 56.00
2 8.357 19.98 44.57 0.1875 0.4483 1.000 44.57
3 8.168 19.60 43.92 0.1860 0.4463 1.000 43.92
4 8.157 19.57 43.88 0.1859 0.4460 1.000 43.88
5 8.156 19.57 43.88 0.1859 0.4460 1.000 43.88

故矩阵 A 的按模最大特征值为 λ1 ≈ 43.88, 其相应的特征向量为

x(1) ≈ (0.1856, 0.4460, 1)T .

事实上矩阵 A 的 3 个特征值 (精确到 10−8 ) 分别为

λ1 = 43.875 516 45, λ2 = 2.798 740 55, λ3 = 0.325 743 01.

8.1.2 幂法的加速

¯ ¯ 从上面的讨论可知, 用幂法计算 A 的按模最大特征值的收敛速度取决于 r =


¯ λ2 ¯
¯ ¯, 当 r 接近于 l 时, 收敛可能很慢. 此时, 一个补救的手段是采用加速收敛方法.
¯ λ1 ¯
8.1 幂法与反幂法 · 189 ·

1. 原点平移法

考察矩阵
B = A − pI,

其中, p 为待选参数.
设 A 的特征值为 λ1 , λ2 , · · · , λn , 则 B 的相应特征值为 λ1 −p, λ2 −p, · · · , λn −p,
且矩阵 A, B 有相同的特征向量.
如果需要计算 A 的按模最大特征值 λ1 , 就可选择适当的 p, 使得 λ1 − p 仍是
B 的按模最大的特征值, 且使
¯ ¯ ¯ ¯
¯ λ2 − p ¯ ¯ λ2 ¯
¯ ¯ ¯ ¯
¯ λ1 − p ¯ < ¯ λ1 ¯ .

从而对矩阵 B 应用幂法, 就能较快地求得 B 的按模最大特征值 λ1 (B), 于是得

λ1 = λ1 (B) + p.

例 8.3 求矩阵  
17 9 5
 
A=
 0 810 

−5 −5 −3

按模最大的特征值, 精确到相邻两次 λ1 估计的绝对误差小于 5×10−4 .


解: 取 v (0) = u(0) = (1, 1, 1)T , 对 A 按式 (8.7) 构造向量序列, 则迭代 25 次
可得满足精度要求的估计值 λ1 ≈ 12.0003. 若取 p = 4, 即对 B = A − 4I 应用幂法
迭代 15 次就可得满足精度要求的结果.
可以看出, 选取适当的 p 确能使幂法有效地加速. 事实上, 对例 8.3 中的矩阵
A, 其特征值分别为 λ1 = 12, λ2 = 8, λ3 = 2. 当 p = 4 时, 显然有
¯ ¯ ¯ ¯
¯ λ 2 − p ¯ 1 ¯ λ2 ¯ 2
¯ ¯= <¯ ¯= .
¯ λ 1 − p ¯ 2 ¯ λ1 ¯ 3

而且可以看出当 p = 5 时, 对 C = A − 5I 应用幂法效果会更佳, 因为

λ1 (C) = 7, λ2 (C) = 3, λ3 (C) = −3,


¯ ¯ ¯ ¯
¯ λ2 (C) ¯ 3 ¯ ¯
¯ ¯ = < 1 < ¯ λ2 ¯ = 2 .
¯ λ1 (C) ¯ 7 2 ¯ λ1 ¯ 3
原点平移的加速方法是一个矩阵变换方法. 这种变换容易计算, 又不破坏矩阵
A 的稀疏性, 但 p 的选择依赖于对 A 的特征值分布的大致了解, 要设计一个自动
选择适当参数 p 的过程是困难的.
· 190 · 第8章 矩阵的特征值与特征向量计算

2. Rayleigh 商加速

原点平移法因选择参数困难不便具体应用, 但当 A 是对称矩阵时, 可用 Rayleigh


商进行有效加速.
定义 8.1 设 A 为 n 阶实对称矩阵, 对于任一非零向量 x, 称
(Ax, x)
R(x) =
(x, x)

为对应于向量 x 的Rayleigh 商.
定理 8.3 设 A ∈ Rn×n 为对称矩阵, 其特征值满足

|λ1 | > |λ2 | > |λ3 | > · · · > |λn | .

相应的特征向量 x(i) (i = 1, 2, · · · , n) 满足
(
1, i = j,
(x(i) , x(j) ) =
0, i 6= j.

则由公式 (8.7) 得到的规范化的向量 u(k) 的 Rayleigh 商为


"µ ¶ #
2k
(Au(k) , u(k) ) λ2
= λ 1 + O .
(u(k) , u(k) ) λ1

证明:由式 (8.6) 得

Ak u(0) Ak+1 u(0)


u(k) = , Au(k) = ,
max(Ak u(0) ) max(Ak u(0) )

那么有
(Au(k) , u(k) ) (Ak+1 u(0) , Ak u(0) )
=
(k)
(u , u )(k)
(Ak u(0) , Ak u(0) )
à n n
! n
X X X
k+1 (i)
αi λi x , k (i)
αi λi x αi2 λ2k+1
i
= Ãi=1n i=1
! = i=1
n
X n
X X
αi λki x(i) , αi λki x(i) αi2 λ2k
i
i=1 i=1 i=1
" n µ ¶2k+1 #
X λi
α12 + αi2 "µ ¶2k #
i=2
λ 1 λ2
=λ1 " n µ ¶2k # = λ1 + O .
X λ i
λ1
2
α12 + αi
i=2
λ1
8.1 幂法与反幂法 · 191 ·

8.1.3 反幂法
反幂法是用来计算矩阵的按模最小特征值及特征向量的方法.
设 A ∈ Rn×n 为非奇异阵, 若 A 的特征值 λi (i = 1, 2, · · · , n) 满足

|λ1 | > |λ2 | > · · · > |λn−1 | > |λn | > 0,

相应的特征向量为 x(1) , x(2) , · · · , x(n) , 则 A−1 的特征值为


¯ ¯ ¯ ¯ ¯ ¯
¯ 1 ¯ ¯ 1 ¯ ¯ ¯
¯ ¯>¯ ¯ > ··· > ¯ 1 ¯,
¯ λn ¯ ¯ λn−1 ¯ ¯ λ1 ¯

特征向量为 x(n) , x(n−1) , · · · , x(1) .


因此计算 A 的按模最小特征值 λn 的问题就是计算 A−1 的按模最大的特征
1
值问题. 对 A−1 应用幂法迭代, 就可求得矩阵 A−1 的按模最大特征值 , 从而求
λn
得 A 的按模最小特征值 λn , 这种方法称为反幂法.
反幂法迭代公式为


 v (0) = u(0) 6= 0 (αn 6= 0),


 v (k) = A−1 u(k−1) ,
k = 1, 2, 3, · · · . (8.9)

 (k)

 v
 u(k) = ,
max(v (k) )

为避免矩阵求逆, 迭代向量可通过解线性方程组

Av (k) = u(k−1)

求得. 仿幂法的证明思想, 则有:


定理 8.4 设
(1) A ∈ Rn×n 为非奇异矩阵且特征值 λi (i = 1, 2, · · · , n) 满足

|λ1 | > |λ2 | > · · · > |λn−1 | > |λn | > 0.

(2) 相应的 A 有 n 个线性无关的特征向量 x(1) , x(2) , · · · , x(n) .


则由反幂法构造的向量序列式 (8.9) 满足:
x(n)
(1) lim u(k) = .
k→∞ max(x(n) )
1
(2) lim max(v (k) ) = .
k→∞ λ
¯ n ¯
¯ λn ¯
且收敛速度依赖于比值 ¯¯ ¯.
λn−1 ¯
· 192 · 第8章 矩阵的特征值与特征向量计算

反幂法不仅可用于求按模最小的特征值, 还可以结合原点平移思想用于求任意
指定值附近的特征值及其相应的特征向量.
因为如矩阵 (A − P I)−1 存在, 则其特征值为
1 1 1
, ,··· , ,
λ 1 − p λ2 − p λn − p
而对应的特征向量仍为 x(1) , x(2) , · · · , x(n) . 如要想求得最靠近 p 的特征值, 设其为
λj , 则有
|λj − p| < |λi − p| , i 6= j,

即 (λj − p)−1 是矩阵 (A − P I)−1 按模最大的特征值, 用矩阵 (A − P I)−1 构造向


量序列 

 v (0) = u(0) 6= 0 (αj 6= 0),


 v (k) = (A − pI)−1 u(k−1) ,
k = 1, 2, 3, · · · . (8.10)

 (k)

 v
 u(k) = ,
max(v (k) )
定理 8.5 设
(1) A ∈ Rn×n 为非奇异矩阵且特征值 λi (i = 1, 2, · · · , n), 其中, λj 是最接近于
p 的特征值且 (A − P I)−1 .
(2) 相应的 A 有 n 个线性无关的特征向量 x(1) , x(2) , · · · , x(n) .
则由式 (8.10) 构造的向量序列满足:
x(j)
(1) lim u(k) = .
k→∞ max(x(j) )
· ¸
(k) 1 1
(2) lim max(v ) = 或 lim p + = λj .
k→∞ λj − p k→∞ max(v (k) )
|λj − p|
且收敛速度依赖于比值 max .
i6=j |λi − p|

8.2 雅可比 (Jacobi) 方法


Jacobi 方法是用于求实对称矩阵全部特征值和相应的特征向量的方法. 它是
一种迭代法, 其基本思想是把对称矩阵 A 经一系列相似变换化为一个近似对角阵,
从而将该对角阵的对角元作为 A 的近似特征值. 它涉及较多的线性代数知识, 现回
顾如下.
8.2.1 预备知识
(1) 对矩阵 A, B ∈ Rn×n , 若存在非奇异阵 P , 使得 B = P AP −1 , 则称矩阵
A 和 B 相似, 且相似矩阵有相同的特征值.
8.2 雅可比 (Jacobi) 方法 · 193 ·

(2) 若 B 是上 (或下) 三角阵或对角阵, 则 B 的主对角元素即是 B 的特征值.


(3) A 的主对角元素之和记为 tr(A), 称为 A 的迹. 如果 λi (i = 1, 2, · · · , n) 是
矩阵 A 的特征值, 则有
n
X n
X n
Y
λi = aii = tr(A), det(A) = λi .
i=1 i=1 i=1

(4) 若矩阵 P 满足 P T P = I, 则称 P 为正交阵. 对正交阵显然有 P T = P −1 ,


而且正交阵 P 1 , P 2 , · · · , P k 的乘积 P = P 1 P 2 · · · P k 仍是正交阵.
(5) 若 A 是实对称矩阵, 则必有正交相似变换阵 P , 使

P AP T = D = diag(λ1 , λ2 , · · · , λn ),

其中, λi (i = 1, 2, · · · , n) 是 A 的特征值; P T 的列向量 v (i) 是 A 的特征值 λi 对应


的特征向量.
(6) 矩阵

i j
 
1
 .. 
 . 
 
 
 cos θ sin θ  i
 
 
 1 
Rij (θ) = 
 ..


 . 
 
 
 1 
 
 − sin θ cos θ  j
 
 .. 
 . 
 
1

称为 i, j 轴形成的平面内的一个平面旋转变换, 显然有 [Rij (θ)]T = [Rij (θ)]−1 , 即


Rij (θ) 是正交阵.

8.2.2 Jacobi 方法

先以二阶矩阵为例, 设有二阶对称矩阵
" #
a11 a12
A=
a21 a22

和平面旋转矩阵 " #
cos θ sin θ
Rθ = .
− sin θ cos θ
· 194 · 第8章 矩阵的特征值与特征向量计算

考察
" #" #" #
cos θ sin θ a11 a12 cos θ − sin θ
B= Rθ ART
θ =
− sin θ cos θ a21 a22 sin θ cos θ
" #
b11 b12
= ,
b21 b22

其中

b11 = a11 cos2 θ + a22 sin2 θ + a12 sin 2θ,


1
b12 = b21 = (a22 − a11 ) sin 2θ + a12 cos 2θ,
2
b22 = a11 sin2 θ + a22 cos2 θ − a12 sin 2θ.

为使 A 的相似矩阵 B 成为对角阵, 只需适当选取 θ 使


1
b12 = b21 = (a22 − a11 ) sin 2θ + a12 cos 2θ = 0,
2

2a12 π
tan 2θ = , |θ| 6 , (8.11)
a11 − a22 4
π
且当 a11 = a22 时, 可取 θ = . 由此只要求出 θ, 从而旋转矩阵 P 也就确定了. 从
4
而 A 的特征值为

λ1 = a11 cos2 θ + a22 sin2 θ + a12 sin 2θ,


λ2 = a11 sin2 θ + a22 cos2 θ − a12 sin 2θ,

相应的特征向量为

x(1) = (cos θ, sin θ)T , x(2) = (− sin θ, cos θ)T .

下面我们将这一思想推广到一般的 n 阶实对称矩阵.
设矩阵 A ∈ Rn×n 是对称矩阵, 记 A0 = A, 对 A 作一系列旋转相似变换, 即

A1 =P 1 A0 P T
1,

A2 =P 2 A1 P T
2,

······
Ak =P k Ak−1 P T
k,

······
8.2 雅可比 (Jacobi) 方法 · 195 ·

变换中的 Ak (k = 1, 2, · · · ) 显然仍是对称矩阵, 而

ik jk
 
1
 .. 
 . 
 
 
 cos θk sin θk  i
  k
 
 1 
P k = Rik jk (θk ) = 
 ..

 ,
 . 
 
 
 1 
 
 − sin θk cos θk  jk
 
 .. 
 . 
 
1
¯ ¯
¯ (k−1) ¯
其中, ik , jk 是由 Ak−1 中将 a(k−1)
ik jk 元素化为零元素的位置所确定的 , 且 ¯aik jk ¯ =
¯ ¯
¯ (k−1) ¯
max ¯apq ¯.
p6=q
对 Ak−1 进行旋转相似变换, 根据矩阵乘积的运算规则, 只有第 ik 行、第 jk 行
和第 ik 列、第 jk 列的元素发生变化, 其他元素不动, 且有

(k) (k) 1 (k−1) (k−1) (k−1)


aik jk = ajk ik = (a − aik ik ) sin 2θk + aik jk cos 2θk , (8.12)
2 jk jk
( (k) (k) (k−1) (k−1)
aik p = apik = aik p cos θk + ajk p sin θk , p 6= ik ,
(k) (k) (k−1) (k−1) (8.13)
ajk p = apjk = ajk p cos θk − aik p sin θk , p 6= jk ,
( (k) (k−1) (k−1) (k−1)
aik ik = aik ik cos2 θk + ajk jk sin2 θk + aik jk sin 2θk ,
(k) (k−1) (k−1) (k−1) (8.14)
ajk jk = aik ik sin2 θk + ajk jk cos2 θk − aik jk sin 2θk ,

其余元素
a(k) (k) (k−1)
pq = aqp = apq , p, q 6= ik , jk .

当 θk 满足
(k−1)
2aik jk 1 π
tan 2θk = (k−1) (k−1)
= , |θk | 6 ,
aik ik − ajk jk dk 4

我们有
(k) (k)
aik jk = ajk ik = 0.
π
特别地, 当 a(k−1) (k−1)
ik ik = ajk jk 时, 取 θk = .
4
· 196 · 第8章 矩阵的特征值与特征向量计算

一般地, sin θk , cos θk 可按下列规则计算:



 1
 sin θk = p
 ,
1 + t2 k
tk (8.15)


 cos θk = p ,
1 + t2k

其中
(k−1) (k−1)
aik ik − ajk jk sign(dk )
dk = (k−1)
, tk = p .
2aik jk |dk | + d2k + 1

事实上, 由于
1
tan 2θk = ,
dk
则有
tan2 θk + 2dk tan θk − 1 = 0.

解得 θk , 并考虑到计算时数值稳定性, 故
 1

 p , dk > 0,
1  dk + d2k + 1
tk = p =
dk ± d2k + 1  1
 p , dk < 0.
−dk − d2k + 1

于是
sign(dk ) 1
tan θk = p = .
2
|dk | + dk + 1 tk

对于矩阵 Ak−1 , Ak 的元素, 它们的变化具有下列特点.


定理 8.6 相似旋转变换前后矩的全部元素平方和不变, 即
2 2
kAk−1 kF = kAk kF .

证明: 因为 Ak−1 , Ak 都是对称矩阵, 而


n
X
2 (k−1) 2
kAk−1 kF = (aij ) = tr(AT 2
k−1 Ak−1 ) = tr(Ak−1 )
i,j=1
n
X n
X
= λi (A2k−1 ) = λ2i (Ak−1 ).
i=1 i=1

同理可得
n
X
2
kAk kF = tr(AT
k Ak ) = λ2i (Ak ).
i=1
8.2 雅可比 (Jacobi) 方法 · 197 ·

因为 λi (Ak−1 ) = λi (Ak )(i = 1, 2, · · · , n), 于是有

2 2
kAk−1 kF = kAk kF .

定理 8.7 相似旋转变换后非主对角线元素的平方和减少了, 即主对角线元素


的平方和增加了.
证明: 由式 (8.13) 得
 (k) (k) (k−1) (k−1)

 (aik p )2 = (apik )2 = (aik p cos θk )2 + (ajk p sin θk )2


 +2a
(k−1) (k−1)
a sin θ cos θ , p 6= ik ,
ik p jk p k k
 (k) (k) (k−1) (k−1)

 (ajk p )2 = (apjk )2 = (apik sin θk )2 + (apjk cos θk )2

 (k−1) (k−1)
−2apik apjk sin θk cos θk , p 6= jk ,

所以
X X (k−1)
X
(a(k) 2
pq ) = (a(k−1)
pq )2 − 2(aik jk )2 < (a(k−1)
pq )2 .
p6=q p6=q p6=q

定理 8.8(Jacobi 法收敛性) 设 A = (aij )n×n 为实对称矩阵, 对其施行一系


列如上定义的相似平面旋转变换

Ak = P k Ak−1 P T
k, k = 1, 2, 3, · · · ,

则有
lim Ak = D = diag(λ1 , λ2 , · · · , λn ).
k→∞

证明: 记 S(A) 为矩阵 A 的非主对角线元素平方和, 即


X
S(A) = (apq )2 .
p6=q

由定理 8.7 的证明过程可知


(k−1)
S(Ak ) = S(Ak−1 ) − 2(aik jk )2 . (8.16)

又根据平面旋转变换的实施规则, 有
¯ ¯ ¯ ¯
¯ (k−1) ¯ ¯ ¯
¯aik jk ¯ = max ¯a(k−1)
pq ¯.
p6=q


X (k−1)
S(Ak−1 ) = (a(k−1)
pq )2 6 n(n − 1)(aik jk )2 ,
p6=q
· 198 · 第8章 矩阵的特征值与特征向量计算


S(Ak−1 ) (k−1)
6 (aik jk )2 . (8.17)
n(n − 1)
由式 (8.16) 和 (8.17) 得
· ¸
2
S(Ak ) 6S(Ak−1 ) 1 −
n(n − 1)
· ¸2 · ¸k
2 2
6S(Ak−2 ) 1 − 6 · · · 6 S(A0 ) 1 − .
n(n − 1) n(n − 1)
对高于二阶的矩阵 A(n > 2), 有

lim S(Ak ) = 0.
k→∞

根据 Jacobi 收敛性定理, 当 k 够大时, 有

P k · · · P 2 P 1 AP T T T
1 P 2 · · · P k ≈ D = diag(λ1 , λ2 , · · · , λn ).

记 PT = PT T T
1 P 2 · · · P k . 那么矩阵 P
T
的每一列就是 A 的一个近似特征向量.
8.2.3 Jacobi 过关法

由于 Jacobi 方法在每次寻找非对角元的绝对值最大的元素时颇费精力, 因此,


可采用如下过关措施.
首先计算 A 的非对角元平方和
 1/2
X
v0 = 2 (aij )2  .
i<j

v0
设置第 1 道关 v1 = , 在 A 的非对角线元素中按行 (或按列) 扫描, 如非对
n
角元素
|aij | > v1 ,

则选平面旋转矩阵 Rij (θ) 使 aij 化为零, 否则让元素 aij 过关 (即不进行平面旋转变


换). 注意到某次消为零的元素可能在以后的旋转变换中又复增长 (变为非零), 甚至
几次旋转变换后又可能增长到大于 v1 . 因此, 要经过多遍扫描, 直到 Al = (a(l) ij )n×n
满足 ¯ ¯
¯ (l) ¯
¯aij ¯ < v1 , i 6= j.
v1
这样再设置第 2 道关 v2 = , 重复上述过程, 经过多遍扫描直到 Am =
n
(m)
(aij )n×n 满足
¯ ¯
¯ (m) ¯
¯aij ¯ < v2 , i 6= j.
8.3 QR 算法 · 199 ·

这样经过一系列的关口 v2 , v3 , · · · , vr , 直到满足
ρ
vr 6 ,
n
其中, ρ 是精度要求.

8.3 QR 算法
对于实对称矩阵, 经过一系列的正交相似变换可求得实对称矩阵的全部特征值
和特征向量, 而对于一般的实矩阵 A ∈ Rn×n , 我们也可以利用正交相似变换去寻
找其特征值, 下面讨论的 QR 方法是求一般矩阵全部特征值的一种迭代算法, 是计
算一般阶数不太大的矩阵全部特征值最有效的方法之一.
8.3.1 QR 分解

把一般实矩阵分解成正交阵和上三角阵的乘积, 即进行 QR 分解通常是用豪


斯霍尔德 (Householder) 变换来实现.
定义 8.2 设 u ∈ Rn , 且 uT u = 1, 则称 n × n 矩阵

H = I − 2uuT

为 Householder 矩阵 (简称 H 变换矩阵), 或称为镜面反射阵. 容易验证:


(1) H T H = I.
(2) H T = H.
事实上
H T = (I − 2uuT )T = I − 2(uuT )T = I − 2uuT = H,

H T H = (I − 2uuT )T (I − 2uuT ) = I − 4uuT + 4uuT = I,
即 H 为正交阵, 同时又是对称阵.
可以证明, 对任意的非零向量 x ∈ Rn 和单位向量 d ∈ Rn , 都能找到 H, 使

Hx = kxk2 d,

即可以找到 Householder 阵, 把 x 变到 d 的方向而保持长度不变. 事实上, 只要取


x − kxk2 d
u= , (8.18)
kx−k x k2 dk2
就有
2(x − kxk2 d)(x − kxk2 d)T x
Hx =(I − 2uuT )x = x −
||x − kxk2 d||22
· 200 · 第8章 矩阵的特征值与特征向量计算

2(x − kxk2 d)(xT x − kxk2 dT x)


=x − = kxk2 d.
2(xT x − kxk2 dT x)

特别地, 在式 (8.18) 中取 d = e1 = (1, 0, · · · , 0)T , 则有


Ã !1/2 T
X n
Hx = kxk2 e1 =  x2i , 0, · · · , 0 .
i=1

就是说, 可以将 x 除第一个分量外的其余分量都化为零, 于是, 利用一系列


Householder 阵, 便可将实矩阵 A 分解成正交阵 Q 和上三角阵 R 的乘积. 具体实
施步骤如下.
记 A 的第 j 个列向量为 aj 即

aj = (a1j , a2j , · · · , anj )T ,

则矩阵 A 可写为
A = (a1 , a2 , · · · , an ).

第 1 步, 取 x = a1 , d = −sign(a11 )e1 , 令
a1 − σ1 e1
u1 = , (8.19)
ka1 − σ1 e1 k2

其中
σ1 = −sign(a11 ) ka1 k2 .

这里, 在 e1 前带上负的 a11 的符号是为了避免式 (8.19) 中 a1 与 ka1 k2 e1 相减使


第 1 分量的有效数字的可能损失, 以利于算法稳定. 记 ρ1 = ka1 − σ1 e1 k2 , 则
q q
ρ1 = (a1 − σ1 e1 )T (a1 − σ1 e1 ) = 2(σ12 − σ1 a11 ).


Q1 = I − 2u1 uT
1,

则 Q1 a1 = σ1 e1 . 于是有
³ ´
(1)
Q1 A =Q1 (a1 , a2 , · · · , an ) = σ1 e1 , a2 , · · · , a(1)
n
 
(1) (1)
σ1 a12 · · · a1n
 (1) 
 0 a(1) · · · a2n 
 22 
= . .. ..  .
 .. . . 
 
(1) (1)
0 an2 · · · ann
8.3 QR 算法 · 201 ·

第 2 步, 记 ā(1) (1) (1) (1) T


2 = (a22 , a32 , · · · , an2 ) ∈ R
n−1
, 在 n − 1 维空间里, 令

(1)
e1 = (1, 0, · · · , 0)T ∈ Rn−1 ,


1 (1) (1)
u2 = (ā − σ2 e1 ) ∈ Rn−1 ,
ρ2 2
其中 ° ° q
(1) ° (1) ° (1)
σ2 = −sign(a22 ) °ā2 ° 2 , ρ2 = 2(σ22 − σ2 a22 ).


H 2 = I n−1 − 2u2 uT
2,

则有
(1) (1)
H 2 ā2 = σ2 e1 .

构造矩阵 " #
1 0T
Q2 = ,
0 H2

则 ³ ´
(1) (2)
Q2 Q1 A = σ1 e1 , a12 e1 + σ1 e2 , a3 , · · · , a(2)
n ,

即将第二列对角元下的元素全化为零.
若上述过程已经完成了 k − 1 步, 则有
à k−2
!
X (i) (k−1) (k−1)
Qk−1 Qk−2 · · · Q1 A = σ1 e1 , · · · , ai,k−1 ei + σk−1 ek−1 , ak , · · · , an
i=1
 (1) (1) (1) (1)

σ1 a12 ··· a1,k−1 a1k ··· a1n
 (2) (2) (2) 
 0 σ1 ··· a2k a2k ··· a2n 
 
 .. .. .. .. 
 0 . . . . 
 
 (k−1) (k−1) 
=
 σk−1 ak−1,k ··· ak−1,n .

 .. .. 
 . . 0
(k−1)
akk ···
(k−1)
akn 
 
 .. .. .. 
 . . . 
 
(k−1) (k−1)
0 0 ··· 0 ank ann

进行第 k 步, 记 ā(k−1)
k
(k−1) (k−1) (k−1) (k−1)
= (akk , ak+1,k , · · · , ank )T , e1 = (1, 0, · · · , 0)T ∈
Rn−k+1 . 令
1 (k−1) (k−1)
uk = (ā − σk e1 ),
ρk k
· 202 · 第8章 矩阵的特征值与特征向量计算

其中 ° ° q
(k−1) ° (k−1) ° (k−1)
σk = −sign(akk ) °āk ° , ρk = 2(σk2 − σk akk ).
2

H k = I n−k+1 − 2uk uT
k,

则有
(k−1) (k−1)
H k āk = σk e1 .

构造矩阵 " #
I k−1 0T
Qk = ,
0 Hk

à k−1
!
X (i) (k)
Qk Qk−1 Qk−2 · · · Q1 A = σ1 e1 , · · · , ai,k ei + σk ek , ak+1 , · · · , a(k)
n ,
i=1

则又可将第 k 列对角元下面的元素全化为零. 不断重复上述过程, 做完 n − 1 步,


则令
Qn−1 Qn−2 · · · Q1 = R, R 为上三角阵.
T
Q̄ = Qn−1 Qn−2 · · · Q1 , 则 Q̄ 也是正交阵, 记 Q̄ = Q, 于是有

A = QR.

这就是矩阵 A 的 QR分解.
8.3.2 QR 算法

利用矩阵 A 的 QR 分解, 可以得 A 的一系列相似矩阵. 设 A = A1 ∈ Rn×n ,


对 A1 进行 QR 分解, 则有
A1 = Q1 R1 .

作矩阵
A2 = R1 Q1 .

对新作的矩阵 A2 进行 QR 分解, 得

A2 = Q2 R2 .

再作矩阵
A3 = R2 Q2 ,
..
.
习 题 8 · 203 ·

求得 Ak 后将 Ak 进行 QR 分解, 有

Ak = Qk Rk .

这样作矩阵
Ak+1 = Rk Qk ,
..
.

则序列 {Ak } 称为 QR 序列. 由于 Ak = Qk Rk , 所以 Rk = QT


k Ak , 于是有

Ak+1 =Rk Qk = QT
k Ak Qk

=QT T T T
k Qk−1 Ak−2 Qk−1 Qk = · · · = Qk · · · Q1 A1 Q1 · · · Qk .

故 {Ak } 是一系列相似矩阵. 对 Ak 矩阵, 当 A 满足一定要求时, 可以证明:


定理 8.9(QR 算法的收敛性) 设 A ∈ Rn×n , 若
(1) A 的特征值满足:|λ1 | > |λ2 | > · · · > |λn | > 0.
(2) A 有标准型 A = XDX −1 , 其中, D = diag(λ1 , · · · , λn ), 并且设矩阵 X −1
有三角分解 X −1 = LU (L 为单位下三角阵, U 为上三角阵).
则由 QR 算法产生的 {Ak } 本质上收敛于上三角矩阵, 即
 
λ1 × · · · ×
 
 
 λ2 · · · × 
本质上  
Ak −−−−−−→ R = 
 ..
 , k → ∞,

 . ··· 
 
 
λn


(k) (k) (k)
lim aij = 0 (i > j), lim aii = λi , lim aij (i < j) 不确定, k → ∞.
k→∞ k→∞ k→∞

证明: 略.
若 A ∈ Rn×n 的等模特征值中只有实重特征值或多重的复共轭特征值, 则由
QR 算法产生的 {Ak } 本质上收敛于分块上三角型矩阵 (对角块为一阶或二阶子
块), 且每个 2×2 子块给出 A 的一对共轭复特征值.

习 题 8
1. 用 (规范化) 幂法计算下列矩阵按模最大的特征值及对应的特征向量:
· 204 · 第8章 矩阵的特征值与特征向量计算

   
1 2 3 −4 14 0
   
(1) A = 
 2 3 4 
. (2) B = 
 −5 13 0 
.
3 4 5 −1 0 2
精确到第 3 位小数稳定.
2. 如果定理 8.1 中的特征值 λi (i = 1, 2, · · · , n) 满足条件

λ1 = λ2 = · · · = λr , |λ1 | > |λr+1 | > · · · > |λn | ,

即按模最大的特征是 r 重的, 证明其结论仍成立.


3. 用 Rayleigh 商加速幂法求下列矩阵按摸最大的特征值:
 
" # 4 −1 1
3 4  
(1) A = . (2) B = 
 −1 3 −2 
.
4 5
1 −2 3
精确到第 3 位小数稳定.
4. 利用反幂法求矩阵  
6 2 1
 
A=
 2 3 1 

1 1 1
最接近于 6 的特征值及对应的特征向量.
5. 用 Jacobi 方法求矩阵 " #
5 1
A=
1 5
的全部特征值和相应的特征向量.
6. 对矩阵  
7 3 −2
 
A=
 3 4 −1 
,
−2 −1 3
求出使其第 1 行第 2 列的元素约化为零的旋转变换矩阵 R12 (θ), 并以其对 A 作正交相似
变换.
7. 假设 x, y ∈ Rn (n > 1). 如果 kxk2 = kyk2 , 证明存在一个 Householder 阵 H, 使

Hx = y.

8. 用 Householder 变换将对称阵
 
1 4 3
 
A=
 4 5 5 

3 5 10

化为相似的三对角阵.
习 题 8 · 205 ·

9. 用 Householder 变换将矩阵
 
1 2 2
 
 2 
 −1 
A= 2 3 
 
 
1
2 −1
3
化为一个上三角形矩阵, 从而作出 A = QR 的分解.
10. 用 QR 算法求矩阵  
2 4 6
 
A=
 3 9 15 

4 16 36
的全部特征值 (迭代 2 次).
第9章 上机实习课题

9.1 插值问题的数值实验
1
1. 对于函数 f (x) = , x ∈ [−1, 1], 取 n + 1 个基点,
1 + (5x)2
xi = −1 + ih, i = 0, 1, 2, · · · , n,
2
其中, h = . 要求:
n
(1) 对 n = 2, 4, 6, 8, 10 分别作 n 次插值多项式 Pn (x), 并在同一坐标系分别画
出 f (x) 与 Pn (x).
(2) 在非节点处分别计算 f (x) 与 Pn (x) 的最大相对误差:
¯ ¯
¯ f (x) − Pn (x) ¯
max ¯ ¯ , n = 2, 4, 6, 8, 10.
16x61 ¯ f (x) ¯
x6=xi

(3) 根据 f (x) 与 Pn (x) 的图形及最大相对误差进行比较分析, 试寻插值效果


较好的改进方法.
2. 在多项式插值中, Chebyshev 正交多项式的零点作为插值基点一般优于等距
Yn · ¸
(2i + 1) π
插值基点, 原因在于出现在误差公式中的项 (x − xi ). 如果 xi = cos
i=0 ¯
2(n + 1)
¯
¯Y n ¯ 1
¯ ¯
(i = 0, 1, · · · , n), 则对于区间 x ∈ [−1, 1], 总有 ¯ (x − xi )¯ 6 n . 对 n = 4, 8, 16
¯ ¯ 2
i=0
作数值检验来验证这个不等式.

9.2 曲线拟合问题的数值实验
1. 对实验数据 (xi , yi ), i = 1, 2, · · · , N , 要求:
(1) 利用最小二乘法原理, 编制确定拟合多项式
Pn (x) = a0 + a1 x + a2 x2 + · · · + an xn , n ¿ N,
的数值软件, 要求在软件中能任意令拟合多项式 Pn (x) 中第 p 项 (0 6 p 6 n) 的系
数 ap = 0, 并能自动调整相应的正规方程组.
(2) 已知实验数据如表 9-1 所示:
9.3 数值积分的数值实验 · 207 ·

表 9-1 实验数据表
x y x y
5 1.0029 30 0.9979
10 1.0023 35 0.9978
15 1.0000 40 0.9981
20 0.9990 45 0.9987
25 0.9983 50 0.9996

按照表 9-1 拟合多项式


Pn (x) = a0 + a1 x + a2 x + · · · + an xn ,

并分别对 n = 2, 3, 4, 5, 6 进行数值计算, 最后根据各自偏差的平方和大小分析拟合


效果的好坏.
a + bx
2. 拟合形如 f (x) ≈ 的函数的一种快速方法是将最小二乘法用于下列
1 + cx
问题:
(1 + cx)f (x) = a + bx.
试用这一方法拟合表 9-2 给出的世界人口数据.
(1) 验证如用此拟合公式, 在 2010 年 8 月 30 日星期一的下午 5 时与 6 时之
间, 世界人口数将变成无穷大.
(2) 探讨是否应该用最小二乘法来作预测, 例如, 研究本题中的方差以确定是
否有哪一次的多项式是令人满意的.

表 9-2 世界人口数据
年份 人口 (亿)
1000 3.40
1650 5.54
1800 9.07
1900 16.10
1950 25.09
1970 36.50

9.3 数值积分的数值实验
Z b
1. 写出一个如下的计算 f (x) dx 的子程序:先将区间 [a, b] 细分成 n 个相
a
等的子区间, 然后, 使用经过修改适用于 n 个不同子区间的三点 Gauss 公式, 并用
下面的题目测试你所编的程序.
Z b
(1) x5 dx, n = 1, 2, 10.
a
· 208 · 第9章 上机实习课题

Z b
(2) sin xdx, n = 1, 2, 3, 4.
a
2. 变上限有积分所确定的函数, 由方程
Z x
dt
l(x) =
2 ln t

所定义. 对于大的 x, 小于或等于 x 的质数个数十分接近于 l(x). 例如, 小于 200 的


质数有 46 个, 而 l(200) 大约等于 50, 使用上和与下和求 l(200), 要求保留 3 位有效
数字. 在写程序前, 确定所需的分割点的数目.

3. 对于一个 “坏” 的函数, 例如定义在 [0, 1] 上的 x, 测试 Romberg 算法, 并
解释为什么它是坏的函数.

9.4 常微分方程初值 (边值) 问题的数值实验


1. 下面的病态例子是由达尔奎斯特和比约克 1974 年给出的. 考虑带初值 x(0) =
dx
0 的微分方程 = 100 (sin t − x), 在区间 [0, 3] 上用标准四阶 Runge-Kutta 法解
dt
这个问题, 分别取 h = 0.015, 0.020, 0.025 和 0.030, 观察数值的不稳定性.
2. 另一种四阶 Runge-Kutta 法由

x (t + h) = x (t) + ω1 F1 + ω2 F2 + ω3 F3 + ω4 F4

给出, 其中


 F1 = hf (t, x) ,

 µ ¶



 2 2

 F2 = hf t + 5 h, x + 5 F1 ,
à √ !

 14 − 35 5

 F3 = hf t + h, x + c3,1 F1 + c3,2 F2 ,



 16


F4 = hf (t + h, x + c4,1 F1 + c4,2 F2 + c4,3 F3 ) .

这里, 合适的常数是
¡ √ ¢ ¡ √ ¢
3 −963 + 476 5 5 757 − 324 5
c3,1 = , c3,2 = ,
1024 1024
√ √
−3365 + 2094 5 −975 − 3046 5
c4,1 = , c4,2 = ,
6040 2552
¡ √ ¢
32 14 595 + 6374 5
c4,3 = ,
24 085
9.5 方程求根的数值实验 · 209 ·

√ ¡ √ ¢
263 + 24 5 125 1 − 8 5
ω1 = , ω2 = ,
1812 3828
¡ √ ¢ ¡ √ ¢
1024 3346 + 1623 5 2 15 − 2 5
ω3 = , ω4 = .
5 924 787 123
选择一个已知其解的微分方程, 比较两种四阶 Runge-Kutta(上面所述方法与标准
四阶 Runge-Kutta) 法, 打印每一步的误差. 在每一步, 这两个误差的比是否为常
数?每种方法各有什么优点和缺点?
事实上, 在任何的 Runge-Kutta 法都有许多种. 阶数越高, 公式就越复杂, 由于
一般四阶 Runge-Kutta 法给出的方程有误差 O(h5 ), 并且相当简单, 所以它是最通
用的四阶 Runge-Kutta 法, 本题中的误差项也是 O(h5 ), 并且在某种意义下它是最
佳的.
3. 给定两点边值问题
(
y 00 + y = −x,
x ∈ (0, 1),
y(0) = y(1) = 0,

把区间 [0, 1] 分为 5 等分, 分别用差分方法和三次样条方法求问题的数值解, 要求:


(1) 求出问题的精确解 y(x), 并且在同一坐标系下画出 y(x), 以及用差分方法
和三次样条方法求得的数值解 yi(h) 和 y −(h) , 同时计算出各自与精确解的误差.
(h)
(2) 从上面的图形和误差, 观察到什么现象?你能通过 yi 和 ỹi(h) , 得到精度更
高的近似解吗?
(3) 用 (2) 中得到的方法求如下问题:
( £ ¤
y 00 = y 2 − sin nx π2 + sin (πx) ,
x ∈ (0, 1) ,
y (0) = y (1) = 0,

的数值解.
(4) 试从理论上探讨上面的现象.

9.5 方程求根的数值实验
1. 当用 Newton 迭代法求方程 f (x) = 0 的根时, 我们从 x0 开始, 并用公式

f (xn )
xn+1 = xn − , n = 0, 1, 2, · · · ,
f 0 (xn )

计算序列 x1 , x2 , · · · , 为避免在每步都要计算导数, 有人建议在每一步中都用 f 0 (x0 )


来代替 f 0 (xn ), 也有人建议每隔一步计算一次 Newton 公式中的导数, 这个方法由
· 210 · 第9章 上机实习课题

下式给出: 
 f (x2n )

 x2n+1 = x2n − f 0 (x ) ,
2n

 f (x2n+1 )
 x2n+2 = x2n+1 − .
f 0 (x2n )
对于以上建议的两种方法, 以几个已知根的简单方程为例, 与 Newton 法作
数值比较, 打印出每步迭代中每种方法的误差, 以检查收敛性, 这两种算法的效果
如何?
2. 在 Newton 法中, 每做一步就从一个给定的 x 上得到一个新的点 x − h, 这
f (x)
里h= 0 , 不难按下面要求将它设计得更精细些:如果 |f (x − h)| > |f (x)|, 则
f (x)
h
不用这个 h 值, 而用 来代替, 试验这个精细的方案是否可行?
2
3. 选取一个函数, 证明数值验证迭代公式

2f 0 (xn ) f (xn )
xn+1 = xn − 2 , n = 0, 1, 2, · · · ,
2f 0 (xn ) − f 00 (xn ) f (xn )

在单根处是立方收敛的, 但在多重根处则是线性收敛的.

9.6 线性方程组求解的数值实验
1. 对从 2 到 9 的每一个 n 值, 解 n 阶方程组 Ax = b. 在这里 A 和 b 如下
定义:
A = (aij )n×n , b = (b1 , b2 , · · · , bn )T ,
−1
aij = (i + j − 1) , i, j = 1, 2, · · · , n,

bi = p (n + i − 1) − p (i − 1) , i = 1, 2, · · · , n,
x ¡ 2 © ª¢
其中, p (x) = 2 + x2 −7 + n2 [14 + n (12 + 3n)] . 解释发生的现象.
24
2. 考虑一种特殊的对角线元素不为零的双对角线线性方程组 (以 n = 7 为例)
    
d1 x1 b1
    
 a1 d2   x2   b2 
    
    
 a2 d3   x3   b3 
    
 a3 d4 a4   x4  =  b4  ,
    
    
 d5 a5   x5   b5 
    
 d6 a6     
   x6   b6 
d7 x7 b7
9.8 矩阵条件数的估计 · 211 ·

写出解一般的 n(奇数) 阶方程组的程序 (不要用消元法, 因为不用它可以十分方便


地解出这个方程组).
3. 讨论在求矩阵
 
−0.0001 5.096 5.101 1.853
 
 0 3.737 3.740 3.392 
 
 0 0 0.006 5.254 
 
0 0 0 4.567

的逆阵时所出现的计算上的困难, 并思考解决方案.

9.7 矩阵特征值计算的数值实验
1. 在下面矩阵 A 中, 除元素 a34 外, 所有元素都为常数
 
9.1 3.0 3.6 4.0
 
 4.2 5.3 4.7 1.6 
A=
 3.2 1.7 9.4 x
,

 
6.1 4.9 3.5 6.2

试求此矩阵当 x = 0.9, 1.0, 1.1 时的全部特征值, 注意观察特征值的变化情况.


2. 讨论在用反幂法求矩阵
 
−0.0001 5.096 5.101 1.853
 
 3.737 3.740 3.392 

A= 
 0.006 5.254 

4.567

的按模最小特征值时所遇到的困难, 并思考解决方案.

9.8 矩阵条件数的估计
进行误差估计的比较, 给定 3 个不同的线性方程组.
第 1 个方程组是 A1 x = b(1) , 这里 A1 = (aij )10×10 是 Hilbert 矩阵, 其中

aij = (i + j − 1)−1 , i, j = 1, 2, · · · , 10, b(1) = (1, 0, 0, 0, 0, 0, 0, 0, 0, 0)T ,


° °
且 kA1 k1 = 2.93, °A−1
1
° = 1.21 × 103 .
1
· 212 · 第9章 上机实习课题

第 2 个方程组 A2 x = b(2) 是一个形状很好的下三角方程组, 其系数矩阵为 4


阶 Wilkinson 矩阵
 
0.9143 × 10−4
 
 0.8762 0.7156 × 10−4 
A2 =  0.7943
.

 0.8143 0.9504 × 10−4 
0.8017 0.6132 0.7156 0.7123 × 10−4

右端 b(2) = (0.000 091 43, 0.876 271 56, 1.608 695 04, 2.130 571 23)T , 准确解为
° °
x(2) = (1, 1, 1, 1)T 且 kA2 k∞ = 2.13 和 °A−12
° = 1.15 × 1016 .

(3)
第 3 个方程组 A3 x = b 是一个具有好的性质的 14 阶良态方程组, 系数矩
阵为 Ã !
C D
A3 = ,
E C
且  
5 4 7 5 6 7 5
 
 4 12 8 7 8 8 6 
 
 
 7 8 10 9 8 7 7 
 
E=
 5 7 9 11 9 7 5 
,
 
 6 8 8 9 10 8 9 
 
 7 8 7 7 8 10 10 
 
5 6 7 5 9 10 10
 
1 1 1 1 1 1
5
 8 9 10 11 12 13 
 
 1 1 1 1 1 1 
 6 
 9 10 11 12 13 15 
 
 1 1 1 1 1 1 
 
 7 
C=D= 10 11 12 13 15 16 .
 
 0 0 0 5 0 0 0 
 
 
 0 0 6 0 0 0 0 
 
 0 7 0 0 0 0 0 
 
8 0 0 0 0 0 0
选取右端项 b(3) 使得方程的解为 x(3) = (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)T .
(1) 对上面提到的 3 个方程组, 可以用你掌握的各种解法, 求出计算解 x̄(1) , x̄(2) ,
x̄(3) , 并且计算
° ° ° ° ° ° ° °
°x(i) − x̄(i) °
° (i) ° ° (i) (i) ° ° (i) (i) ° ° °
°r ° = °b − Ai x̄ ° , °x − x̄ ° , °x(i) ° , i = 1, 2, 3.
9.8 矩阵条件数的估计 · 213 ·

(2) 对上面 3 个方程组右端项产生 10−7 的扰动, 然后解方程组, 再对系数矩阵


Ai 和 b(i) 都产生 10−7 扰动, 再解方程组, 观察解产生误差的变化情况.
(3) 对上面 3 个方程组采用改善后的办法求解, 计算解的误差变化及残向量的
变化情况.

You might also like