我正在编码黑洞(实际上是光子绕黑洞运行),并且我需要处理半径值小于限制距离的异常

我尝试使用if和while True

def Hamiltonian(r, pt, pr, pphi):
    H = (-((1-rs/r)**-1)*(pt**2)/2 + (1-rs/r)*(pr**2)/2 + (pphi**2)/(2*         (r**2)))
    if np.amax(H) < 10e-08:
        print("Your results are correct")
    else:
        print("Your results are wrong")
    return(H)

def singularity(H, r):
    if (r).any < 1.5*rs:
        print(H)
    else:
        print("0")
        return(H, r)

print(Hamiltonian(r00, pt00, pr00, pphi00))


我想处理r
"RuntimeWarning: divide by zero encountered in true_divide
  H = (-((1-rs/r)**-1)*(pt**2)/2 + (1-rs/r)*(pr**2)/2 + (pphi**2)/(2*(r**2)))"


并且我的轨道是完全错误的(例如,我的光子应该在黑洞中右移,但是由于r
我想删除引起问题的光子,但是我不知道如何,有人可以帮我吗?

最佳答案

我想你提到我们不完全知道发生了什么。这里提供的任何答案很可能都不是准确的,但让我们假设您知道附近0附近的行为/动力学。我不知道您如何调用汉密尔顿函数,但是我可以想象您正在用以下两种方法之一进行操作。


您有一个预定义的循环,该循环遍历传递到函数中的每个值,并输出该预定义循环中每个值的结果H。
您正在传递相同长度的向量,并在H函数中逐元素进行数学运算。


在第一种情况下,您可以进行预检查并为接近0的行为编写一个新函数,如果您处于接近零的邻域中,则可以调用该新函数。您也可以只检查hamiltonian函数本身,如果您在附近的0附近,则调用新函数。我更喜欢后一种方法,因为它可以使前端(我拥有的最好的词)保持整洁,并将逻辑/数学封装在汉密尔顿函数中。在您的评论中,您说要删除某个半径内的光子,使用此方法非常容易,只需中断在该时间步长处的for循环并绘制该时间步长之前的内容,即可终止该循环。

在第二种情况下,您将必须通过检查整个矢量是否落在奇点附近来手动构建新矢量。在我看来,这会有点困难,并且取决于输入的形状,并且逐元素进行数学运算更难调试。

关于python - 处理轨迹奇异性:删除引起错误的光子,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57071554/

10-12 07:17