《数值分析》2
主要内容: 数值计算中的基本原则
算法的数值稳定概念
方程求根问题引例
二分法及其算法描述
EXP: a = 109
,
b = 9,在8位浮点数系统中做加法a + b =1.0000000 ×109+ 0.000000009 ×109
由于只保留8位有效数,处于第九、十位的数09
被舍去
, 实际操作是:将 a 的数据作为加法计算的最终结果
.数值计算中的基本原则
(1)避免绝对值小的数做除数;
(2)避免两相近数相减;
(3)防止大数“吃”小数现象
数值计算中的基本原则
举例
: 计算 P(x) = 1+2x+3x2+4x3 + 5x4的值 秦九韶算法
P(x)=1+x(2+x(3+x(4+5x)))
应用
: 2进制数转换为10进制数算法(1 1 1 0 1 1 1 0)2 = 27+26 +25 +0 +23 +22 +2 +0
=((((((1·2+1)2+1)2+0)2+1)2+1)2+1)2+0
=238
(4)尽量减少计算工作量(乘、除法次数)
数值计算中的基本原则
数值计算中的基本原则
举例1:计算 I
n e
1
01x
ne
xdx
( n =0,1,···, 20 )1 1 1
0
0
e
1 e dx e ( e 1 ) 1 e
I
x1
1 1
1 1 1 0 1
1 )
(
x n n
x n
x n n
nI dx
e x
n e
x e
dx e
x e
I
01x
ndx
01x
ne
xdx e
01x
ndx
1 1 1
1
I n n
e n
算法数值稳定引例
算法的数值稳定概念
初值 : I
0= 1 – e
–1≈ 0.63212055882856 理论递推公式 : I
n= 1 – nI
n-1(I
0= 1- e
-1)
S
1=1-0.63212055882856; S(2)=1- S
1; for n=2:20
S(n)=1-n*S(n-1) end
n=20时,S
20= - 30.19239488558378 实际计算 : S
n=1- nS
n-1, S
0=0.63212055882856
算法的数值稳定概念
v.s. In=1 - nIn-1 Sn- In=- n(Sn-1 - In-1)
e(Sn)= –ne(Sn-1)=···= (n!)(–1)ne(S0)
新算法: In-1 = (1 - In)/n S(30)=1/31
for n=30:-1:2
S(n-1)=(1-S(n))/n;
end
u 初值误差在算法执行过程中不断增大,这种算法称为数值不 稳定算法。
Sn=1-nSn-1
算法的数值稳定概念
请仿照上例分析
Sn-1-In-1= –(Sn - In)/n, ( n =30, 29, ···, 1 ) 迭代最终结果为:S1
可知:数学上完全等价的两种递推公式,由于运 算次序不同会出现完全不同的算法稳定情况。
|e(S1)|= |S1
-
I1|=|(S2–
I2)|/2=···=|S30-I30|/ 30!初始误差 算法的数值稳定概念
u初始误差 在算法执行过程中 不断减小 ,
这种算法称为数值稳定算法。
举例2:水中浮球问题
有一半径R =10 cm的球体,密度 =0.638.球体浸入水中
后,浸入水中的深度d 是多少?
阿基米德定律 3
4 R3
dR R x dx V
02
2
( ) ]
[
) 3
3 (
1 d2 R d
) 3
3 (
1 d 2 R
d
) 3(
4R3
d 2 R d0 4
3
2 33
Rd R
d
非线性方程求根引例
水密度
方程求根问题引例
d
0 5 10 15 20 -2000
-1000 0 1000 2000 3000
由 =0.638, R = 10, 代入, 得:
d 3 – 30 d 2 + 2552 = 0
令 f (x) = x 3 – 30 x 2 + 2552 ,函数图形如下 f(x)在区间[0,20]有唯一
的根
P= [1 -30 0 2552];
roots(P) --->Matlab命令 ans =
26.3146 11.8615 -8.1761
方程求根问题引例
① 对根进行隔离:
a) 找出隔根区间 (内部只有一个解); 或 b) 在隔根区间内确定一个解的近似值x0.② 逐步逼近
: 利用近似解x0 (或隔根区间), 通过迭代算法得 到更精确的近似解.设
f(x) = 0的根为 x*, 通过迭代计算, 产生序列:x0 x1 x2 ··· xn···
用数值方法求非线性方程的根,分两步进行 :
lim x
nx
*n
只须:
如何构造迭代格式方程求根问题引例
已知方程 f(x)=0 有一隔根区间[a, b], 且f(x)满足f(a)·f(b)<0, 则:
①先将[a , b]等分为两个相等小 区间
②判断根属于哪个小区间
③舍去无根区间保留有根区间 [a1, b1];
总结:把区间[a1, b1] 一分为二,进一步判断根属于哪个更小的 区间[a2, b2],如此不断二分以缩小区间长度
a b
a1 b1
a2 b2
f(x)
…...
(a+b)/2
(a1+b1)/2 二分(迭代)法引例
二分法及其算法描述
[a, b] x0=0.5(a+b) [a1,b1]=[a,x0] x1=0.5(a1+b1) 构造二分法迭代格式
已知f(x)=0在[a,b]内有一根, 且f(a).f(b)<0 1) 计算: ya f(a), x00.5(a+b), y0f(x0)
判断: 若y0=0, 则x0是根, 否则转下一步;
2) 判断: 若y0·ya<0, 则a1a, b1 x0 否则 a1x0, b1b, ya y0
y0=f(x0)=0 ? [a1,b1]=[x0,b]
3) Repeat! 直至达到精度要求 算法
流程
二分法及其算法描述
二分法迭代将得到一系列隔根区间:
[ , ] [ , ] [ , ] ]
,
[ a b a
1b
1a
2b
2a
nb
n定理2.2: 设x*是 f(x)=0在[a, b]内的唯一根,且 f(a)·f(b)<0,, 则二
分计算过程中, 各区间的中点数列
) , 2 , 1, 0 (
) 2 (
1
a b nxn n n
性质: 1. f(an)·f(bn)<0; 2. bn – an = (b – a)/ 2n
满足: | xn – x*|≤ (b – a)/ 2n+1
log
b a
3 n
1 10
a 只需 b
3
* 10
2
| 1
| xn x
注记: 若要
二分法及其算法描述
函数在[0,1]内有唯一零点, 故[0,1]是隔根区间 举例3: 二分法求方程
在区间 [0, 1]内的根;二分十次。
0 2 )
sin(
)
exp( x
x 解: 令 )
sin( 2 )
exp(
)
(x x x
f
0 1
) 0
(
f f (1)
e1
1
01 0
, 0 2 )]
2 cos(
) [exp(
)
(
x x x x
f
0 )
1 ( ) 0
(
f f Step 2: 判断在[0,1]是否有唯一根?
Step 1: 判断 f(0)f(1)<0 ?
二分法及其算法描述
二分法迭代实验数据
n an xn bn 0 0 5.0000e-001 1.0000e+000 1 0 2.5000e-001 5.0000e-001 2 2.5000e-001 3.7500e-001 5.0000e-001 3 3.7500e-001 4.3750e-001 5.0000e-001 4 4.3750e-001 4.6875e-001 5.0000e-001 5 4.3750e-001 4.5313e-001 4.6875e-001 6 4.3750e-001 4.4531e-001 4.5313e-001 7 4.3750e-001 4.4141e-001 4.4531e-001 8 4.4141e-001 4.4336e-001 4.4531e-001 9 4.4336e-001 4.4434e-001 4.4531e-001 10 4.4336e-001 4.4385e-001 4.4434e-001
二分法及其算法描述
举例4:二分法算法(水中浮球问题)
x f=inline('x.^3-30*x.^2+2552');
a=0; b=20; er=b-a; ya=f(a);
k=0; er0=.005;
while er>er0
x0=(a+b)/2; y0=f(x0);
if ya*y0<0 b=x0;
else
a=x0; ya=y0;
end
er=b-a;k=k+1;
endk, xk=(a+b)/2
k=12, xk=11.8628 满足:
| xn – x*|≤ 20/ 213 ≤0.0025 f(d) = d 3 – 30 d 2 + 2552 = 0 , [0, 2R]=[0, 20]
二分法及其算法描述
二分法迭代实验数据 ( x*=11.8615 ) n |xk – x*|
0 1.8615e+000 1 3.1385e+000 2 6.3850e-001 3 6.1150e-001 4 1.3498e-002 5 2.9900e-001 6 1.4275e-001 7 6.4627e-002 8 2.5564e-002 9 6.0328e-003 10 3.7329e-003 11 1.1499e-003
二分法及其算法描述
练习与思考
1.设计多项式算法
15 11
7
1
( x ) 1 2 x
33 x 4 x 5 x
P
(7次乘法)2. 微积分回顾
连续函数介值定理、拉格朗日中值定理 3. 两次二分中点之差| xn+1 – xn | = ?
4.半径R =10 cm的圆柱体,密度