Python 2.7 我如何确保Symphy';s';求解';是否仅查找第一个(最接近的0)解决方案?

Python 2.7 我如何确保Symphy';s';求解';是否仅查找第一个(最接近的0)解决方案?,python-2.7,trigonometry,sympy,complex-numbers,Python 2.7,Trigonometry,Sympy,Complex Numbers,我无法从solve获得合理的解决速度 我可以使用下面的代码得到正确的结果,但是 要花很长时间才能得到它们 及 我也得到了太多的结果(我只需要第一个),这意味着 我必须通过尴尬的通道才能得到第一个 即使这样,第一个也不太正确,我需要做一些难看的按摩来得到我想要的 显然,对于有效地使用Symphy,我有一些不了解的地方,特别是将结果限制在一个,并确保一个是我期望的第一个(这里,特别是最接近0的一个) 如何确保Symphy的solve仅(且相对快速)找到第一个(最接近的0)解决方案 尝试用符

我无法从
solve
获得合理的解决速度

我可以使用下面的代码得到正确的结果,但是

  • 要花很长时间才能得到它们

  • 我也得到了太多的结果(我只需要第一个),这意味着
  • 我必须通过尴尬的通道才能得到第一个
  • 即使这样,第一个也不太正确,我需要做一些难看的按摩来得到我想要的
显然,对于有效地使用Symphy,我有一些不了解的地方,特别是将结果限制在一个,并确保一个是我期望的第一个(这里,特别是最接近0的一个)

如何确保Symphy的
solve
仅(且相对快速)找到第一个(最接近的0)解决方案



尝试用符号参数代替浮点变量来求解方程组。如果
solve
能够找到符号解,则只需将解的参数替换为相应的浮点数,这比每次提供不同的参数值时重新求解系统要快得多。如果您只对数值解感兴趣,使用类似于
sympy.nsolve
的数值解算器可能会更幸运。请尝试使用符号参数代替浮点变量来解算方程组。如果
solve
能够找到符号解,则只需将解的参数替换为相应的浮点数,这比每次提供不同的参数值时重新求解系统要快得多。如果您只对数值解感兴趣,使用类似于
sympy.nsolve
的数值解算器可能会更幸运。
from sympy.solvers import solve
from sympy import Symbol
import sympy

MODEL_PLANETS = ['Mercury', 'Venus', 'Mars', 'Jupiter', 'Saturn']
ra_obs = dict(zip(['Sun'] + MODEL_PLANETS,
                  [ra / 24 for ra in [18.73930, 20.11652, 16.04319, 13.81240, 11.61406, 16.65653]]))
rho = dict(zip(['Sun'] + MODEL_PLANETS,
               [0.0, 0.387, 0.723, 0.656168, 0.192197, 0.104833]))


def f(x, p):
    if p in ['Mercury', 'Venus']:
        return sympy.exp(2 * sympy.pi * sympy.I * ra_obs['Sun']) + rho[p] * sympy.exp(2 * sympy.pi * sympy.I * x)
    else:
        return rho[p] * sympy.exp(2 * sympy.pi * sympy.I * ra_obs['Sun']) + sympy.exp(2 * sympy.pi * sympy.I * x)


theta = Symbol('theta', nonnegative=False)


def get_solution(p):
    s = sympy.re((solve([sympy.re(f(theta, p)) - sympy.cos(2 * sympy.pi * ra_obs[p]),
                         sympy.im(f(theta, p)) - sympy.sin(2 * sympy.pi * ra_obs[p])], theta)[0])[theta])
    return (24 * (s if s > 0 else 1 - s)) % 24


for p in MODEL_PLANETS:
    print('{} = {}'.format(p, 24 - get_solution(p)))