Как решить сложное уравнение с помощью sympy? - PullRequest
0 голосов
/ 17 июня 2020

Я использую 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))

Что мне делать, чтобы получить решение это уравнение быстро? Как мне определить свою функцию?

1 Ответ

0 голосов
/ 17 июня 2020

Ваше уравнение слишком сложно для символьного решения. Это, конечно, не линейно, как предлагается в вопросе. Для удобства sympy также поддерживает числовой решатель nsolve. nsolve требует начального значения в качестве третьего параметра.

Обратите внимание, что в вашем тестовом коде pv на самом деле не вычисляется, а -1 не учитывается в звонке на solve. 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)

Вывод:

0.0475300665272506
...