使用numpy解算器查找超越方程的解

时间:2018-12-05 14:46:51

标签: python numpy solver solution

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“

我不太在乎此代码草案的效率,但我至少需要一些结果才能继续进行测试。 提前致谢。亲切的问候!

0 个答案:

没有答案