Python не может создать mpf из phi

После исправления импорта в предыдущем вопросе (Python AttributeError:cos) и небольшого изменения функций с помощью sympy те:

from sympy import *
from sympy import Symbol
from sympy.solvers import nsolve

# Symbols
theta = Symbol('theta')
phi = Symbol('phi')
phi0 = Symbol('phi0')
H0 = Symbol('H0')
# Constants
a = 0.05 
b = 0.05**2/(8*pi*1e-7)
c = 0.001/(4*pi*1e-7)
phi0 = 60*pi/180 
H0 = -0.03/(4*pi*1e-7)
def m(theta,phi):
    return Matrix([[sin(theta)*cos(phi), sin(theta)*cos(phi), cos(phi)]])
def h(phi0):
    return Matrix([[cos(phi0), sin(phi0), 0]])
def k(theta,phi,phi0):
    return m(theta,phi).dot(h(phi0))
def F(theta,phi,phi0,H0): 
    return -(a*H0)*k(theta,phi,phi0)+b*(cos(theta)**2)+c*(sin(2*theta)**2)+sin(theta)**4*sin(2*phi)**2
def F_phi(theta,phi,phi0,H0):
    return simplify(diff(F(theta,phi,phi0,H0),phi))
def G(phi):
    return F_phi(pi/2,phi,phi0,H0)
solution = nsolve(G(phi), phi)
print solution

Я получаю эту трассировку:

Traceback (most recent call last):
File "Test.py", line 31, in <module>
solution = nsolve(G(phi), phi)
File "/usr/lib64/python2.7/site-packages/sympy/solvers/solvers.py", line 2050, in nsolve
return findroot(f, x0, **kwargs)
File "/usr/lib64/python2.7/site-packages/mpmath/calculus/optimization.py", line 908, in findroot
x0 = [ctx.convert(x0)]
File "/usr/lib64/python2.7/site-packages/mpmath/ctx_mp_python.py", line 662, in convert
return ctx._convert_fallback(x, strings)
File "/usr/lib64/python2.7/site-packages/mpmath/ctx_mp.py", line 561, in _convert_fallback
raise TypeError("cannot create mpf from " + repr(x))
TypeError: cannot create mpf from phi

person aymenbh    schedule 12.11.2012    source источник


Ответы (1)


Второй аргумент nsolve должен быть начальным предположением, а не символом. Из строки документации

Solve a nonlinear equation system numerically::

    nsolve(f, [args,] x0, modules=['mpmath'], **kwargs)

f is a vector function of symbolic expressions representing the system.
args are the variables. If there is only one variable, this argument can
be omitted.
x0 is a starting vector close to a solution.

Итак, вам нужно что-то вроде nsolve(G(phi), 0) или nsolve(G(phi), 3) и т. д. (в зависимости от того, какое решение вы хотите).

person asmeurer    schedule 12.11.2012
comment
Спасибо! Я не проверил функцию nsolve должным образом. На самом деле я переносил программу Mathematica на Python. Но кажется, что эта функция дает вам одно решение в зависимости от вашего первоначального предположения. Можно ли получить список всех возможных решений? (в данном случае это 0 и пи). - person aymenbh; 12.11.2012
comment
Я просто использовал цикл for для небольшого диапазона. К сожалению, он вызывает исключение для значений, которые слишком далеки от решения, поэтому вам придется обернуть его в блок try. Теоретически SymPy должен иметь возможность символически решать подобные задачи, но алгоритмы еще не реализованы. - person asmeurer; 12.11.2012
comment
Я на самом деле пробовал это с циклом for, и он отлично работает. Надеемся, что алгоритмы для символического решения таких уравнений скоро будут реализованы! - person aymenbh; 12.11.2012
comment
На самом деле, он может найти одно из решений (0), если вы сначала примените expand(trig=True). SymPy все еще далек от решения триггерных выражений (во-первых, ему нужен хороший способ выражать бесконечное количество решений и манипулировать ими). - person asmeurer; 13.11.2012
comment
Я использовал цикл for для равномерно распределенных значений (как исходные догадки) по [0, pi] (i*pi/4, i в диапазоне (5)) и отслеживал решения в списке. Если вы попробуете, вы увидите, что у вас может быть одно и то же решение для разных i. Что мне кажется странным, так это то, что я получаю 9,42 в качестве решения для i = 1, но если вы сохраните только значения в [0, pi], вы получите 2 решения. - person aymenbh; 13.11.2012
comment
Вероятно, n*pi является решением для любого n. nsolve не гарантирует, что найдет какое-либо конкретное решение, даже самое близкое к первоначальному предположению. - person asmeurer; 13.11.2012
comment
Да, прямо сейчас у меня возникают проблемы с nsolve в некоторых ситуациях. И кажется, что программа выполняется намного дольше, чем ее эквивалент в Mathematica. Это нормально? Вы знаете, лучше ли Numpy/Scipy, чем Sympy? - person aymenbh; 14.11.2012
comment
SymPy сосредоточен на символике. Если вы собираетесь использовать числа, то что-то вроде numpy/scipy будет лучше, да. - person asmeurer; 14.11.2012