2017-01-10 28 views
1

解決遞歸鑑於在Sympy

a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w = symbols('a b c d e f g h i j k l m n o p q r s t u v w') 
c = (b/100) * a 
e = (d/100) * a 
g = (f/100) * a 
i = (a + c + e + g) * (h/100) 
l = (a + c + e + g + i + j) * (k/100) 
m = a + c + e + g + i + j + l 
o = m * (n/100) 
p = m + o 
s = w * (r/100) 
v = (p + q + s + t) * (u/100) 
w = p + q + s + t + v 

如果我使用subs

x = w.subs({a : 1727305.7, b: 27, d : 1.13, f: 0, h : 2, j: 23909.68, k : 0.027, n : 0, q: 1000, r : 3.5, t: 1988.77, u : 13.13 }) 

x最終被0.0395955*w + 2584992.38639031

如何解決在W遞歸通過設置迭代限制(如:在Excel中,我們可以將它設置爲10的迭代限制遞歸解決它),結果將是26,91,566

+0

提示:在第一行中,您還可以使用'from sympy.abc import *'。 – Wrzlprmft

+0

@Wrzlprmft:這個被修改,以將其粘貼到計算器:) –

回答

3

這裏做這樣那樣的問題,通過簡單地解決了全套由方程和吉文斯表示方程的一個稍微更普遍的方式。我已經將等式轉換成必須等於零的表達式:

eqs = [ 
    c - (b/100) * a, 
    e - (d/100) * a, 
    g - (f/100) * a, 
    i - (a + c + e + g) * (h/100), 
    l - (a + c + e + g + i + j) * (k/100), 
    m - (a + c + e + g + i + j + l), 
    o - m * (n/100), 
    p - (m + o), 
    s - w * (r/100), 
    v - (p + q + s + t) * (u/100), 
    w - (p + q + s + t + v), 
    ] 

這就是等式。現在,我們需要指定吉文斯:

givens = [a - 1727305.7, 
      b - 27, 
      d - 1.13, 
      f - 0, 
      h - 2, 
      j - 23909.68, 
      k - 0.027, 
      n - 0, 
      q - 1000, 
      r - 3.5, 
      t - 1988.77, 
      u - 13.13] 

最後我們就可以解決的全套式的

solve(eqs + givens) 

結果是這樣做的這樣

[{f: 0.0, 
    g: 0.0, 
    i: 44263.9358682000, 
    j: 23909.6800000000, 
    u: 13.1300000000000, 
    q: 1000.00000000000, 
    d: 1.13000000000000, 
    a: 1727305.70000000, 
    e: 19518.5544100000, 
    p: 2281986.37928871, 
    l: 615.970010505114, 
    w: 2691566.29981462, 
    s: 94204.8204935118, 
    k: 0.0270000000000000, 
    b: 27.0000000000000, 
    n: 0.0, 
    m: 2281986.37928871, 
    o: 0.0, 
    v: 312386.330032405, 
    h: 2.00000000000000, 
    r: 3.50000000000000, 
    c: 466372.539000000, 
    t: 1988.77000000000}] 

的好處事情是,我們不需要提前區分哪些事情將由.subs處理,哪些是平等的。唯一的缺點是如果沒有封閉的表單解決方案。 Excel中的迭代方法仍然可以工作,但這會失敗。

如果速度是重要的,你知道,這是考慮到事情不會改變,這是更快,更簡單隻有解決了最後一個等式:

c,e,g,i,j,l,m,o,p,s,u = symbols('c,e,g,i,j,l,m,o,p,s,u') 

a = 1727305.7 
b = 27 
d = 1.13 
f = 0 
h = 2 
j = 23909.68 
k = 0.027 
n = 0 
q = 1000 
r = 3.5 
t = 1988.77 
u = 13.13 
c = (b/100) * a 
e = (d/100) * a 
g = (f/100) * a 
i = (a + c + e + g) * (h/100) 
l = (a + c + e + g + i + j) * (k/100) 
m = a + c + e + g + i + j + l 
o = m * (n/100) 
p = m + o 
s = w * (r/100) 
v = (p + q + s + t) * (u/100) 

現在,

solve(w - (p + q + s + t + v), w) 

收益率

[2691566.29981462] 

最後,如果您預先求解方程,則會得到一個表達式您可以稍後替換:

sol = solve(w - (p + q + s + t + v), w)[0] 
sol.subs({a : 1727305.7, b: 27, d : 1.13, f: 0, h : 2, j: 23909.68, k : 0.027, n : 0, q: 1000, r : 3.5, t: 1988.77, u : 13.13 }) 
+0

雖然該解決方案是功能性的,這需要大約10秒來計算當調試,在那裏它可以被設置,以加快它 –

+0

@NareshJois奇怪的任何標誌。我的機器只需要700毫秒。我已經添加了一個只能解決最後一個等式的替代解決方案。 – chthonicdaemon

+0

忽略我之前對時間的評論,並感謝兩個解決方案 –