python - 用python进行简单的数值计算

标签 python numerical-methods

我们在数值分析课上使用 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/

相关文章:

python - 解释了正确的守护程序行为(来自PEP 3143)

python - 配置VPC时AWS lambda函数ConnectionError

python - 如何检测django的确切浏览器

python - sklearn train_test_split;保留训练集中列中的唯一值

python - 四阶龙格-库塔

Python 的 super()、抽象基类和 NotImplementedError

math - 时间修正的 Verlet 数值积分公式

r - 在 R 中实现幂方法时的无限递归

matrix - C++ 稀疏矩阵库

python - 如何根据伪代码正确实现求和和数组迭代。 PYTHON松弛法