#python
#python
Вопрос:
Я пытаюсь использовать scipy.sparse.linalg.cg для решения линейной системы. Я хочу знать, сколько итераций было выполнено для достижения определенного допуска?
Комментарии:
1. Я полагаю, вы уверены, что на этот вопрос есть универсальный ответ, который не требует от вас показывать нам какой-либо код или сообщать какие-либо другие подробности? Если у вас есть какие-либо сомнения, то, возможно, вам следует показать нам немного больше того, что вы делаете.
Ответ №1:
scipy.sparse.linalg.cg принимает необязательный аргумент обратного вызова, который вычисляется на каждой итерации алгоритма сопряженного градиента и принимает текущий вектор в качестве аргумента. Используя ссылку на нелокальную переменную, вы можете извлечь общее количество итераций следующим образом
iters = 0
def nonlocal_iterate(arr):
nonlocal iters
iters =1
x, info = scipy.sparse.linalg.cg(A, b, callback=nonlocal_iterate)
Ответ №2:
Пока что вы не можете получить это значение явно. В документации по сопряженному градиенту Scipy упоминается, что выходные данные функции поставляются с решением и целым числом info
, где вы можете узнать количество итераций только тогда, когда сходимость к допуску не была достигнута:
0
: успешный выход
>0
: сходимость к допуску не достигнута, количество итераций
<0
: незаконный ввод или разбивка
Решением было бы увеличить допуск (или максимальное количество итераций) до тех пор, пока не будет достигнута сходимость и функция вернет 0 для info
переменной.