Python实现Transit Time公式报错:TypeError问题排查与代码修正
问题分析与代码修正
错误原因
- 库名拼写错误:代码里写了
sci.pi,但你引入的是math库,应该改为math.pi。 - 语法错误:公式中
))))(1-(math.cos(...)的位置,两个右括号后直接跟括号,相当于把前面计算出的浮点数当成函数调用,导致TypeError——这里缺少了除法运算符/,因为凌星时间公式中这部分是分子除以分母。 - 公式逻辑错误:凌星时间的核心公式里,应该是
1 + (raio_planeta/raio_estrela),你写成了1 -,这会导致计算结果不合理(甚至出现根号内负数的情况)。
修正后的代码
import math def tempo_transito(periodo, raio_estrela, semieixo, raio_planeta, inclinacao): # 先转换倾角为弧度 inclinacao_rad = math.radians(inclinacao) cos_inclinacao = math.cos(inclinacao_rad) # 拆分公式各部分,避免括号混乱 term1 = 1 + (raio_planeta / raio_estrela) term1_sq = term1 ** 2 term2 = semieixo / (raio_estrela * cos_inclinacao) term2_sq = term2 ** 2 numerator = term1_sq - term2_sq denominator = 1 - cos_inclinacao ** 2 # 确保根号内非负,避免math.asin报错 if numerator <= 0 or denominator <= 0: raise ValueError("参数组合不符合凌星条件,无法计算凌星时间") sqrt_part = math.sqrt(numerator / denominator) asin_arg = (raio_estrela / semieixo) * sqrt_part # 确保arcsin的参数在[-1,1]范围内 if asin_arg < -1 or asin_arg > 1: raise ValueError("arcsin参数超出范围,无法计算凌星时间") tempo = (periodo / math.pi) * math.asin(asin_arg) return tempo
额外说明
拆分了长表达式,避免因括号嵌套过多导致的语法错误,同时提升代码可读性;添加了参数合法性检查,避免因输入参数不符合凌星条件(比如倾角过大、半长轴过小等)导致math.asin报错。
内容的提问来源于stack exchange,提问作者Matheus
相关产品推荐
相关产品推荐

