在python中实现Euler方法



我试图用python实现欧拉的方法来计算一系列数字,但问题是N很大(10000000(。蟒蛇不断告诉我溢出。有人知道更好的计算方法吗?

def facto(n):
if n == 0:
return 1
else:
return n*facto(n-1)
def exp(x, n):
my_sum = 0.0
for i in range(n+1):
my_sum += (x**i)/facto(i)
return my_sum
def r(n):
return int(exp(x, n)*n)/n

对于范围(1,N(中的i:打印(r(i((

#factor是我用来计算数字的阶乘的函数

重新

代码问题:

  1. 函数r(n(应具有x作为输入,即def r(x, n):
  2. 函数exp,第my_sum += (x**i)/facto(i)行得到错误OverflowError:int太大,无法转换为float,例如当N=1000时
  3. 事实是递归的,因此将在n~1000处达到最大递归深度

选项1--使用对数进行除法

import math
def facto(n):
' Iterative calculation for factorial to prevent reaching max recursion depth which occurs for n ~ 1000 '
result = 1
for i in range(1, n+1):
result *= i

return result
def log_divide(num, denom):
' Division using log function '
return math.exp(math.log(num) - math.log(denom))  # subtract to logs, then exponentiate
def exp(x, n):
my_sum = 0.0
for i in range(n+1):
my_sum += log_divide(x**i, facto(i))
return my_sum
def r(x, n):
return int(exp(x, n)*n)/n

选项2——使用十进制模块,允许任意精度

import math
from decimal import Decimal, getcontext
getcontext().prec = 50                        # Set precision for decimal arithmetic
def facto(n):
' Iterative calculation for factorial to prevent reaching max recursion depth which occurs for n ~ 1000 '
result = 1
for i in range(1, n+1):
result *= i

return result
def exp(x, n):
my_sum = Decimal(0.0)
for i in range(n+1):
my_sum += Decimal((x**i))/Decimal(facto(i))

return my_sum

def r(x, n):
return int(exp(x, n)*n)/n

用法

两个版本都适用于N==1000:

r(1.0, 1000)
Out: 2.718

阶乘变得非常快非常大。与其计算每个项的阶乘,不如从上一项计算下一项:

def exp(x, n):
r = 1
result = 1.0
for i in range(1, n+1):
r *= x/i
result += r
return result

最新更新