Возникли проблемы с обработкой ошибок на Python - PullRequest
0 голосов
/ 01 ноября 2019

Что ж, после некоторых исследований я понял, что понятия не имею, что не так с моим кодом. Это код оптимизации метода Ньютона, над которым я работаю, и я хочу проверить его на нескольких функциях цикла 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 и блок исключений в этой ситуации, как я думаю, что должно происходить?

Я пытался решить небольшую проблему, такую ​​как

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 голосов
/ 01 ноября 2019

Вы пытались поймать полное имя исключения?

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

...