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