2016-03-17 15 views
1

Я использую IPOPT в MATLAB, чтобы запустить оптимизацию и я бегу на некоторые вопросы, где он говорит:Очень маленькие численные проблемы с мешковины симметрией и разреженной команды

Hessian must be an n x n sparse, symmetric and lower triangular matrix 
with row indices in increasing order, where n is the number of variables. 

После глядя на мою матрицу Гессе, я нашел что несимметричные элементы его жалующиеся очень близки, вот пример:

H(k,j) = 2.956404205984938 

H(j,k) = 2.956404205984939 

Очевидно, что эти элементы достаточно близки, и есть некоторые численные вопросы округления или что-то подобные. Кроме того, когда я вызываю MATLABs асимметричную функцию с H в качестве входа, я получаю false. Есть ли способ забыть об этих очень небольших различиях в симметрии?

Чуть подробнее:

Я использую оптимизированный matlabFunction на самом деле вычислить всю Мешковины (H), то я сделал некоторые постобработки, прежде чем передать его IPOPT:

H = tril(H); 
H = sparse(H); 

tril генерирует нижнюю треугольную матрицу, поэтому эти разности цифр не должны вступать в игру. Таким образом, проблема может заключаться в том, что она жалуется, что разреженная команда возвращает более высокие индексы столбцов и не увеличивает индексы строк. Есть ли способ изменить это, чтобы он возвращал разреженную матрицу в возрастающие индексы строк?

ответ

2

Если H очень близко к симметричному, но не совсем, и вам нужно заставить его быть точно симметричным, стандартный способ сделать это - сказать H = (H+H')./2.