Способ обработки переполнения в идентификации системы Dynami c - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь использовать библиотеку scipy.optimize в проблеме идентификации системы, над которой я работаю. Цель состоит в том, чтобы найти вектор весов w, который может максимально точно моделировать динамическую систему c с одной переменной. Я определил функцию, которую пытаюсь минимизировать, которая в данном случае схематически воспроизводит ошибку идентифицированного моделирования и реальной системы:

fQ(w): 
  simulatedOutput = simulate_system(); 
  e = realOutput-simulatedOutput
  return dot(e,e)

Поскольку я пытаюсь динамически моделировать определенный период времени , существуют определенные конфигурации вектора w, при которых система не устойчива и расходится. Важнейшая часть кода функции fQ(w):

for i in range(0, nx):
                    for j in range(i, nx):
                        for l in range(j, nx):
                            colx[k, idx] = x[k, i] * x[k, j] * x[k, l]
                            idx += 1

Есть ли способ справиться с этим потенциальным переполнением? То, что я пытался сделать, было

        idx = 0
        try :
            for i in range(0, nx):
                for j in range(i, nx):
                    for l in range(j, nx):
                        colx[k, idx] = x[k, i] * x[k, j] * x[k, l]
                        idx += 1
        except :
            print('ColX overflow, returning a large Q')
            return 10e40

, что с технической точки зрения кажется правильным, поскольку реальная система не расходится, и этот вектор w, таким образом, является неправильным решением проблемы оптимизации.

Мои проблемы с этим решением следующие:

i) Использование структуры try / catch в любом месте, кроме обработки ошибок, является, насколько мне известно, очень плохой практикой программирования

ii) Это не так. Кажется, работает правильно

Мои вопросы:

Есть ли правильный способ реализовать эту функциональность? Допустимо ли использование структуры try / catch в подобных случаях, если я точно знаю, что пытаюсь сделать?

1 Ответ

0 голосов
/ 08 мая 2020

Я реализовал решение, которое проверяет, кажется ли, что значения векторов превышают разумное значение, и возвращает большое число в функции оптимизации.

        idx = 0
        for i in range(0, nx):
           for j in range(i, nx):
                colx[k, idx] = x[k, i] * x[k, j]
                if colx[k, idx] > 10e10:
                    print('ColX seems to diverge, returning a large Q')
                    return 10e10
                idx += 1

Кажется, это работает хорошо. Возможно, для увеличения общей скорости оптимизации подойдет меньшее число, чем 10e10.

...