在Python中使用反sec函数

在Python中使用反sec函数,python,math,Python,Math,我正在创建一个程序,计算从一定高度范围和设定初始速度发射炮弹的最佳角度。在我需要使用的最后一个等式中,存在一个反sec函数,它会引起一些问题 我已经导入了数学,并试图使用asec(无论什么),但似乎数学无法计算逆sec函数?我也知道sec(x)=1/cos(x),但当我将1/cos(x)代入方程并用代数方法求解x时,它会变成一个非真实的结果:/ 我的守则如下: print("This program calculates the optimum angles to launch a projec

我正在创建一个程序,计算从一定高度范围和设定初始速度发射炮弹的最佳角度。在我需要使用的最后一个等式中,存在一个反sec函数,它会引起一些问题

我已经导入了数学,并试图使用asec(无论什么),但似乎数学无法计算逆sec函数?我也知道sec(x)=1/cos(x),但当我将1/cos(x)代入方程并用代数方法求解x时,它会变成一个非真实的结果:/

我的守则如下:

print("This program calculates the optimum angles to launch a projectile from a given range of heights and a initial speed.")
x = input("Input file name containing list of heights (m): ")
f = open(x, "r")
for line in f:
    heights = line
    print("the heights you have selected are : ", heights)
f.close()

speed = float(input("Input your initial speed (m/s): "))
print("The initial speed you have selected is : ", speed)

ran0 = speed*speed/9.8 
print(ran0)

f = open(x, "r")
for line in f:
    heights = (line)
    import math
    angle = (math.asec(1+(ran0/float(heights))))/2
    print(angle)

f.close()
所以我的主要问题是,有没有办法在不安装和导入其他东西的情况下找到python中任何东西的倒数秒?
我意识到这可能更像是一个基于数学的问题,而不是一个编码问题,不过我非常感谢您的帮助:)。

假设我们正在寻找弧角为θ的实数x。然后我们有:

θ = arcsec(x)
sec(θ) = x
1 / cos(θ) = x
cos(θ) = 1 / x
θ = arccos(1/x)
因此,通过这种推理,您可以将arcsecant函数编写为:

from math import acos

def asec(x):
    return acos(1/x)

若你们能尝试秒的倒数,那个么它将和

>>>from mpmath import *
>>> asec(-1)

 mpf('3.1415926535897931')
这里有一个链接,您可以更好地理解-[/p>“我也知道sec(x)=1/cos(x),但当我小于1/cos(x)…”您必须使用sec还是asec

因为
sec(x)=1/cos(x)
asec(x)=acos(1/x)
。注意符号^-1不明确,
cos^-1(x)=acos(x)
不同于
[cos(x)]^-1

angle = (math.asec(1+(ran0/float(heights))))/2
asec不是从-1到1定义的 如果高度低于零,因此
(ran0/float(heights))
的结果介于-2和0之间,则角度将为非实数


我真的不知道这是否是您要求的,但我希望它能有所帮助。

如果
数学可以导入,那么您可以使用:

import math


def asec(x):
    if x == 0:
        return 1j * math.inf
    else:
        return math.acos(1 / x)
有关重新编写asec(x)
的其他方法,请阅读相关的


或者,您可以使用展开式,它总是以多项式形式出现,因此,尽管这只是给定点附近的近似值,但它不需要
数学

对于
asec(x)
,它在
附近的泰勒展开式∞(也称为)(不使用
math
):


您可以快速检查距离0越远,近似值越适用:

for x in range(-10, 10):
    print(x, asec(x), asec_taylor(x))
-10 1.6709637479564565 1.670963741666667
-9 1.6821373411358604 1.6821373299281108
-8 1.696124157962962 1.6961241346516926
-7 1.714143895700262 1.7141438389326868
-6 1.7382444060145859 1.7382442416666668
-5 1.7721542475852274 1.7721536583333335
-4 1.8234765819369754 1.823473733854167
-3 1.9106332362490186 1.910611139814815
-2 2.0943951023931957 2.0939734083333335
-1 3.141592653589793 2.8124629916666666
0(nan+infj)(nan+infj)
1 0 0.32912965833333346
2 1.0471975511965979 1.0476192416666668
3 1.2309594173407747 1.2309815101851853
4 1.318116071652818 1.3181189161458333
5 1.369438406004566 1.3694389916666667
6 1.4033482475752073 1.4033484083333334
7 1.4274487578895312 1.4274488110673134
8 1.4454684956268313 1.4454685153483076
9 1.4594553124539327 1.4594553200718894

…它仍然导入
数学
@norok2,因为他们在尝试中也使用了
数学
,我猜OP在他们说“导入其他东西”时的意思类似于
scipy
。@ryanpene,如果你仔细观察,你会发现你的最终等式是错误的:它应该是
θ=(asec(1+R/h))/2
。请注意h&R的反转和asec的使用。如果您想用
acos
来编写它,它将是
θ=(acos(1/(1+R/h)))/2
,相当于
θ=(acos(h/(h+R)))/2
@RyanPeen,所以你的错误是在反转
1+R/h
-它的倒数不是
1+h/R
,而是
1/(1+R/h)
h/(h+R)
OP显然需要倒数(即,倒数函数,而不是倒数)秒:角度是输出,而不是输入。如果他需要反函数,他不需要asec(倒数),他只需要1/(秒(x)),所以只需要cos(x)?我可能误解了你的意思,但我认为他需要的是倒数。
asec
不是
sec
的倒数。它是
sec
函数的反函数。@ryanpene对公认答案的评论(我无权评论):
sec(2θ)=1+R/h
1/cos(2θ)=1+R/h
1/(1+R/h)=cos(2θ)
so
θ=acos(1/(1+R/h))/2
@MarkDickinson:你说得对,对不起,我是法国人,在法语中,这两个意思是相反的!来自OP:“不安装和导入其他东西”。我认为使用
mpmath
(这里有一个简单的答案,不涉及任何第三方库)。我认为这些特殊情况有点混淆。根本不需要特殊情况
1
-1
,如果通过这些情况,效果会很好。您可能需要特殊情况
inf
作为输入(映射到
0
)。将
0
映射到
inf
是错误的:
asec(0)
只是未定义,就像
acos(2.0)
未定义一样:
0
不在范围内(甚至是范围的结束)关于
sec
@MarkDickinson,我意识到
1
-1
是不需要的,我只是盲目地看了维基百科上的文章,说这个公式不适用于
1
0
-1
,但我想它需要修正
,实际上是复数无穷大。
acos(2.0)
不是未定义的,只是不在实数域中。在复数情况下(相当确定这不是OP想要的),您希望在复杂平面中从-1到1进行分支切割。其他切割选择是可能的,但这是最明显的选择。然后在
0
处出现奇点,因此很难进行切割
for x in range(-10, 10):
    print(x, asec(x), asec_taylor(x))