2 回答

TA贡献1836条经验 获得超3个赞
这不是一个简单的方程来解决。它与功率计算无关,只是方程太复杂,sympy 无法求解 r。
但是,如果其他变量有特定值并且您需要求解 r(即为非平凡方程找到零),则可以使用数值求解器:nsolve
# Solve the equation for r
from sympy import var, Eq, solve
var('C, r, n, fv, P', positive = True)
# this throws an error: no algorithms are implemented to solve equation
equation = Eq(P, C * ((1-1/(1+r)**n))/r + fv/(1+r)**n)
# a simple calculation for power works fine
equation = Eq(P, (1+r)**n)
solve(equation, r)

TA贡献1966条经验 获得超4个赞
您要解决的方程式是:
In [23]: eq
Out[23]:
⎛ -n⎞
C⋅⎝1 - (r + 1) ⎠ -n
P = ───────────────── + fv⋅(r + 1)
r
我们可以将它重新排列成这样的多项式
In [24]: eq2 = Eq(eq.lhs * (1+r)**n * r, eq.rhs * (1+r)**n * r).expand()
In [25]: eq2
Out[25]:
n n
P⋅r⋅(r + 1) = C⋅(r + 1) - C + fv⋅r
现在我们看到这是一个多项式,只是指数n是符号的。一般来说,这种方程不会有一个可以用封闭形式表达的解——这就是为什么 sympy 没有针对这种特殊情况的算法(它不是 sympy 本身的限制)。
可以对这个方程进行数值求解,但只有当我们对每个参数都有数值时,数值求解才有效。如果我们用数字代替参数,那么nsolve可以用数字找到解决方案:
In [26]: eq3 = eq.subs({P:1, C:2, fv:1, n:100})
In [27]: eq3
Out[27]:
⎛ 1 ⎞
2⋅⎜1 - ──────────⎟
⎜ 100⎟
1 ⎝ (r + 1) ⎠
1 = ────────── + ──────────────────
100 r
(r + 1)
In [28]: nsolve(eq3, r, 1)
Out[28]: 2.00000000000000
但请注意,此方程的解不是唯一的,例如 -2 也是这里的解:
In [52]: nsolve(eq3, r, -1.9)
Out[52]: -2.00000000000000
这个特殊的方程有大约 100 个根,但不一定都是实数。
添加回答
举报