2014-12-24 2 views
0

Так что я пытаюсь использовать scipy.optimize.root, но у меня заканчивается память, потому что недостаточно памяти для вычисления якобиана.Выполнение scipy.optimize.root исчерпывает память, какие хорошие альтернативы?

Мне было интересно, какую альтернативу я мог бы использовать, учитывая мое ограничение памяти ?, или есть способ обойти его каким-то образом?

Мой размер вход ~ 400000 и выход похож, то есть якобиан 400000^2, который является убийцей ...

Пожалуйста, дайте мне знать, если у вас есть какие-либо предложения, чтобы сделать вопрос яснее.

UPDATE

Я думаю, что я придумал, как эффективно вычислить якобиан в любой заданной точке. Документация scipy.optimize.root состояний следующее:

Если JAC является булевой и это правда, предполагается, что интересно возвращать значение якобиану вместе с целевой функцией. Если False, якобиан будет оцениваться численно. jac также может быть вызываемым, возвращающим якобиан удовольствия. В этом случае он должен принимать те же аргументы, что и забава.

Я угадал с подсвеченной точки, что это значит, если fun(x) мой несильно это дает что-то вроде:

f, jac = fun(x) 

где F = F (х) и JAC = якобиан (х).

правый?

+1

Какой _method_ вы используете и для чего установлен ваш аргумент _jac_? – ErikR

+0

Использование значения по умолчанию для обоих, т.е. – evan54

ответ

0

Попробуйте использовать method='krylov'.

Смотрите также http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html#root-finding-for-large-problems

Если вы знаете якобиан, вы можете написать функцию так, чтобы f, jac = fun(x) и дать возможность jac=True к root. Однако, учитывая, что некоторые из методов не поддерживают разреженных якобиан, это может вам не помочь.

Следующее лучшее, что следует использовать, использовать разреженный якобиан в качестве предобуславливателя для метода Крылова.

Смежные вопросы