python - 在 Sympy 中解决递归问题

标签 python recursion sympy solver

给定

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

最佳答案

这是解决此类问题的一种更通用的方法,只需求解由方程和给定值表示的整组方程。我已将等式转换为必须等于零的表达式:

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 })

关于python - 在 Sympy 中解决递归问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41568519/

相关文章:

python - 如何将不确定性表达式(例如 3.23 +/- 0.01)从字符串转换为 float ?

python - 如何从同一个类的页面中的两个表中提取数据?

python - Jupyter 笔记本使用错误的路径(使用 Miniconda 而不是 Anaconda)

python - 将具有0值的2D数组导出到txt/csv文件

ruby - Ruby 中的递归方法性能

java - 具有终止条件的递归 Java

python - 显示每个单词的字数

javascript - 递归调用javascript函数

python - 函数调用的结果不是 float 、fsolve、sympy 的正确数组

python - SymPy,如何强制浮点以防止 Cython nogil 上下文中的错误