Как я могу подсчитать количество итераций, выполненных для разреженного линейного решателя в SciPy

#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 переменной.