2016-06-11 6 views
1

У меня есть 4 входных переменных (поплавки):SymPy и mpmath дают "TypeError: не может создать MPF" при использовании функции егГ() в пределах solveset()

  • Xmax
  • Xmin
  • процент
  • режим

и я хочу, чтобы решить следующую (довольно долго) уравнение с:

> (1/2+1/2*erf((log(Xmax)-(log(mode)+s**2))/(sqrt(2)*s))-(1/2+1/2*erf((log(Xmin)-(log(mode)+s**2))/(sqrt(2)*s))) - percentage == 0 

Я хочу использовать mpmath и SymPy решить уравнение, но это дает мне следующее сообщение об ошибке:

TypeError: cannot create mpf from 0.707106781186547*(-s**2 - 0.287682072451781)/s

Мой код выглядит следующим образом:

from mpmath import erf, log, sqrt 
from sympy import Symbol, solveset, S 

percentage = 0.95 
mode = 2 
Xmin = 1. 
Xmax = 1.5 
s = Symbol('s') 

eqn = (1/2+1/2*erf((log(Xmax)-(log(mode)+s**2))/(sqrt(2)*s))-(1/2+1/2*erf((log(Xmin)-(log(mode)+s**2))/(sqrt(2)*s))) - percentage) 

solveset(eqn, s, domain=S.Reals) 

MPF является поплавок тип, созданный mpmath.

Я думаю, что я сузил проблему функции ERF(), она возвращает

EmptySet() 

когда я бегу

solveset(log(Xmax) - (log(mode) + s ** 2), s, domain=S.Reals) 

Я не могу понять, что попробовать дальше, любая помощь будет оценили!

Первоначально я думал, что это проблема с математикой, но уравнение успешно решено в Matlab, поэтому проблема, вероятно, исходит из sympy или mpmath.

ответ

5

Потеря mpmath импорта erf и использование версии sympy устраняет вашу ошибку.

from sympy import Symbol, solveset, S, erf, log, sqrt 

percentage = 0.95 
mode = 2 
Xmin = 1. 
Xmax = 1.5 
s = Symbol('s', real=True) 

eqn = (1/2+1/2*erf((log(Xmax)-(log(mode)+s**2))/(sqrt(2)*s))-(1/2+1/2*erf((log(Xmin)-(log(mode)+s**2))/(sqrt(2)*s))) - percentage) 

solveset(eqn, s) 

Обратите также внимание:

  • вам не придется импортировать log и sqrt из mpmath. Это не повлияет на ваш результат здесь, чтобы получить их от .
  • вы можете указать реальный домен на переменной s, это позволит вам сделать это на вызовах solveset.

Пример дальнейшего использования в тестах упаковки here, если вам это нужно.

+0

К сожалению, это не дает мне правильного ответа. Он возвращает объект «Conditionset» вместо одного поплавка, который является правильным ответом, который я получаю от matlab. – cachemoi

+0

. Этот код в матабеле дает правильный ответ для одного случая: Функция sigma = Test() % 1/2 + 1/2 * егГ ((журнал (Xmax) - (журнал (режим) + s^2))/(SQRT (2) * с)) - (1/2 + 1/2 * егГ ((журнал (Xmin) - (log (режим) + s^2))/(sqrt (2) * s))) syms s eqn = (1/2 + 1/2 * erf ((log (4) - (log (2)) + s^2))/(SQRT (2) * с)) - (1/2 + 1/2 * егГ ((журнал (1) - (журнал (2) + s^2))/(SQRT (2) * s)))) - 0.95 == 0; sigma = solve (eqn, s); % sigma = double (сигма); end – cachemoi

+0

Похоже, вам следует открыть второй вопрос для этого, поскольку он не связан. Название вашего вопроса здесь требует разрешения 'TypeError', что и было сделано выше. Извините, я не могу больше помочь –

 Смежные вопросы

  • Нет связанных вопросов^_^