[英]Implement Euler method in python
我正在嘗試實現歐拉的方法來計算帶有 python 的數字序列,但問題是 N 很大(10000000)。 python 一直告訴我溢出。 有誰知道更好的計算方法?
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
對於范圍內的 i(1,N):打印(r(i))
#facto 是我用來計算數字的階乘的 function
回覆
代碼問題:
def r(x, n):
my_sum += (x**i)/facto(i)
得到錯誤 OverflowError: int too large to convert to float 例如當 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.