5

私は Python を初めて使用し、入力を非負の整数 n として受け取り、連分数の最初の n + 1 項を使用して e の値の近似値を計算するプログラムを作成するように依頼されました。

質問を解読しようとしましたが、質問のすべてを正確に理解することはできません。正確な答えを探しているわけではありませんが、途中で役立つ例を期待しています。

これは正確な質問
です。以下は、以前に連分数で行ったコードです。

import math
# Get x from user
x = float(input("Enter x = "))

# Calculate initial variables and print
a0 = x//1
r0 = x-a0
print("a0 =", a0, "\tr0 =", r0)

# Calculate ai and ri for i = 1,2,3 and print results

a1 = 1/r0//1
r1 = 1/r0 - a1
print("a1 =", a1, "\tr1 =", r1)

a2 = 1/r1//1
r2 = 1/r1 - a2
print("a2 =", a2, "\tr2 =", r2)

a3 = 1/r2//1
r3 = 1/r2 - a3
print("a3 =", a3, "\tr3 =", r3)
4

2 に答える 2

9

詳細な情報がなければ、 Wikipediaに示されているように、eの単純な連分数展開を使用するのがおそらく Good Idea™ です。

e = [2; 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8, 1, 1, 10, 1, 1, 12, 1, 1, ...]

このシーケンスは、単純なリスト内包表記を使用して簡単に作成できます。

単純な連分数展開を評価するために、リストを逆の順序で処理できます。

次のコードは、Python 2 または Python 3 で動作します。

#!/usr/bin/env python

''' Calculate e using its simple continued fraction expansion

    See http://stackoverflow.com/q/36077810/4014959

    Also see
    https://en.wikipedia.org/wiki/Continued_fraction#Regular_patterns_in_continued_fractions

    Written by PM 2Ring 2016.03.18
'''

from __future__ import print_function, division
import sys

def contfrac_to_frac(seq):
    ''' Convert the simple continued fraction in `seq` 
        into a fraction, num / den
    '''
    num, den = 1, 0
    for u in reversed(seq):
        num, den = den + num*u, num
    return num, den

def e_cont_frac(n):
    ''' Build `n` terms of the simple continued fraction expansion of e
        `n` must be a positive integer
    '''
    seq = [2 * (i+1) // 3 if i%3 == 2 else 1 for i in range(n)]
    seq[0] += 1
    return seq

def main():
    # Get the the number of terms, less one
    n = int(sys.argv[1]) if len(sys.argv) > 1 else 11
    if n < 0:
        print('Argument must be >= 0')
        exit()

    n += 1
    seq = e_cont_frac(n)
    num, den = contfrac_to_frac(seq)

    print('Terms =', n)
    print('Continued fraction:', seq)
    print('Fraction: {0} / {1}'.format(num, den))
    print('Float {0:0.15f}'.format(num / den))

if __name__ == '__main__':
    main()

出力

Terms = 12
Continued fraction: [2, 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8]
Fraction: 23225 / 8544
Float 2.718281835205993

プログラムに 20 の引数を渡して、Python 浮動小数点数を使用して可能な限り最適な近似値を取得します: 2.718281828459045


Rory Daulton (およびウィキペディア) が言及しているように、継続分数リストを逆にする必要はありません。順方向に処理できますが、2 世代の分子と分母を追跡する必要があるため、さらに 2 つの変数が必要です。これは、それを行うバージョンですcontfrac_to_frac

def contfrac_to_frac(seq):
    ''' Convert the simple continued fraction in `seq`
        into a fraction, num / den
    '''
    n, d, num, den = 0, 1, 1, 0
    for u in seq:
        n, d, num, den = num, den, num*u + n, den*u + d
    return num, den
于 2016-03-18T08:59:50.293 に答える
3

値 e は、次の連分数の極限として表すことができます。

e = 2 + 1 / (1 + 1 / (2 + 2 / (3 + 3 / (4 + 4 / (...)))))

イニシャル2 + 1 /はメインパターンから外れますが、その後は図のように続きます。あなたの仕事は、これをn深く評価することです。その時点で停止し、その時点までの値を返します。

必ず浮動小数点で計算を実行してください。

于 2016-03-18T06:50:28.723 に答える