数值计算方法第二章
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章 非线性方程数值解法
在科学计算中常需要求解非线性方程
()0f x =
即求函数()f x 的零点.非线性方程求解没有通用的解析方法,常采用数值求解算法.数值解法的基本思想是从给定的一个或几个初始近似值出发,按某种规律产生一个收敛的迭代序列0{}k k x +∞=,使它逐步逼近于方程的某个解.本章介绍非线性方程实根的数值求解算法:二分法、简单迭代法、Newton 迭代法及其变形,并讨论它们的收敛性、收敛速度等.
§ 二分法
一、实根的隔离
定义 设非线性方程中的()f x 是连续函数.如果有*x 使*()0f x =,则称*x 为方程的根,或称为函数()f x 的零点;如果有*()()()m f x x x g x =-,且()g x 在*x 邻域内连续,*()0g x ≠,m 为正整数,则称*x 为方程的m 重根.当1m =时,称*x 为方程的单根.
非线性方程根的数值求解过程包含以下两步
(1) 用某种方法确定有根区间.称仅存在一个实根的有根区间为非线性方程的隔根区间,在有根区间或隔根区间上任意值为根的初始近似值;
(2) 选用某种数值方法逐步提高根的精度,使之满足给定的精度要求.
对于第(1)步有时可以从问题的物理背景或其它信息判断出根的所在位置,特别是对于连续函数()f x ,也可以从两个端点函数值符号确定出有根区间.
当函数()f x 连续时,区间搜索法是一种有效的确定较小有根区间的实用方法,其具体做法如下
设[,]a b 是方程的一个较大有根区间,选择合适的步长()/h b a n =-,k x a kh =+,(0,1,,)k n =L .由左向右逐个计算()k f x ,如果有1()()0k k f x f x +<,则区间1[,]k k x x +就是方程的一个较小的有根区间.
一般情况下,只要步长h 足够小,就能把方程的更小的有根区间分离出来;如果有根区间足够小,例如区间长度小于给定的精度要求,则区间内任意一点可视为方程的根的一个近似.
例 确定出方程32()3430f x x x x =-+-=的一个有根区间.
解 由22()3643(1)10f x x x x '=-+=-+>知()f x 为(,)-∞∞上的单调递增函数,进而()f x 在(,)-∞∞内最多只有一个实根.经计算知(0)0f <,(2)0f >,所以()0f x =在区间[0,2]内有惟一实根.
如果希望将有根区间再缩小,可以取步长0.5h =,在点0.5x =,1x =, 1.5
x =
计算出函数值的符号,最后可知区间[1.5,2]内有一个实根. 二、二分法
二分法是求非线性方程实根近似值的最简单的方法.其基本思想是将有根区间分半,通过判别函数值的符号,逐步缩小有根区间,直到充分逼近方程的根,从而得到满足一定精度要求的根的近似值.
设()f x 在区间[,]a b 上连续,()()0f a f b <,且方程在区间(,)a b 内有惟一实根*x .记1a a =,1b b =,中点111()/2x a b =+将区间11[,]a b 分为两个小区间11[,]a x 和11[,]x b ,计算函数值1()f x ,根据如下3种情况确定新的有根区间:
(1) 如果1()0f x =,则1x 是所要求的根; (2) 如果11()()0f a f x <,取新的有根区间2211[,][,]a b a x =; (3) 如果11()()0f x f b <,取新的有根区间2211[,][,]a b x b =.
新有根区间22[,]a b 的长度为原有根区间11[,]a b 长度的一半.对有根区间22[,]a b 施以同样的过程,即用中点222()/2x a b =+将区间22[,]a b 再分为两半,选取新的有根区间,并记为33[,]a b ,其长度为22[,]a b 的一半(如图所示).
图 二分法示意图
重复上述过程,建立如下嵌套的区间序列
1122[,][,][,][,]k k a b a b a b a b =⊃⊃⊃⊃L L
其中每个区间的长度都是前一个区间长度的一半,因此[,]k k a b 的长度为
1
1()
2k k k b a b a --=
-
由*
[,]k k x a b ∈和()/2k k k x a b =+,得
*11
()()22
k k k k x x b a b a -≤
-=- 当k →∞时,显然,有*k x x →.总结得到如下收敛定理:
定理 设()f x 在隔根区间[,]a b 上连续,且()()0f a f b <,则由二分法产生的序
列0{}k k x +∞=收敛于方程在[,]a b 上的根*
x ,并且有误差估计
*1
()(1,2,)2k k x x b a k -≤
-=L 设预先给定根*x 的绝对误差限为ε,要求*k x x ε-≤,只要1
()2
k b a ε-≤成立,
这样求得对分次数
ln()ln ln 2
b a k ε
--≥
.
取k 为大于(ln()ln )/ln 2b a ε--的最小整数.此时k x 是方程的满足精度要求的根近似值.
注:由于舍入误差和截断误差存在,利用浮点运算不可能精确计算函数值,二分法中的判断()0k f x =几乎不可能满足,取而代之为判断条件0()k f x ε<,其中
0ε为根近似值的函数值允许误差限.
总结以上内容,给出如下算法 算法 (二分法)
输入 端点,a b 、根的绝对误差限ε、根近似值的函数值允许误差限0ε; 输出 近似解c 或失败信息;
Step 1 用公式计算最大迭代次数k ; Step 2 对1,,n k =L 循环执行Step 3~5; Step 3 ()/2c a b =+,计算()f c ;
Step 4 若0()f c ε<,则输出c ,end ;
Step 5 若()()0f c f b <,则a c =,否则b c =.
例 用二分法求32()4100f x x x =+-=在[1,2]上的根*x 的近似值,要求
*31
102
k x x --<
⨯. 解 由于在区间[1,2]上,(1)5f =-,(2)14f =,2()38(38)0f x x x x x '=+=+>,故()0f x =在[1,2]上有惟一实根*x .确定循环次数为11k =,利用二分法计算结果见表.