Seleção do Solver: NonlinearBlockGS vs NewtonSolver
Tenho dois grupos openmdao com dependência cíclica entre os grupos. Eu calculo as derivadas usando a etapa Complex. Eu tenho um solucionador não linear para a dependência e uso o SLSQP para otimizar minha função objetivo. O problema está na escolha do solucionador não linear. Quando uso NonlinearBlockGSa otimização é bem sucedida em 12 iterações. Mas quando eu uso NewtonSolvercom Directsolverou ScipyKrylova otimização falha (limite de iteração excedido), mesmo com maxiter=2000. As conexões cíclicas convergem, mas é só que as variáveis de projeto não atingem os valores ótimos. A diferença entre as variáveis de projeto em iterações consecutivas é da ordem 1e-5. E isso aumenta as iterações necessárias. Além disso, quando mudo o palpite inicial para um valor mais próximo do valor ideal, ele funciona.
Para verificar mais, converti o modelo em IDF (criando cópias de variáveis de acoplamento e restrições de consistência), eliminando assim a necessidade de um solucionador. Agora a otimização é bem-sucedida em 5 iterações e os resultados são semelhantes aos resultados quando NonlinearBlockGSé usado.
Por que isso acontece? Estou esquecendo de algo? Quando devo usar NewtonSolversobre os outros? Eu sei que é difícil responder sem ver o código. Mas é que meu código é longo com vários componentes e não consegui recriar o problema com um modelo de brinquedo. Portanto, qualquer visão geral é muito apreciada.
Respostas
Sem ver o código, você está certo de que é difícil fornecer detalhes.
De um modo geral, Newton às vezes pode ter muito mais problemas para convergir do que o NLBGS (Nota: isso não é absolutamente verdade, mas é uma boa regra prática). Então, o que eu acho que está acontecendo é que na sua primeira ou segunda iteração, o solucionador de newton não está realmente convergindo. Você pode verificar isso definindo newton.options['iprint']=2e observando o histórico de iteração conforme o otimizador itera.
Quando você tem um solucionador em sua otimização, é fundamental que você também se certifique de defini-lo para gerar um erro de não convergência. Alguns otimizadores podem lidar com esse erro e retrocederão na pesquisa de linha. Outros simplesmente morrerão. De qualquer forma, é importante. Caso contrário, você acaba dando ao otimizador um caso não convergente que ele não sabe que não é convergente.
Isso é ruim por dois motivos. Primeiro, os valores do objetivo e das restrições que ele obtém estarão errados! Em segundo lugar, e talvez mais importante, as derivadas que ele calcula estarão erradas! Você pode ler os detalhes [no manual de teoria], mas, em resumo, os métodos de derivação analítica que o OpenMDAO usa assumem que os resíduos foram para 0. Se não for esse o caso, a matemática falha. Mesmo se você estiver fazendo diferenças finitas de modelos completos, os modelos não convergentes são um problema. Você só receberá lixo barulhento quando tentar FD. 2
Portanto, supondo que você tenha configurado seu modelo corretamente e que os solucionadores lineares configurem problemas (parece que sim, pois funciona com NLBGS), é mais provável que o solucionador de newton não esteja convergindo. Use o iprint, possivelmente combinado com a impressão de depuração do driver , para verificar isso por conta própria. Se for esse o caso, você precisa descobrir como fazer Newton se comportar melhor.
Existem algumas dicas aqui que são bastante gerais. Você também pode tentar usar a busca de linha armijo , que muitas vezes pode estabilizar uma solução de newton ao custo de alguma velocidade.
Finalmente... Newton não é a melhor resposta em todas as situações. Se o NLBGS for mais estável e computacionalmente mais barato, você deve usá-lo. Aplaudo seu desejo de fazê-lo funcionar com Newton. Você definitivamente deve rastrear por que não, mas se Newton simplesmente não conseguir resolver seu problema acoplado de forma confiável, tudo bem também!