python - 一种在动态系统识别中处理溢出的方法
问题描述
我正在尝试在我正在处理的系统识别问题中使用 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 结构?
解决方案
我实现了一个解决方案,它检查向量值是否似乎增加了一个合理的值,并在优化函数中返回一个大数字。
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
提高优化的总体速度更好的数量要少。
推荐阅读
- python - 使用类创建的数据无法通过烧瓶应用程序显示到 html 中
- php - Laravel 中的 XSRF 令牌验证失败
- java - JPA 存储库保存方法在 MySQL 中插入 NULL 值,而不是 json 请求提供的值
- java - Hibernate 不在二级 Hazelcast 缓存中存储实体
- r - 如何使用 R 提取数据?
- php - webrtc 在基于 php 的页面中带有 node.js
- r - 在 R Shiny 中完成 100% 后,是否可以关闭或删除 shinyWidgets 的进程栏?
- python - 安装 opencv 失败 - 粘贴 CMakeError.log 的内容
- node.js - 通过 puppeteer 设置浏览器配置文件设置
- ios - 为什么 'textViewDidChangeSelection' 方法在 Swift 中陷入无限循环?