0

与えられた入力:

present value = 11, SUMMATIONS of future values that = 126, and n = 7 (periods of change)

合計が FV になるチェーンを作成するチェーンのレートをどのように解決できますか? これは、単に 11 から 126 の間の収益率を求めることとは異なります。これは、合計が 126 になるような収益率を求めることです。私はさまざまなアイデアを試し、IRR と NPV 関数を調べてきましたが、合計の側面に困惑しています。 .

合計の側面が明確でない場合、レートを 1.1 と仮定すると、PV = 11 がそのようなリストに変わります (合計するとほぼ FV 126 になります)。 fv と pv の合計?:

11
12.1
13.31
14.641
16.1051
17.71561
19.487171
21.4358881

合計 = 125.7947691

ありがとうございました。

編集:一種のイテレータを作成しようとしましたが、最初のループの後にハングしています...

for r in (1.01,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09,1.10,1.11,1.12):
    print r
    test = round(11* (1-r**8) / (1 - r),0)
    print test
    while True:
        if round(126,0) == round(11* (1-r**8) / (1 - r),0):
            answer = r
            break
        else:
            pass

編集2:

IV = float(11)
SV = float(126)
N = 8
# sum of a geometric series: (SV = IV * (1 - r^n) / (1 - r )
# r^n - (SV/PV)*r + ((SV - IV)/IV) = 0
# long form polynomial to be solved, with an n of 3 for example:
# 1r^n + 0r^n + 0r^n + -(SV/PV)r + ((SV - IV)/IV)
# each polynomial coefficient can go into numpy.roots to solve
# for the r that solves for the abcd * R = 0 above.

import numpy
array = numpy.roots([1.,0.,0.,0.,0.,0.,0.,(-SV)/IV,(SV-IV)/IV])
for i in array:
    if i > 1:
        a = str(i)
        b = a.split("+")
        answer = float(b[0])
print answer

文字列「1.10044876702」を浮動小数点数に変換できないという ValueError が表示されます。何か案は?

解決済み: i.real は実際の部分を取得します。分割または文字列変換の必要はありません。つまり:

for i in array:
        if i > 1:
            a = i.real
            answer = float(a)
    print answer
4

2 に答える 2

2

幾何級数の合計

下塗り、

126 = 11 * (1 - r**8) / (1 - r)

について解く必要がある場所r。再配置後、

r**8 - (126/11)*r + (115/11) = 0

次にNumPyを使用

import numpy as np
np.roots([1., 0., 0., 0., 0., 0., 0., -126./11, 115./11])

与える

array([-1.37597528+0.62438671j, -1.37597528-0.62438671j,
   -0.42293755+1.41183514j, -0.42293755-1.41183514j,
    0.74868844+1.1640769j ,  0.74868844-1.1640769j ,
    1.10044877+0.j        ,  1.00000000+0.j        ])

ここで、最初の 6 つの根は虚数で、最後の根は無効です (元の方程式では 0 による div を与えます)。したがって、使用可能な唯一の答えはr = 1.10044877です。

編集:

Numpy docsによるnp.rootと、多項式係数を含む配列のようなオブジェクト (別名リスト) が必要です。したがって、上記のパラメーターは として読み取ることができます1.0*r^8 + 0.*r^7 + 0.*r^6 + 0.*r^5 + 0.*r^4 + 0.*r^3 + 0.*r^2 + -126./11*r + 115./11。これは、解かれる多項式です。

反復ソルバーはかなり粗雑です。大まかな答えが得られますが、計算時間は必要な精度で指数関数的になります。私たちはもっとうまくやることができます!

8 次方程式の一般的な解析解は知られていないため、数値的な方法が必要です。

独自のソルバーをゼロからコーディングしたい場合、最も簡単なのはニュートン-ラフソン法です。推測から始めて、関数を繰り返し評価し、最初の導関数で割った誤差で推測を相殺して、根に収束することを願っています。あなたの最初の推測が正しいものであり、あなたの方程式が真の根を持っていることを願っています。

すぐに良い答えを得ることをもっと気にかけているなら、np.rootこれに勝るものはありません - コンパニオン行列の固有ベクトルを計算して、実数と複素数の両方のすべての根を同時に見つけます。

編集2:

あなたのwhile True句のために反復ソルバーがハングしています-rループ内で変更されることはありませんbreak。また、else: pass冗長であり、削除できます。

かなりの再配置の後、コードは次のようになります。

import numpy as np

def iterative_test(rng, fn, goal):
    return min(rng, key=lambda x: abs(goal - fn(x)))

rng  = np.arange(1.01, 1.20, 0.01)
fn   = lambda x: 11. * (1. - x**8) / (1. - x)
goal = 126.
sol  = iterative_test(rng, fn, goal)

print('Solution: {} -> {}'.format(sol, fn(sol)))

その結果、

Solution: 1.1 -> 125.7947691

編集3:

最後のソリューションははるかに良く見えますが、周期の数が変化すると、多項式の次数 (したがって、np.roots に渡される配列の長さ)が変化することに注意する必要があります。

import numpy as np

def find_rate(present_value, final_sum, periods):
    """
    Given the initial value, sum, and number of periods in
    a geometric series, solve for the rate of growth.
    """
    # The formula for the sum of a geometric series is
    #     final_sum = sum_i[0..periods](present_value * rate**i)
    # which can be reduced to
    #     final_sum = present_value * (1 - rate**(periods+1) / (1 - rate)
    # and then rearranged as
    #     rate**(periods+1) - (final_sum / present_value)*rate + (final_sum / present_value - 1) = 0

    # Build the polynomial
    poly     = [0.] * (periods + 2)
    poly[ 0] =  1.
    poly[-2] = -1. * final_sum / present_value
    poly[-1] =  1. * final_sum / present_value - 1.

    # Find the roots
    roots = np.roots(poly)

    # Discard unusable roots
    roots = [rt for rt in roots if rt.imag == 0. and rt.real != 1.]

    # Should be zero or one roots left
    if len(roots):
        return roots[0].real
    else:
        raise ValueError('no solution found')

def main():
    pv, fs, p = 11., 126., 7
    print('Solution for present_value = {}, final_sum = {}, periods = {}:'.format(pv, fs, p))
    print('rate = {}'.format(find_rate(pv, fs, p)))

if __name__=="__main__":
    main()

これにより、次が生成されます。

Solution for present_value = 11.0, final_sum = 126.0, periods = 7:
rate = 1.10044876702
于 2014-02-03T06:22:43.467 に答える
0

多項式の根を解くのはやり過ぎです。この計算は、通常、指数公式に直接適用されるニュートン法などのソルバーで行われます。断片的な期間でも機能します。

たとえば、https://math.stackexchange.com/questions/502976/newtons-method-annuity-due-equation

于 2014-02-03T13:20:51.163 に答える