Решатель Ньютона терпит неудачу, когда неявный компонент связан с явным компонентом - PullRequest
0 голосов
/ 21 марта 2020

Я решаю неявную систему уравнений для вектора температур 'T' (назовите его компонентом Temp):

residuals['T'] = GL.dot(T)-GR*(T**4)+QS+QI

, где "GL, GR, QS, QI" - входные данные. Матрица «GL» зависит от некоторых интересующих нас переменных дизайна (назовем их «var»). Поэтому я должен сделать явный компонент (назовите его «GLmtxComp»), который собирает квадратную матрицу «GL», выполняя некоторые простые вычисления:

def compute(self, inputs, outputs):
    GL = self.options['GL_init']
    SF = self.options['SF']
    nodes = self.options['nodes'] 
    for var in inputs:
        idx = nodes[var]
        GL[idx] = SF[var]*inputs[var] # updates GL values based on input var

Здесь изменяются только некоторые элементы «GL» (те, которые определены в словаре {node}), другие элементы не изменяются и принимают начальные значения из опции "GL_init".

Когда я запускаю неявный компонент один с необработанными начальными входными значениями, он решает. Но как только я подключаю его к моему новому явному компоненту "GLmtxComp", который предоставляет матрицу "GL" в качестве входных данных, линейный решатель завершается с сообщением:

повышение RuntimeError (format_singular_csc_error (system, matrix) )

RuntimeError: идентичные строки или столбцы, найденные в якобиане в 'temp'. Проблема недоопределена.

Я использую нелинейный ньютон и линейный прямой решатель, чтобы объединить неявный компонент 'temp'. Если я переключаюсь на другие решатели, я не получаю сообщение об ошибке, но решение все равно не сходится. Интересно, что ошибка исчезнет, ​​если я задам нелинейный решатель Ньютона для решения для подсистем, но затем он не сходится (он довольно сильно расходится после десятков итераций). Так связано ли это с явным компонентом "GLmtxComp" или как-то связано с неявными остаточными частями? Я пытался использовать как конечную разность, так и точные производные для "GLmtxComp", но проблема остается. Как мне отладить эту проблему? N2 диаграмма группы

1 Ответ

0 голосов
/ 21 марта 2020

Так что в конечном итоге это была ошибка в моем коде, которая испортила явный компонент. Спасибо @JustinGray за комментарий. Я неправильно ссылался на массив ссылок в строке:

GL = self.options['GL_init'])

, не понимая, что я на самом деле путаю свои начальные значения "GL_init" с каждой итерацией нового вычисления GL. Изменяя это следующим образом:

GL = numpy.copy(self.options['GL_init'])

создает копию "GL_init", не изменяя ее в последовательных итерациях GL. Так что теперь все работает с солвером Ньютона, установленным на "solve_subsystems = True".

...