【问题标题】:handle trajectory singularity: delete photons causing error处理轨迹奇点:删除导致错误的光子
【发布时间】:2019-11-26 00:48:53
【问题描述】:

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

我尝试过使用 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 中添加一个非常小的值,从而导致错误。否则,您可能会破坏导致错误的光子。
  • @LouisSaglio 是的,我想删除半径
  • @ThomasWeller 我想删除半径 r

标签: python function exception while-loop


【解决方案1】:

我想你提到我们不知道奇点发生了什么。此处提供的任何答案很可能都不准确,但我们假设您知道近 0 附近的行为/动态。我不知道您是如何调用哈密顿函数的,但我可以想象您正在使用以下两种方法之一。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多