给定
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/