Решение уравнения - ошибка переполнения

В основном я просто хочу решить k. Обратите внимание, что уравнение равно 1.12

import math
from sympy import *

a = 1.45
b = 4.1
c = 14.0

al = math.log(a, 2)
bl = math.log(b, 2)
cl = math.log(c, 2)

k = symbols('k')

print solve(Eq(1/k**al + 1/k**bl + 1/k**cl, 1.12), k)

Это повышает OverflowError: Python int too large to convert to C long

Также приветствуется решение с использованием других библиотек.


person nutship    schedule 19.07.2013    source источник


Ответы (2)


Поскольку вы используете числовые значения, я предполагаю, что вы ищете числовое решение. В этом случае вам не следует использовать решение, потому что оно пытается найти символьное решение. Проблема здесь в том, что он преобразует эти экспоненты с плавающей запятой в рациональные экспоненты, которые имеют очень большие числители и знаменатели, а затем в какой-то момент пытается создать полиномы степени, соответствующие этим большим числам, и здесь он терпит неудачу.

Чтобы решить численно, вы можете использовать nsolve.

>>> print nsolve(Eq(1/k**al + 1/k**bl + 1/k**cl, 1.12), 2)
1.82427203413783

Однако лучше использовать числовые библиотеки, такие как SciPy, если вас интересуют числовые решения. Вы можете использовать lambdify для преобразования выражений SymPy в функции, более подходящие для таких библиотек, как SciPy, использующих массивы NumPy.

person asmeurer    schedule 20.07.2013
comment
Спасибо, сработало как шарм! Что означает этот 2 в конце строки? Всегда ли это значение 2? Во многих документах я видел, что там ставится символ, как здесь: k. - person nutship; 21.07.2013
comment
В solve вы передаете символ или список символов для решения. В nsolve вы можете одновременно решать только один символ (поскольку остальные должны быть числовыми), поэтому нет необходимости передавать это. Но что ему нужно, так это первоначальная догадка. Вот что такое 2. Если у вас есть уравнение с несколькими решениями, вы можете найти другие, указав предположения рядом с решением, которое вы ищете. - person asmeurer; 21.07.2013

Это известная проблема.

Вы можете попробовать

solve(Eq(1/k**al + 1/k**bl + 1/k**cl, 1.12), k, rational=False)
person zs2020    schedule 19.07.2013
comment
Спасибо, но это повышает No algorithms are implemented to solve equation... - person nutship; 20.07.2013
comment
@nutship Это может быть связано с чем-то другим, кроме синтаксиса кода, о котором вы просили. Возможно, ваше уравнение слишком сложное. Ознакомьтесь с решателями doc. - person zs2020; 20.07.2013