Вот минимальный воспроизводимый пример:
Код: Выделить всё
from sympy import symbols, Mul, diff, solve
from decimal import Decimal
class Histogram:
def __init__(self, bins, pdf):
self.bins = bins
self.pdf = pdf
histogram = Histogram(
bins=[-1, 0, 1],
pdf=[Decimal('0.454861111111111104943205418749130330979824066162109375'),
Decimal('0'),
Decimal('0.545138888888888839545643349993042647838592529296875')]
)
def computation(histogram):
A = Decimal('1')
e = Decimal('1')
M_factor = Decimal('1.0828567056280801')
x = symbols('x')
product_terms = []
profit = lambda cp: (e * M_factor ** cp - e) * x
commission = lambda cp: (e * M_factor ** cp + e) * Decimal('0.0005') * x
for candles_profit, freq in zip(histogram.bins, histogram.pdf):
profit_term = profit(candles_profit)
commission_term = commission(candles_profit)
term = ((A + profit_term - commission_term) / A) ** freq
product_terms.append(term)
expression = Mul(*product_terms)
derivative = diff(expression, x)
solutions = solve(derivative, x)
print("Solutions:", solutions)
computation(histogram)
Код: Выделить всё
(1.0 - 0.0774785191289289x)^0.454861111111111 \* (0.0818152772752661x + 1.0)^0.545138888888889
Уникальный Я вижу, что особенность, которая может объяснить неудачу, заключается в том, что в ее показателях есть повторяющиеся десятичные дроби, как в рациональном числе, таком как 2/3. Чтобы подтвердить свою интуицию о том, что это является источником ошибки, я еще раз просмотрел сделки, которые сформировали гистограмму для этого символа: 131 были в сегменте -1 и 157 были в сегменте +1. 131/288 = 0,454861 с повторяющейся 1 и 157/288 = 0,545138 с повторяющейся 8. Таким образом, получается, что хотя десятичные значения сохраняют много позиций точности в гистограмме, которую мы передаем в вычислительную функцию, эти значения неточны. поскольку повторение через некоторое время прекращается, но даже это не имеет значения, потому что Sympy обрезает значения до этого момента. Поскольку Sympy.solve преобразует мои входные десятичные дроби Python в числовые значения с плавающей запятой, а не в рациональные числа Sympy, разумно ли ожидать, что это является источником проблемы? Если да, то как я могу изменить свой код, чтобы вычисления выполнялись правильно, а не застревали навсегда?
Подробнее здесь: https://stackoverflow.com/questions/790 ... efficients