im试图找到以下形式的先验方程的解:
(arccos(tan(lat)/ tan(inc)))-((n * pi)+(arccos(sin(lat)/ sin(inc))))* 1 / q = 0
(这是用于计算轨道重访的论文的一部分...) 我知道可以提供lat,n和q参数,并且只能为inc参数找到解决方案。
并非总是有解决方案的... n和q必须是允许的某些值,但是例如,如果lat为-60,则n = 1且3/8 <1 / q <.5应该起作用在abs(lat)和180-abs(lat)之间有inc的解,例如,如果lat的值为-60度,那么inc的值应在60到120度之间,这就是物理学上所说的...
我已经在stackoverflow中基于其他超越方程的拟议解决方案尝试了以下代码,但是我无法在预期值内获得inc值,并且在大多数情况下,错误是arcos(tan(lat)/ tan(inc) ))并非介于-1和1之间的期望值,但如果不是这种情况,则求解器仍然无法求解并为inc提供任何期望值。
我正在使用以下代码进行测试:
from scipy.optimize import minimize
from numpy import arccos, sin, tan, radians,pi,degrees
def opt_fun(n,lat,q,inc):
if abs(tan(lat)/tan(inc))<1.000:
print(lat,inc)
f=(arccos(tan(lat)/tan(inc)))-((n*pi)+(arccos(sin(lat)/sin(inc))))*1/q
else:
f=0
return(f)
n=1
lat=radians(-60.0)
q = 2
for i in range(1,100):
q+=.1
try:
res = minimize(lambda inc: opt_fun(n,lat,q,inc), x0=abs(lat))
# Check if the optimization was successful
print(res.success)
if res.success:
# expected >> True
# Extract the root from the minimization result
print(degrees(res.x[:]))
# expected: abs(lat) < inc < 180-abs(lat)
except:
pass
如果运行它,您会看到唯一可能的解决方案是abs(tan(lat)/ tan(inc))<1.000,但inc值不在0.2PI范围内,正如我期望的弧度。
我应该限制x0在弧度(abs(lat))和弧度(180-lat)之间的偏移吗?怎么样? 还是有其他需要解决的问题?
如果我们阻止阻止arccos输入数据超过-1,1的条件,则会出现以下错误: “ RuntimeWarning:在arccos中遇到无效的值 f =(arccos(tan(lat)/ tan(inc)))-((n * pi)+(arccos(sin(lat)/ sin(inc))))* 1 / q“
我不太在乎此代码草案的效率,但我至少需要一些结果才能继续进行测试。 提前致谢。亲切的问候!