张瑞
中国科学技术大学数学科学学院
rui@ustc.edu.cn |
问题. 已知函数在离散点处的函数值
如何求的导数?
注意到,当数值微分公式在处取值时,有
做误差分析的时候,同样可以利用表达式在处的Taylor展开来求 .
做的线性插值公式
对上式求导
记,则有公式
定义 1.
公式
是点与的差商,称为向前差商公式。
在处取值,可以得到
定义 2.
公式
是点与的差商,称为向后差商公式。
在等距节点上,插值多项式为
令,则有
这样,可以得到如下的三点公式
其中,(**)式,又称为中心差商公式。可以写成
类似地,可以得到五点公式
记,则有如下公式
例 1. 函数在附近有如下数据。求
x | 2.5 | 2.6 | 2.7 | 2.8 | 2.9 |
y | 12.1825 | 13.4637 | 14.8797 | 16.4446 | 18.1741 |
解. 运行结果,
二点公式=============
Error for 2.6,2.7 -0.7197948261613831
Error for 2.7,2.8 0.7694187373692749
Error for 2.5,2.7 -1.3935429040260185
Error for 2.7,2.9 1.5923364979782804
三点公式============
Error for 2.5,2.6,2.7 -0.04604674829675659
Error for 2.6,2.7,2.8 0.02481195560394589
Error for 2.7,2.8,2.9 -0.053499023239712784
Error for 2.5,2.7,2.9 0.09939679697613002
五点公式==============
Error for 2.5,2.6,2.7,2.8,2.9 -4.965818678748235e-05
从误差的数据,可以得出哪些结论?
例 2. 使用递减的步长来计算函数在处的微分。
步长,每次减半,计算结果如下
有效数字Decimal:6
0 : diff: 3.16345 err: -0.00526
1 : diff: 3.1595 err: -0.00131
2 : diff: 3.1584 err: -0.00021
3 : diff: 3.1584 err: -0.00021
4 : diff: 3.1576 err: 0.00059
5 : diff: 3.1536 err: 0.00459
6 : diff: 3.152 err: 0.00619
7 : diff: 3.1552 err: 0.00299
8 : diff: 3.1488 err: 0.00939
9 : diff: 3.22561 err: -0.06742
10 : diff: 3.22561 err: -0.06742
11 : diff: 3.17441 err: -0.01622
12 : diff: 2.66241 err: 0.49578
13 : diff: 2.45761 err: 0.70058
14 : diff: 4.91521 err: -1.75702
15 : diff: 0E+5 err: 3.15819
16 : diff: 0E+5 err: 3.15819
17 : diff: 0E+6 err: 3.15819
18 : diff: 0E+6 err: 3.15819
有效数字Decimal:16
0: 1.15, 3.158192909689768
0: 3.163459196993385, -0.005266287303617
1: 3.15950898790114, -0.001316078211372
2: 3.15852189839860, -0.000328988708832
3: 3.15827515493932, -0.000082245249552
4: 3.15821347088168, -0.000020561191912
5: 3.15819804998016, -0.000005140290392
6: 3.15819419476192, -0.000001285072152
7: 3.15819323095808, -3.21268312E-7
8: 3.15819299000704, -8.0317272E-8
9: 3.15819292976896, -2.0079192E-8
10: 3.15819291470848, -5.018712E-9
11: 3.15819291095040, -1.260632E-9
12: 3.15819290998784, -2.98072E-10
13: 3.15819290976256, -7.2792E-11
14: 3.15819290976256, -7.2792E-11
15: 3.15819290918912, 5.00648E-10
16: 3.15819290918912, 5.00648E-10
17: 3.15819290918912, 5.00648E-10
18: 3.15819291312128, -3.431512E-9
...
46: 2.462906046218241, 0.695286863471527
47: 4.925812092436481, -1.767619182746713
48: 0E-15, 3.158192909689768
49: 0E-15, 3.158192909689768
前面的例子可以看到,
问题. 如何确定一个合适的步长,使得误差在要求的范围?
需要知道当前时,误差有多大。
问题. 如何判定当前步长时,误差有多大?
设步长为的近似与真值的误差为
则对步长,有
近似地认为,有
即有,
这样,得到了事后误差估计式
即,可以用来近似作为的误差。
例 3. 中心差商格式的误差是,这样,可以用
来近似计算误差的值。
例 4. 向前差商的误差是,可以用近似来估计误差。
给定误差要求,如何确定一个步长,使得数值微分的误差小于?
h=0.1
df1=center_euler(h) #中心差商公式计算微分
df2=center_euler(h/2)
while |df1-df2|>3*eps: #事后误差估计公式
df1=df2
h=h/2 # 步长变为原来的一半
df2=center_euler(h/2)
return df2 # df2的误差满足要求
假定步长时的数值计算公式的误差表达式为
其中。 将步长减半,则有
得到
代入(*)式,有
由
得到
进而
可以得到
即公式
与的误差为,是比(误差为)更高阶的近似。 这个公式称为Richardson外推公式。
可以看到
即Richardson外推公式就是近似值加上事后误差估计值。
例 5. 对中心差商格式,
在处做Taylor展开,得到
因而, 有误差公式
用Richardson外推公式,可以得到
为五点公式。具有的精度。
利用插值多项式,同样可以近似高阶导数。
如,三点公式中,求2次插值多项式的2阶导数,有
可以得到2阶导数的数值近似
问题. 求函数的三阶导数,至少需要几个点?
将公式在处做Taylor展开
则有,
例 6.
6.