首页 > 解决方案 > 一种在动态系统识别中处理溢出的方法

问题描述

我正在尝试在我正在处理的系统识别问题中使用 scipy.optimize 库。目标是找到一个w可以尽可能准确地模拟单个变量动态系统的权重向量。我定义了我试图最小化的函数,在这种情况下,它重新调整了识别的模拟和真实系统的错误,示意性地:

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 结构?

标签: pythonpython-3.xtry-catch

解决方案


我实现了一个解决方案,它检查向量值是否似乎增加了一个合理的值,并在优化函数中返回一个大数字。

        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提高优化的总体速度更好的数量要少。


推荐阅读