Python 处理轨迹奇异性:删除导致错误的光子

Python 处理轨迹奇异性:删除导致错误的光子,python,function,exception,while-loop,Python,Function,Exception,While Loop,我正在编码一个黑洞(实际上是光子围绕黑洞运行),我需要处理一个半径值小于极限距离的异常 我试过使用if和while True def哈密顿量(r,pt,pr,pphi): H=(((1-rs/r)**-1)*(pt**2)/2+(1-rs/r)*(pr**2)/2+(pphi**2)/(2*(r**2))) 如果np.amax(H)

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

我试过使用if和while True

def哈密顿量(r,pt,pr,pphi):
H=(((1-rs/r)**-1)*(pt**2)/2+(1-rs/r)*(pr**2)/2+(pphi**2)/(2*(r**2)))
如果np.amax(H)<10e-08:
打印(“您的结果是正确的”)
其他:
打印(“您的结果错误”)
返回(H)
def奇点(H,r):
如果(r).任何<1.5*rs:
打印(H)
其他:
打印(“0”)
返回(H,r)
打印(哈密顿量(r00、pt00、pr00、pphi00))
我想处理r<1.5*rs的情况,这样我就不会再有除法错误信息和奇怪的轨道了。到目前为止,我的代码没有改变任何问题,我仍然收到以下错误消息:

"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<1.5*rs处有一个奇点,它们进入然后离开,依此类推)


我想删除导致问题的光子,但我不知道如何删除,有人能帮我吗?

我想你提到过,我们不知道奇点到底发生了什么。这里提供的任何答案很可能都不准确,但让我们假设您知道接近0的邻居的行为/动态。我不知道你是如何调用哈密顿函数的,但我可以想象你是用两种方法之一来实现的

  • 您有一个预定义的循环,该循环遍历传递到函数中的每个值,并输出预定义循环中每个值的结果H

  • 您正在传递相同长度的向量,并在H函数中逐元素进行数学运算

  • 在第一种情况下,您可以进行预检查并为接近0的行为编写一个新函数,如果您位于接近零的邻域中,则可以调用该新函数。你也可以检查哈密顿函数本身,如果你在接近0的邻域中,调用新函数。后一种方法是我更喜欢的,因为它保持前端(我对它最好的描述)相当干净,并将逻辑/数学封装在哈密顿函数中。在你的评论中,你说你想删除某个半径范围内的光子,这将非常容易用这种方法完成,只需终止for循环,在那个时间步中断并绘制到那个时间步之前的内容


    在第二种情况下,如果向量属于奇点邻域,则必须通过检查向量来手动构建新向量。这将有点困难,取决于输入的形状,在我看来,逐元素进行数学运算更难调试。

    我想你提到过,我们不知道奇点到底发生了什么。这里提供的任何答案很可能都不准确,但让我们假设您知道接近0的邻居的行为/动态。我不知道你是如何调用哈密顿函数的,但我可以想象你是用两种方法之一来实现的

  • 您有一个预定义的循环,该循环遍历传递到函数中的每个值,并输出预定义循环中每个值的结果H

  • 您正在传递相同长度的向量,并在H函数中逐元素进行数学运算

  • 在第一种情况下,您可以进行预检查并为接近0的行为编写一个新函数,如果您位于接近零的邻域中,则可以调用该新函数。你也可以检查哈密顿函数本身,如果你在接近0的邻域中,调用新函数。后一种方法是我更喜欢的,因为它保持前端(我对它最好的描述)相当干净,并将逻辑/数学封装在哈密顿函数中。在你的评论中,你说你想删除某个半径范围内的光子,这将非常容易用这种方法完成,只需终止for循环,在那个时间步中断并绘制到那个时间步之前的内容


    在第二种情况下,如果向量属于奇点邻域,则必须通过检查向量来手动构建新向量。这将有点困难,取决于输入的形状,在我看来,逐元素进行数学运算更难调试。

    您的问题中没有问号。你的问题是什么?问题是没有方程会在奇点中起作用,因为你可能知道,我们的模型无法预测奇点中会发生什么。所以你需要一个变通的方法。我建议在0中添加一个非常小的值以导致错误。否则你可能会破坏导致错误的光子。@LouisSaglio是的,确切地说,我想删除半径小于1.5*rs的光子,但我怎么做?@ThomasWeller我想删除半径小于1.5*rs(定义了rs)的光子,但我不知道如何删除,你知道吗?你的问题中没有问号。你的问题是什么?问题是没有方程会在奇点中起作用,因为你可能知道,我们的模型无法预测奇点中会发生什么。所以你需要一个变通的方法。我建议在0中添加一个非常小的值以导致错误。否则你可能会破坏导致错误的光子。@LouisSaglio是的,确切地说,我想删除半径小于1.5*rs的光子,但我怎么做?@ThomasWeller我想删除半径小于1.5*rs(定义了rs)的光子,但我不知道怎么做,你知道吗?