处理Python上的错误时遇到问题

时间:2019-10-31 23:57:55

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

嗯,经过大量研究,我发现我不知道我的代码有什么问题。这是我正在处理的牛顿方法优化代码,我想在另一个程序的for循环上的几个函数上测试它,以及其他几个优化方法,但是某些函数存在问题,而该问题将无法解决。不要让代码继续测试所有东西。

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

这是有问题的部分的代码:

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

带有一个奇异矩阵,只需打印一个“ 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

1 个答案:

答案 0 :(得分:0)

您是否尝试过捕获Exception的全限定名称?

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)]