Я решаю неявную систему уравнений для вектора температур '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 диаграмма группы