当前位置: 代码迷 >> python >> 使用python解释结果
  详细解决方案

使用python解释结果

热度:107   发布时间:2023-07-14 09:49:24.0

我正在尝试解决以下问题。

这是我产生的代码

import numpy as np
import math
sum = 4
while sum <= 13:
    b = 10**(-sum)
    x = (math.sqrt(9+b)-3)/(b)
    print(x)
    sum +=1

得到以下结果

0.16666620370475727
0.1666666203714584
0.1666666618049817
0.1666666671340522
0.1666666804567285
0.1666666804567285
0.1666666804567285
0.1666666804567285
0.16653345369377348
0.16431300764452317

我不确定我的代码是否正确。 当我在Wolfram的原始方程式中将n 13插入n时,会得到一些不同的结果。 我认为,当它接近13时,它将接近0.1666666。

另外,我该如何绘制图形呢? 我想这将是观察我的结果的最好方法。

这是一个完整的解决方案以及该图。 说明: np.logspace(4, 13, 10)x的值创建为10 ^(4),10 ^(5),10 ^(6)... 10 ^(13)。 您将其输出取反值,以得到所需的x点为10 ^(-4),10 ^(-5),10 ^(-6)... 10 ^(-13)。 然后,您可以遍历这些x值并求解方程式。 将每个x的输出值保存在列表中,然后将其绘制出来。

还有其他矢量化方法,而不必创建循环。 但这应该可以帮助您入门。

import numpy as np
import math
import matplotlib.pyplot as plt
xmesh = 1./np.logspace(4, 13, 10)
result = []

for x in xmesh:
    elem = (math.sqrt(9+x)-3)/(x) # removed 'b' because xmesh is already inverse
    result.append(elem) # Adds each element to the list for later plotting

plt.semilogx(xmesh, result, '-bo') # Uses a logarithmic x-axis
plt.gca().invert_xaxis() # Inverts the x-axis because you want it so as per comments
plt.xlabel('1/x', fontsize=16)
plt.ylabel('y', fontsize=16)
plt.show()

产量

使用你的代码

以下是如何在无需大量修改的情况下使用您的代码使其工作

import numpy as np
import math
import matplotlib.pyplot as plt
sum = 4
xmesh = 1./np.logspace(4, 13, 10)
result = []
while sum <= 13:
    b = 10**(-sum)
    x = (math.sqrt(9+b)-3)/(b)
    result.append(x)
    sum +=1
plt.semilogx(xmesh, result, '-bo')    
plt.gca().invert_xaxis()
plt.xlabel('1/x', fontsize=16)
plt.ylabel('y', fontsize=16)
plt.show()

向量化方法

import numpy as np

xmesh = 1./np.logspace(4, 13, 10)
result = (np.sqrt(9+xmesh)-3)/(xmesh) # No need to loop. Used `np.sqrt`

plt.semilogx(xmesh, result, '-bo')
plt.gca().invert_xaxis()

我不确定我的代码是否正确。

您的代码是正确的。

您所看到的是浮数有限精度的结果。

x→0(sqrt(9+x)-3)/x1/6 ,对于x较小值,当x真的很小时,分子的值接近1/6但分子受到影响通过舍入在结果math.sqrt ,收敛因此损失为限制值。

对于较小的x值,可以使用二项式近似来近似分子(9 + x)^ 0.5-3 = 3 *(1 + x / 9)^ 0.5-3≈3 *(1 + x / 18)-3 = 3 + x / 6-3 = x / 6,让我们看看使用Python到底发生了什么

>>> for n in range(7,16):
...   x = 10**(-n)
...   print('%2d %10e %s %15e %15e'%(n, x, repr(sqrt(9+x)), sqrt(9+x)-3, x/6))
... 
 7 1.000000e-07 3.0000000166666667    1.666667e-08    1.666667e-08
 8 1.000000e-08 3.000000001666667     1.666667e-09    1.666667e-09
 9 1.000000e-09 3.0000000001666667    1.666667e-10    1.666667e-10
10 1.000000e-10 3.0000000000166667    1.666667e-11    1.666667e-11
11 1.000000e-11 3.0000000000016667    1.666667e-12    1.666667e-12
12 1.000000e-12 3.0000000000001665    1.665335e-13    1.666667e-13
13 1.000000e-13 3.0000000000000164    1.643130e-14    1.666667e-14
14 1.000000e-14 3.0000000000000018    1.776357e-15    1.666667e-15
15 1.000000e-15 3.0000000000000004    4.440892e-16    1.666667e-16

我已经使用repr(...)来显示平方根结果中的有效数字,您会看到不同的并发现象①用来表示x / 6的有效数字的数目正在减少,②精度降低了。平方根的计算和③这些影响被抵消效果放大,因为您从基本正确的结果(3+δ)减去3。

另外,我该如何绘制图形呢? 我想这将是观察我的结果的最好方法。

如您所见,没有必要绘制结果图表以了解问题!!!

当您认识到四舍五入造成的不稳定后,剩下要做的就是解决问题的最后一部分,

有没有更好的方法来评估此表达式?