我正在研究“xn+1=(13/3)xn-(4/3)xn-1”。我试图编写一个Python脚本来打印xn的前50个值,其中x0=1和x1=1/3。这是我当前的代码:
import math
def printRecurrence():
x = [0]*51 #initialize list of x values
x[0] = 1
x[1] = 1/3
for i in range(1, 51):
x[i+1] = (13/3)*x[i] - (4/3)*x[i-1]
print(x[i])
我收到的输出是:
^{pr2}$它只对前13个打印值正确。我得到的证据是xn=3-n,这在很大程度上与我的脚本值不匹配。我的计算有错吗?我一直看不见。在
您遇到浮点累积错误。在
由于当前结果依赖于以前的结果,而float类型只是一个近似值,所以运行的重复次数越多,累积误差增加的越多。在
因为您正在处理有理数,所以我建议使用
fraction
模块。在打印重复()
我已经打印了结果,
^{pr2}$3**-n
的计算值和差值:在20次复发后,差别会增加,但已经好多了。在
编辑:davidanswer让我意识到,分数到浮点的转换会破坏一切。在
fraction
模块只在2个精确计算的整数之间执行除法,但是转换为float会破坏精度。在这种递归关系可以通过使用
fractions
模块或使用decimal
模块以可变精度级别精确回答,这表明精确计算50次迭代所需的非常高的精度。在让-弗朗索瓦关于浮点累积误差的观点是正确的。但是
fraction
模块似乎无法将多个Fraction
对象相乘,因此所有的数值都必须在fraction对象中声明。感谢他使用了正确的模块来解决这个问题。在确切答案
打印结果表明,计算结果与证明答案完全吻合。在
不准确但有启发性的回答
^{pr2}$decimal
模块允许自定义精度级别;要达到50次迭代,需要60点或更高的精度。在和让-弗朗索瓦的回答一样,我已经打印了结果,3**-n的计算值和差值。可以使用精度级别
getcontext().prec
来查看对结果的影响。在相关问题 更多 >
编程相关推荐