繁体   English   中英

如何用 sympy 求解一个复杂的方程?

[英]How to solve a complex equation with sympy?

我正在使用 sympy 求解复杂的线性方程,但运行时间太长。

我的代码:

import pandas as pd
from sympy import Symbol, solve, solveset, S
return_issuedate = Symbol("x")
cf = [0.002475, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 1.01215]
dates= [0.030555555555555555, 0.2833333333333333, 0.5333333333333333, 0.7888888888888889, 1.0444444444444445, 1.2972222222222223, 1.5472222222222223, 1.8027777777777778, 2.058333333333333, 2.311111111111111, 2.563888888888889, 2.8194444444444446, 3.075, 3.225]
def fuc():
    pv = 0
    for i in range(len(dates)):
        pv += cf[i] / ((1.0348 + return_issuedate)**dates[i])
    return pv
y = pv-1
solve(pv, return_issuedate)
def fuc(x):
    Fuc = 0.906388368761923*(0.966357479077276*x + 1)**(-3.225) + 0.0182273612116527*(0.966357479077276*x + 1)**(-3.075) + 0.0183874673568639*(0.966357479077276*x + 1)**(-2.81944444444444) + 0.0185489798481412*(0.966357479077276*x + 1)**(-2.56388888888889) + 0.0187101323765637*(0.966357479077276*x + 1)**(-2.31111111111111) + 0.0188726849893914*(0.966357479077276*x + 1)**(-2.05833333333333) + 0.0190384595526071*(0.966357479077276*x + 1)**(-1.80277777777778) + 0.019205690252341*(0.966357479077276*x + 1)**(-1.54722222222222) + 0.0193707067861002*(0.966357479077276*x + 1)**(-1.29722222222222) + 0.0195389984334829*(0.966357479077276*x + 1)**(-1.04444444444444) + 0.0197106257844827*(0.966357479077276*x + 1)**(-0.788888888888889) + 0.0198837606819267*(0.966357479077276*x + 1)**(-0.533333333333333) + 0.0200546032407058*(0.966357479077276*x + 1)**(-0.283333333333333) + 0.00247241335529259*(0.966357479077276*x + 1)**(-0.0305555555555556) - 1
    return Fuc

print(scipy.optimize.fsolve(fuc,0))

我应该怎么做才能快速得到这个方程的解? 我应该如何定义我的 function?

你的方程太复杂了,不能用符号来解决。 正如问题帖子中所建议的那样,它肯定不是线性的。 为方便起见, sympy 还支持数值求解器nsolve nsolve需要一个初始值作为其第三个参数。

请注意,在您的测试代码中,并没有真正计算pv ,并且在调用solve时没有考虑-1 Eq(lhs, rhs)创建一个方程(这里这等效于表达式lhs-rhs == 0 )。

from sympy import Symbol, Eq, nsolve

return_issuedate = Symbol("x")
cf = [0.002475, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 0.02025, 1.01215]
dates = [0.030555555555555555, 0.2833333333333333, 0.5333333333333333, 0.7888888888888889, 1.0444444444444445, 1.2972222222222223, 1.5472222222222223, 1.8027777777777778, 2.058333333333333, 2.311111111111111, 2.563888888888889, 2.8194444444444446, 3.075, 3.225]

pv = sum([cf_i / ((1.0348 + return_issuedate) ** date_i) for cf_i, date_i in zip(cf, dates)])

res = nsolve(Eq(pv, 1), return_issuedate, 0)
print(res)

Output:

0.0475300665272506

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM