如何确保SymPy的“求解”仅找到第一个(最接近的0)解决方案?

时间:2016-09-17 22:20:23

标签: python-2.7 trigonometry sympy complex-numbers

我无法从SymPy's solve获得合理的解决速度。

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

  • 得到它们需要太长时间

  • 我也得到太多结果(我只需要第一个),这意味着
  • 我必须通过尴尬的访问来获得第一个,
  • 即便如此,第一个也不太正确,我需要做一些丑陋的按摩来得到我想要的东西。

显然,有些事情我不了解SymPy的有效使用,特别是将结果限制在一个,并确保一个是我真正想到的第一个(这里,特别是最接近的一个) 0)。

如何确保SymPy的solve仅(并且相对较快)找到第一个(最近的0)解决方案?

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)))

0 个答案:

没有答案