我无法从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)))