asp*_*e99 8 python math floating-point fixed-point arbitrary-precision
我正在使用API mpmath来计算以下总和
让我们考虑一下由下式定义的系列u0,u1,u2:
u0 = 3/2 = 1,5
u1 = 5/3 = 1,6666666…
un+1 = 2003 - 6002/un + 4000/un un-1
Run Code Online (Sandbox Code Playgroud)
系列在2上收敛,但由于四舍五入问题,它似乎在2000年汇合.
n Calculated value Rounded off exact value 2 1,800001 1,800000000 3 1,890000 1,888888889 4 3,116924 1,941176471 5 756,3870306 1,969696970 6 1996,761549 1,984615385 7 1999,996781 1,992248062 8 1999,999997 1,996108949 9 2000,000000 1,998050682 10 2000,000000 1,999024390
我的代码:
from mpmath import *
mp.dps = 50
u0=mpf(3/2.0)
u1=mpf(5/3.0)
u=[]
u.append(u0)
u.append(u1)
for i in range (2,11):
un1=(2003-6002/u[i-1]+(mpf(4000)/mpf((u[i-1]*u[i-2]))))
u.append(un1)
print u
Run Code Online (Sandbox Code Playgroud)
我的结果不好:
[mpf('1.5'),
mpf('1.6666666666666667406815349750104360282421112060546875'),
mpf('1.8000000000000888711326751945268011597589466120961647'),
mpf('1.8888888889876302386905492787148253684796100079942617'),
mpf('1.9411765751351638992775070422559330255517747908588059'),
mpf('1.9698046831709839591526211645628191427874374792786951'),
mpf('2.093979191783975876606205176530675127058752077926479'),
mpf('106.44733511712489354422046139349654833300787666477228'),
mpf('1964.5606972399290690749220686397494349501387742896911'),
mpf('1999.9639916238009625032390578545797067344576357100626'),
mpf('1999.9999640260895343960004614025893194430187653900418')]
Run Code Online (Sandbox Code Playgroud)
我试图用其他一些函数(fdiv ...)执行或改变精度:同样糟糕的结果
这段代码出了什么问题?
问题:如何更改我的代码以找到值2.0 ??? 配方:
un + 1 = 2003 - 6002/un + 4000/un un-1
谢谢
Ray*_*ger 13
使用十进制模块,您可以看到该系列还有一个融合在2000的解决方案:
from decimal import Decimal, getcontext
getcontext().prec = 100
u0=Decimal(3) / Decimal(2)
u1=Decimal(5) / Decimal(3)
u=[u0, u1]
for i in range(100):
un1 = 2003 - 6002/u[-1] + 4000/(u[-1]*u[-2])
u.append(un1)
print un1
Run Code Online (Sandbox Code Playgroud)
递归关系有多个固定点(一个在2,另一个在2000):
>>> u = [Decimal(2), Decimal(2)]
>>> 2003 - 6002/u[-1] + 4000/(u[-1]*u[-2])
Decimal('2')
>>> u = [Decimal(2000), Decimal(2000)]
>>> 2003 - 6002/u[-1] + 4000/(u[-1]*u[-2])
Decimal('2000.000')
Run Code Online (Sandbox Code Playgroud)
2处的解是一个不稳定的定点.该吸引力的固定点是在2000.
收敛变得非常接近2,当圆整导致值略微超过2时,该差异一次又一次地被放大直到达到2000.