【问题标题】:Having a problem with handling errors on Python在 Python 上处理错误时遇到问题
【发布时间】:2020-02-27 08:35:15
【问题描述】:

好吧,经过一番研究,我发现我不知道我的代码有什么问题。这是我正在研究的牛顿法优化代码,我想在另一个程序的 for 循环中的几个函数上测试它,以及其他几种优化方法,但是某个函数出现了问题不要让代码继续测试一切。

问题是牛顿法要求矩阵不是奇异的才能解决系统问题,并且在这个有问题的函数上,该矩阵最终会在某些时候成为奇异矩阵,我收到一条错误消息告诉我并且停止整个过程。到目前为止,我对 try 和除了错误处理一无所知,所以经过一些研究,我弄清楚了它并在我的代码上实现它以尝试避免这个错误,但是,它仍然会因为错误而停止整个程序,会有人帮我看看吗?

这是问题部分的代码:

while np.dot(grad(x),grad(x)) > 10**(-4):
        if f(x+a*p) <= f(x)+c1*a*np.dot(grad(x),p):
            x = x+a*p
            try:
                p = -np.linalg.solve(hess(x),grad(x))
            except:
                break
            k = k+1
        else:
            a = 0.9*a
        if k >= 100:
            break
return [x, f(x),grad(x)]

hess(x) 在某个时候结束为奇异矩阵并给我一个异常错误,但代码不会尝试不执行 try 块并在这种情况下执行 except 块,因为我认为它应该,什么正在进行吗?

我尝试过一个较小的问题,例如

i = 0
while i < 10:
    if 2 < 3:
        try:
            -np.linalg.solve(A,b)
        except:
            print(9)
            break
    i = i+1

A 是一个奇异矩阵,它工作得很好,只需打印一个“9”,那么为什么在主程序上这根本不会发生呢?也许这与我在另一个程序上调用此函数或类似的事实有关?

我可以尝试通过 if 语句预先测试矩阵是否为单数并在是单数时中断循环来解决这个问题,但我觉得这对于迭代来说成本很高,所以我想避免它为了以后更好地比较这些方法,所以我想尽可能地避免这种情况。

这是我执行代码时得到的结果:

Traceback (most recent call last):

  File "<ipython-input-1-31bd7312c08f>", line 1, in <module>
    runfile('C:/Users/CLIENTE/Desktop/Coisas/Estudos 2.0/Ñ Linear/Testes.py', wdir='C:/Users/CLIENTE/Desktop/Coisas/Estudos 2.0/Ñ Linear')

  File "C:\Users\CLIENTE\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 704, in runfile
    execfile(filename, namespace)

  File "C:\Users\CLIENTE\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/CLIENTE/Desktop/Coisas/Estudos 2.0/Ñ Linear/Testes.py", line 52, in <module>
    effer = método(dado)

  File "C:\Users\CLIENTE\Desktop\Coisas\Estudos 2.0\Ñ Linear\Método_de_Newton.py", line 27, in MétodoDeNewton
    p = -np.linalg.solve(hess(x),grad(x))

  File "C:\Users\CLIENTE\Anaconda3\lib\site-packages\numpy\linalg\linalg.py", line 394, in solve
    r = gufunc(a, b, signature=signature, extobj=extobj)

  File "C:\Users\CLIENTE\Anaconda3\lib\site-packages\numpy\linalg\linalg.py", line 89, in _raise_linalgerror_singular
    raise LinAlgError("Singular matrix")

LinAlgError: Singular matrix

【问题讨论】:

  • return 语句是否应该在循环内?它需要与循环体的其余部分具有相同的缩进。
  • 您确定该行发生了异常吗?显示回溯。
  • 刚刚修复了退货!我只是在格式化时犯了一个错误。
  • 什么是回溯?是的,我真的很确定那是一行,它是出现在错误事物上的那一行。
  • 当你得到一个未被捕获的异常时,它会打印一个堆栈跟踪来显示错误发生的位置。将其粘贴到问题中。

标签: python python-3.x numpy error-handling


【解决方案1】:

您是否尝试过捕获异常的完全限定名称?

while np.dot(grad(x),grad(x)) > 10**(-4):
        if f(x+a*p) <= f(x)+c1*a*np.dot(grad(x),p):
            x = x+a*p
            try:
                p = -np.linalg.solve(hess(x),grad(x))
            # HEY! Look here.
            except np.linalg.LinAlgError:
                break
            k = k+1
        else:
            a = 0.9*a
        if k >= 100:
            break
return [x, f(x),grad(x)]

【讨论】:

  • 我尝试了类似的方法,而我仍在尝试了解有关 try-except 的更多信息,但它不起作用,我刚刚在你的设备上进行了测试,是的,同样的事情。
  • 尝试将整个while循环包装在try-except中,看看问题是否出在其他地方。
  • 哦,我根本没想过要这么做。
  • 但我只是试了一下,无论是在牛顿方法文件中的整个 while 函数中,还是在测试每个方法的 while 函数中,但都不好,一遍又一遍地出现相同的错误。
  • 还在测试每个方法的循环之外尝试了它,而且它确实有效,在我完成所有打印后它遇到该错误时停止了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 2020-07-19
  • 2021-12-02
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多