用python进行简单数值计算

用python进行简单数值计算,python,numerical-methods,Python,Numerical Methods,在我的数值分析课程中,我们使用python进行编码,我对它还很陌生,所以我不确定我是否做对了,并感谢您的帮助。使用python,我需要计算: i) 0.01^2并输入四舍五入为5位有效数字的答案 ii)f(0.000122),其中f(x)=cosh(x)+cos(x)-2,并将答案四舍五入到小数点后18位 iii)计算点0.981处的绝对误差| f(x)-p|4(x)|,如果p|4(x)是近似于f(x)=exp(pi*x)且x|0=0的四次泰勒多项式 我所做的: i) 我的代码就是 x=0.00

在我的数值分析课程中,我们使用python进行编码,我对它还很陌生,所以我不确定我是否做对了,并感谢您的帮助。使用python,我需要计算:

i) 0.01^2并输入四舍五入为5位有效数字的答案

ii)f(0.000122),其中f(x)=cosh(x)+cos(x)-2,并将答案四舍五入到小数点后18位

iii)计算点0.981处的绝对误差| f(x)-p|4(x)|,如果p|4(x)是近似于f(x)=exp(pi*x)且x|0=0的四次泰勒多项式

我所做的:

i) 我的代码就是

x=0.001**2:
打印(x)
这里我得到0.0001,但我现在应该如何将其四舍五入到5位数

ii)这次我有:

将numpy导入为np
x=0.000122
y=np.cosh(x)+np.cos(x)-2
印刷品(圆形(y,18))
但是解决方案给了我0.0,这似乎是错误的,因为。。。它再次表示将其四舍五入到小数点后18位

iii)这里我刚从泰勒级数开始:

导入数学
x=数学pi*0.981
p4=x**0/数学阶乘(0)+x**1/数学阶乘(1)+x**2/数学阶乘(2)+x**3/数学阶乘(3)+x**4/数学阶乘(4)
打印(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)
所以

从数学导入sin,cos,sinh,cosh
x=1.22e-4
y=2*(sinh(x/2)**2-sin(x/2)**2)
打印(“%.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
以及修正公式

  1.84611 21333 33333 33357 67711 91051 10045 27621 30620 39852 27994 59662 46660 18747 71781 17468 16309 43036e-17
即使在这里,第一个公式也会产生抵消效应,因为第二个公式提供了更多的数字


将这些结果与原始的双精度结果进行比较,我们可以看到,精确公式中只有
8位是正确的,对应于相同的二次泰勒项的剩余灾难性消除。泰勒展开的第一项有16位正确的数字,对应于相对误差O(x^4)~1e-16和相同大小的浮点精度。

当他们说“四舍五入”时,他们可能会要求您显示那么多小数位数(这与使用
round()
)进行舍入不同。使用浮点数的字符串格式,只能出于显示目的进行舍入。请尝试
f“{1/3:.18f}”
(在字符串前面加上前导f-这是一个f字符串)在Python版本3.6或更高版本中,三分之一四舍五入到18位小数。您不需要导入numpy,两个变量中的余弦也会出现在数学模块中。//@blubberdiblub:要获得正确的非零小数数,是否最好使用
e
格式说明符?@Dr.LutzLehmann,这取决于y是什么您需要。由于
e
说明符强制使用e表示法(即
x*10^m
格式),如果您指定
f“{0.001:.18e}”
,您将在最重要的非零位之后获得18位小数,而对于
f“{0.001:.18f}”
你得到的是单位位置后的18位小数。我假设后者是最可能的解释,但你当然正确,另一位也可能是可能的解释。@Dr.LutzLehmann,我驳回另一位解释的原因是打印18位小数没有多大用处(加上点前的小数点)当小数点与最高有效位相对时的双精度浮点,因为IEEE双精度对于超过16位的小数不够精确。对于
f
说明符,它可能有用,具体取决于值的大小。当然,提出问题的人可能不知道这个事实。@blubberdiblub:Y是的,18位数字有点过多,它应该足以修复数字的二进制模式。如果不使用泰勒展开,只有8位是正确的,因此“大半”是垃圾。非常感谢。现在你的答案集中在ii)对吗?我对i)和iii)的答案正确吗?现在你如何得到ii)被18位小数取整的答案?i)任务和解决方案中有不同数量的零。此外,有效数字仅在前导零之后开始计数。iii)这看起来是正确的。展开点x_0是求导数得到泰勒系数的点,也是展开的中心点。我真的很抱歉问这个问题,但是。。。“任务和解决方案中有不同数量的零”是什么意思?所以我的答案是正确的,对吗?在任务描述中,您使用了0.01=1e-2。在python代码中,您编写了0.001=1e-3。在结果中,您编写了0.0001=1e-4,这是第一个值的平方,因此您可能在原始代码中做得对。