2017-01-10 24 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

忽略我之前对时间的评论,并感谢两个解决方案 –