我们在数值分析课上使用 python 进行编码,我对它还很陌生,所以我不太确定我做对了,非常感谢您的帮助。使用 python 我需要计算:
i) 0.01^2 并输入四舍五入到 5 位有效数字的答案
ii) f(0.000122),其中 f(x) = cosh(x) + cos(x) - 2,并将结果四舍五入到小数点后 18 位。
iii)计算绝对误差| f(x) - p_4(x) | f(x) - p_4(x) |在点 0.981,如果 p_4(x) 是逼近 f(x) = exp( pi*x ) 且 x_0 = 0 的四次泰勒多项式
我做了什么:
i)我的代码就是这样
x=0.001**2:
print(x)
这里我得到 0.0001,但是我现在应该如何将其四舍五入到 5 位数?
ii)这次我:
import numpy as np
x = 0.000122
y = np.cosh(x) + np.cos(x) - 2
print(round(y, 18))
但是解决方案给了我 0.0,这似乎是错误的,因为...它再次表示将其四舍五入到小数点后 18 位。
iii)这里我刚刚开始泰勒级数:
import math
x = math.pi*0.981
p4 = x**0/math.factorial(0) + x**1/math.factorial(1) + x**2/math.factorial(2) + x**3/math.factorial(3) + x**4/math.factorial(4)
print(p4)
这样可以吗?我在哪里使用$x_0=0$?当我没有使用每一个提示时,我总是不确定。我的下一步是:
error=abs(math.e**(math.pi*0.981)-p4)
这样可以吗?
最佳答案
f(x) = cosh(x) + cos(x) - 2
根据泰勒展开式,其值为
[1+x^2/2+x^4/24+...] + [1-x^2/2+x^4/24+...] - 2 = x^4/12 + O(x^8)
但是,在给定值 x=1.22e-4
处计算此公式的误差大约为 4*1.1e-16
。因此,精确值小于浮点噪声。或者换句话说,该公式包含 2 或 3 个灾难性取消的实例。不可能通过所需的正确位数获得所需的结果。
您可以使用双参数恒等式来稍微缓解这个问题,
cosh(x)-1 = 2*sinh²(x/2)
cos(x) -1 = -2*sin²(x/2)
==> f(x) = 2*sinh²(x/2) - 2*sin²(x/2)
这样
from math import sin, cos, sinh, cosh
x=1.22e-4
y = 2*(sinh(x/2)**2-sin(x/2)**2)
print("%.18e\n%.18e"%(y, x**4/12)
给出结果
1.846112113571565333e-17
1.846112133333333120e-17
通过多精度评估,可以获得原始公式的更精确的值
1.84611 21333 33333 33357 67711 91051 10045 27621 30620 39852 27994 59662 46660 18747 71781 1746e-17
以及修改后的公式
1.84611 21333 33333 33357 67711 91051 10045 27621 30620 39852 27994 59662 46660 18747 71781 17468 16309 43036e-17
即使在这里,第一个公式也会产生抵消效果,因为第二个公式提供了更多的数字。
将这些结果与原始 double 结果进行比较,我们发现精确公式中只有 8
位是正确的,对应于相同二次泰勒项的剩余灾难性取消。泰勒展开式第一项有16位正确数字,对应相对误差O(x^4)~1e-16和相同大小的浮点精度。
关于python - 用python进行简单的数值计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58591495/