首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python上处理错误时遇到问题

在Python上处理错误时遇到问题
EN

Stack Overflow用户
提问于 2019-11-01 07:57:55
回答 1查看 97关注 0票数 0

嗯,经过相当多的研究,我发现我不知道我的代码出了什么问题。这是我正在编写的牛顿方法优化代码,我想在另一个程序的for循环上的几个函数上测试它,以及其他几种优化方法,但在某个函数上有一个问题,它不能让代码继续测试所有东西。

问题是,牛顿方法需要一个矩阵不是奇异的,才能解一个系统,在这个有问题的函数上,这个矩阵在某一点上是奇异的,我得到了一个错误信息,告诉我这一点,并停止了整个过程。到目前为止,我对try和除了错误处理一无所知,所以经过一些研究,我找出了它,并在我的代码中实现了它,试图避免这个错误,但是,它仍然会因为这个错误而停止整个程序,有人会帮我看一下吗?

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

代码语言:javascript
运行
复制
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块,这是怎么回事?

我尝试过一个小问题,比如

代码语言:javascript
运行
复制
i = 0
while i < 10:
    if 2 < 3:
        try:
            -np.linalg.solve(A,b)
        except:
            print(9)
            break
    i = i+1

A是一个奇数矩阵,打印一个"9“就行得很好,那么为什么在主程序中根本不会发生这种情况呢?也许这与我在另一个程序或类似程序上调用此函数的事实有关?

我可以尝试通过if语句预先测试矩阵是否奇异来解决这个问题,如果是这样的话就中断循环,但我觉得这对于迭代来说是相当昂贵的,所以我想避免它,以便以后更好地比较方法,所以我想尽可能避免这种情况。

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

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2019-11-01 08:42:03

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

代码语言:javascript
运行
复制
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)]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58652570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档