簡體   English   中英

在 python 中實現歐拉方法

[英]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

回覆

代碼問題:

  1. function r(n) 應該有 x 作為輸入,即def r(x, n):
  2. function exp, Line my_sum += (x**i)/facto(i)得到錯誤 OverflowError: int too large to convert to float 例如當 N = 1000
  3. facto 是遞歸的,因此將在 n ~ 1,000 處達到最大遞歸深度。

選項 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM