Я пытаюсь использовать библиотеку 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 в подобных случаях, если я точно знаю, что пытаюсь сделать?