python - 处理轨迹奇点: delete photons causing error

标签 python function exception while-loop

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

我尝试过使用 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 < 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 附近的行为/动态。我不知道你如何调用哈密顿函数,但我可以想象你正在使用两种方法之一。

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

  2. 您传入相同长度的向量,并在 H 函数中逐个元素进行数学运算。

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

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

关于python - 处理轨迹奇点: delete photons causing error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57071554/

相关文章:

python - 使用 python pyodbc 和 pandas 数据框将数据从 SQL Server 导出到 Excel

Python 线程。如何锁定线程?

javascript - 语法错误: missing ( before formal parameters

javascript - 通过函数参数传递 id

c# - 我应该捕获所有可能的特定异常还是只是一般异常并将其包装在自定义异常中?

java - 我的程序中的 InputMismatchException 处理? - JAVA

python - 批处理 numpy 数组索引

c++ - 返回对变量 : Meaningful/useful? 的引用

java - 我应该声明一个未经检查的异常吗?

python - 管理站点中的 Django DateTimeField 编辑