Я занимаюсь отладкой проблемы в OpenMDAO. В качестве оптимизатора я использую SNOPT. С помощью SNOPT вы можете выполнить проверку деривативов по вашей проблеме с помощью опции «Проверить уровень = 2». Насколько я понимаю, это проверит частные производные вашей проблемы с конечной разницей. Результаты будут распечатаны в SNOPT_print.out.
В этой распечатке заголовки
"Столбец" "x(j)" "dx(j)" "Номер элемента." «Строка» «Производная» «Приблизительная разница»
появляться.
Теперь SNOPT считает, что с одним из моих производных что-то не так. Текст «плохо?»
появляется рядом со столбцом «Приблизительная разница». Извините, я не копирую напрямую вывод, но в данный момент у меня нет к нему доступа.
Я хотел бы знать карту номеров столбцов и строк в моей проблеме OpenMDAO, чтобы увидеться, смогу ли я выяснить, в чем дело. Это определенно похоже на смену знака, поскольку производная, предоставленная SNOPT, и аппроксимация конечной разницы равна, но с коэффициентом -1.
Я использовал check_partials() для всех своих компонентов, но не могу найти ошибку, все вроде нормально.
Я надеюсь, что смогу провести дополнительную проверку и выяснить, на что именно жалуется SNOPT. Есть ли способ опросить OpenMDAO или pyoptsparse, чтобы это выяснить?
Я бы предложил использовать check_totals. Это, по крайней мере, подскажет вам, какая комбинация проектной переменной/ответа вызывает проблему, и вы сможете сузить ее оттуда.
также оказывается, что итоговые значения неверны только в одной точке, где переменная является входными данными для MetaModelStructuredComp в группе, содержащей циклы и решатель NLBGS. Какое-то странное взаимодействие, связанное с этим.
Отвечая на мой собственный вопрос о выводе проверки производных SNOPT: номер столбца соответствует проектной переменной, как и следовало ожидать от якобиана, а номер соответствует индексу распечатки pyoptsparse.
Цели Имя индекса Значение 0 traj.phase0.states:x -2.500000E-01
Переменные (c – непрерывные, i – целые, d – дискретные)
Имя индекса Тип Значение нижней границы Состояние верхней границы
0 traj.phase0.states:v_0 c -1.000000E+21 1.183503E-02 1.000000E+21
1 traj.phase0.states:v_1 c -1.000000E+21 2.816497E-02 1.000000E+21
2 traj.phase0.states:v_2 c -1.000000E+21 3.333333E-02 1.000000E+21
3 traj.phase0.states:v_3 c -1.000000E+21 3.333333E-02 1.000000E+21
4 traj.phase0.states:v_4 c -1.000000E+21 4.516837E-02 1.000000E+21
Номер строки соответствует распечатке ограничений pyoptsparse, хотя номер строки SNOPT отличается на единицу от распечатки pyoptsparse, поскольку я предполагаю, что первая строка якобиана SNOPT является целью
Ограничения (i — неравенство, e — равенство) Название индекса Тип Нижнее значение Верхнее состояние Множитель Лагранжа (Н/Д) 0 traj.phase0.collocation_constraint.defects:v e 0.000000E+00 -7.401487E-18 0.000000E+00 9.00000E+100 1 traj.phase0.collocation_constraint.defects:ve 0.000000E+00 -1.850372E-18 0.000000E+00 9.00000E+100
Спасибо, Брет, я смог это воспроизвести. Оказывается, номер столбца SNOPT совпадает с номером проектной переменной распечатки pyoptsparse,