从 Schittkowski DAE 测试套件中求解 PENDULUM2?

2024-01-19

我只是试图解决 Schittkowski DAE 测试套件中的 DAE 问题之一(http://klaus-schittkowski.de/mc_dae.htm http://klaus-schittkowski.de/mc_dae.htm)但没有成功(Python 3.7)。

m=GEKKO(remote=False)
m.time = np.linspace(0.0,100.0,100)
m1 = m.Param(value=1.0) 
g = m.Param(value=9.81)
s = m.Param(value=1.0)

m.options.IMODE=4
m.options.NODES=3
#m.options.RTOL=1e-3

#Initial values t=0
x = m.Var(value=0.0)
y = m.Var(value=-s)
v = m.Var(value=1.0)
w = m.Var(value=0.0)
l = m.Var(value=(m1*(1.0+s*g)/2.0/s**2))

m.Equation(x.dt() == v) 
m.Equation(y.dt() == w)
m.Equation(m1*v.dt() == -2*x*l)
m.Equation(m1*w.dt() == -m1*g - 2*y*l)
m.Equation(x*v  == -y*w)           

m.solve(disp=False)
plt.plot(m.time,x)
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-7-a059f1ac5393> in <module>
     23 m.Equation(x*v  == -y*w)
     24 
---> 25 m.solve(disp=False)
     26 plt.plot(m.time,x)

C:\WPy64-3771\python-3.7.7.amd64\lib\site-packages\gekko\gekko.py in solve(self, disp, debug, GUI, **kwargs)
   2172             #print APM error message and die
   2173             if (debug >= 1) and ('@error' in response):
-> 2174                 raise Exception(response)
   2175 
   2176             #load results

Exception:  @error: Solution Not Found

我只是尝试增加 m.time 中的点数和 m.options.NODES=3 中的节点数。更改 m.options.RTOL 也没有帮助。

按照有关解决找不到解决方案的问题的建议,我设法找到了一个。这是代码。

m=GEKKO(remote=False)
m.time = np.linspace(0.0,100.0,500)
m1 = m.Param(value=1.0) 
g = m.Param(value=9.81)
s = m.Param(value=1.0)

m.options.IMODE=4
m.options.NODES=7

#Initial values t=0
x = m.Var(value=0.0)
y = m.Var(value=-1.0)
v = m.Var(value=1.0)
w = m.Var(value=0.0)
l = m.Var(value=4.405)

m.Equation(x.dt() == v) 
m.Equation(y.dt() == w)
m.Equation(m1*v.dt() == -2*x*l)
m.Equation(m1*w.dt() == -m1*g - 2*y*l)
m.Equation(x*v  == -y*w)           

# initialize to get a feasible solution
m.options.COLDSTART=2
m.solve(disp=False)

# optimize, preserving the initial conditions (TIME_SHIFT=0)
m.options.TIME_SHIFT=0
m.options.COLDSTART=0
m.solve(disp=False)
plt.plot(m.time,x)

The resulting plot is enter image description here

振荡行为将随着计算时间行为的时间步长或搭配节点的增加而减少。另一方面,在 Julia 中使用以下代码解决了相同的问题

m1 = 1.0 
g = 9.81
s =1.0
u₀ = [0.0,  -s,  1.0,   0.0,      m1*(1.0+s*g)/2.0/s^2]
du₀ = [1.0,0.0,0.0,0.0,-g + 2.0 *s*(m1*(1.0+s*g)/2.0/s^2) ]
tspan = (0.0,100.0)
function f(out,du,u,p,t)
    x,y,v,w,l = u
  out[1] = v - du[1]
  out[2] = w - du[2]
  out[3] = -2*x*l/m1 - du[3]
  out[4] = -g - 2.0*y*l/m1 - du[4]
  out[5] = x*v + y*w  
end
#using DifferentialEquations
using Sundials
differential_vars = [true,true,true,true,false]
prob = DAEProblem(f,du₀,u₀,tspan,differential_vars=differential_vars)
sol = solve(prob,IDA())
n=5251
u1=zeros(n)
u2=zeros(n)
u3=zeros(n)
u4=zeros(n)
u5=zeros(n)
for i=1:n u1[i],u2[i],u3[i],u4[i],u5[i] = sol.u[i] end
plot(sol.t,u1)

将在相当短的时间内给出以下情节。另一方面,振荡行为几乎无法识别。在 gekko 中,我认为需要相当多的时间步长和相当长的计算时间。我没有尝试过。

Gekko 中似乎没有关于如何解决此类问题的一般建议。我希望有人对此发表评论。

此致, 拉多万


Gekko 会报告您请求的时间步长,并且不会填写其他点。您正在观察与振荡系统的固有频率不同的模拟采样频率带来的混叠。要解决此问题,您可以增加采样频率或匹配自然频率,以便始终绘制最小值和最大值。这是一个包含 5000 个数据点的解决方案。和IMODE=7Gekko 随着水平时间的增加呈线性缩放。

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m=GEKKO(remote=False)
m.time = np.linspace(0.0,100.0,5000)
m1 = m.Param(value=1.0) 
g = m.Param(value=9.81)
s = m.Param(value=1.0)

m.options.IMODE=7
m.options.NODES=3

#Initial values t=0
x = m.Var(value=0.0)
y = m.Var(value=-1.0)
v = m.Var(value=1.0)
w = m.Var(value=0.0)
l = m.Var(value=4.405)

m.Equation(x.dt() == v) 
m.Equation(y.dt() == w)
m.Equation(m1*v.dt() == -2*x*l)
m.Equation(m1*w.dt() == -m1*g - 2*y*l)

# Index-3 DAE
#m.Equation(x**2+y**2==1)

# Index-2 DAE
m.Equation(x*v  == -y*w)           

m.solve(disp=False)
plt.plot(m.time,x)
plt.show()

With IMODE=7您也不需要初始化步骤。如果您正在解决参数优化问题,那么您将从初始化步骤中受益。另一种建议是使用索引 3 DAE 形式而不是索引 2 DAE 形式:

# Index-3 DAE
m.Equation(x**2+y**2==1)

# Index-2 DAE
# m.Equation(x*v  == -y*w) 

文章中提供了有关 DAE 索引的更多信息,以及使用 GEKKO 等更高索引 DAE 求解器与仅限于索引 1 或索引 2 Hessenberg 形式的 DAE 求解器的优势动态系统优化的初始化策略 https://www.sciencedirect.com/science/article/abs/pii/S0098135415001179.

本案例研究没有差异,但如果使用索引 0 (ODE) 形式,数值漂移可能会成为问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Schittkowski DAE 测试套件中求解 PENDULUM2? 的相关文章

  • 使用单个文件的 Python 日志记录(函数名、文件名、行号)

    我正在尝试了解应用程序的工作原理 为此 我将调试命令插入作为每个函数主体的第一行 目的是记录函数的名称以及向日志输出发送消息的行号 代码内 最后 由于这个应用程序由许多文件组成 我想创建一个日志文件 以便我可以更好地理解应用程序的控制流 这
  • 安装tensorflow的正确命令

    当尝试在 Anaconda 上安装 Tensorflow 时 我尝试了两种类型的命令 conda install tensorflow gpu工作得很好 然而 当尝试conda install c anaconda tensorflow g
  • 分配列表的多个值

    我很想知道是否有一种 Pythonic 方式将列表中的值分配给元素 为了更清楚 我要求这样的事情 myList 3 5 7 2 a b c d something myList So that a 3 b 5 c 7 d 2 我正在寻找比手
  • 高效地将大型 Pandas 数据帧写入磁盘

    我正在尝试找到使用 Python Pandas 高效地将大型数据帧 250MB 写入磁盘或从磁盘写入的最佳方法 我已经尝试了所有方法Python 数据分析 但表现却非常令人失望 这是一个更大项目的一部分 该项目探索将我们当前的分析 数据管理
  • 如何使用我自己的自定义表单覆盖 django-rest-auth 中的表单?

    我正在使用 django rest auth 并尝试通过覆盖表单的方法之一来修复密码重置视图中的错误 尽管我已经使用不同的 django rest auth 表单成功完成了类似的操作 但我无法让它在这个表单上工作 无论我做什么 都会使用旧的
  • 在 Jupyter Notebook 中设置环境变量的不同方法

    在某些情况下 我在 Windows 10 计算机上使用 Jupyter 笔记本 我想通过设置环境变量 GOOGLE APPLICATION CREDENTIALS 来向 GCP 进行身份验证 我想知道 这两种设置环境变量的方式有什么区别 当
  • 在 PhotoImage 下调整图像大小

    我需要调整图像大小 但我想避免使用 PIL 因为我无法使其在 OS X 下工作 不要问我为什么 无论如何 因为我对 gif pgm ppm 感到满意 所以 PhotoImage 类对我来说没问题 photoImg PhotoImage fi
  • 如何在动态执行的代码字符串中使用inspect.getsource?

    如果我在文件中有这段代码 import inspect def sample p1 print p1 return 1 print inspect getsource sample 当我运行脚本时 它按预期工作 在最后一行 源代码sampl
  • 如何调试 numpy 掩码

    这个问题与this one https stackoverflow com q 73672739 11004423 我有一个正在尝试矢量化的函数 这是原来的函数 def aspect good angle float planet1 goo
  • 如何在 numpy 数组中查找并保存重复的行?

    我有一个数组 例如 Array 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 1 1 1 2 2 2 我想要输出以下内容的东西 Repeated 1 1 1 2 2 2 保留重复行的数量也可以 例如 Repeated 1 1
  • 从字典中绘制直方图

    我创建了一个dictionary计算 a 中出现的次数list每个键的内容 我现在想绘制其内容的直方图 这是我想要绘制的字典的内容 1 27 34 1 3 72 4 62 5 33 6 36 7 20 8 12 9 9 10 6 11 5
  • 如何仅注释堆积条形图的一个类别

    我有一个数据框示例 如下所示 data Date 2021 07 18 2021 07 19 2021 07 20 2021 07 21 2021 07 22 2021 07 23 Invalid NaN 1 1 NaN NaN NaN N
  • Jupyter笔记本突然变得很慢

    我以前在anaconda环境下运行jupyter运行得很好 显示警告后 IOPub data rate exceeded The notebook server will temporarily stop sending output to
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • 更改用作函数全局作用域的字典

    我想做一个 purePython 的装饰器 其中一部分是能够有选择地禁止访问函数的全局范围 有没有一种方法可以以编程方式更改哪个字典事物充当函数的全局 外部作用域 因此 例如在下面我希望能够拦截对f in h并抛出错误 但我想允许访问g因为
  • 使用 Sphinx 时,如何记录没有文档字符串的成员?

    我正在为我发布的包编写文档 我发现您的文档越全面 人们就越容易找到您的包来使用 废话 实际上 我在充满爱心地编写代码的所有功能和细节方面获得了很多乐趣 然而 我对如何为类级变量编写与 Sphinx 兼容的文档感到完全困惑 特别是 我有一些e
  • 旧版本的 spaCy 在尝试安装模型时抛出“KeyError: 'package'”错误

    我在 Ubuntu 14 04 4 LTS x64 上使用 spaCy 1 6 0 和 python3 5 为了安装 spaCy 的英文版本 我尝试运行 这给了我错误消息 ubun ner 3 NeuroNER master src pyt
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构
  • 用 Beautiful Soup 进行抓取:为什么 get_text 方法不返回该元素的文本?

    最近我一直在用 python 开发一个项目 其中涉及抓取一些网站的一些代理 我遇到的问题是 当我尝试抓取某个知名代理站点时 当我要求 Beautiful Soup 查找 IP 在代理表中的位置时 它并没有按照我的预期执行操作 我将尝试查找每

随机推荐

  • Jquery:如何将TD移动到另一个TR?

    我已经生成了 html 我需要使用 Jquery 重构 html 如下所示 原来的 table tr td Col 1 Value td tr tr td Col 2 Value td tr tr td Col 3 Value td tr
  • 从 EmberJS 中的路线观察服务上的属性

    我想我不理解这里的概念 据我所知有任何Ember object可以观察另一个人的属性Ember object 所以 我有一个服务 一个路由器和一个组件 我需要组件和路由器能够观察服务的属性 我完全有可能只是以错误的方式构建解决方案 我将在最
  • 向停靠且具有自动滚动功能的面板添加填充

    我的表单底部有一个面板 该面板设置为 自动滚动 以便在需要时出现滚动条 我有一个动态添加到此面板的图像 一切看起来都很好 除了最后一张图像 因为这里表单的最边缘是一个图像 例如 有谁知道如何在面板的右侧添加填充 是的 我确实尝试设置面板右侧
  • Thymeleaf + Spring(非 Boot)-如何显示来自 messageSource 的消息

    我在使用 Thymeleaf 设置 Spring MVC 不使用 Boot 因为我在发现 Spring Initializr 之前启动了它 以显示来自我的资源包的消息时遇到了问题 该应用程序的主要配置类是 Configuration Ena
  • 在 C++ std::vector 和 C 数组之间进行转换而不进行复制

    我希望能够在 std vector 及其底层 C 数组 int 之间进行转换 而无需显式复制数据 std vector 是否提供对底层 C 数组的访问 我正在寻找这样的东西 vector
  • App Store 必须使用 iOS 15 SDK 或更高版本构建,包含在 Xcode 13 或更高版本中

    错误 ITMS 90725 SDK 版本问题 此应用程序是使用 iOS 14 4 SDK 构建的 提交到 App Store 的所有 iOS 应用程序都必须使用 iOS 15 SDK 或更高版本构建 包含在 Xcode 13 或更高版本中
  • R 中带有加权数据的频率表

    我需要按年龄和婚姻状况计算个人的频率 所以通常我会使用 table age marital status 然而 每个人在数据采样后都有不同的权重 如何将其合并到我的频率表中 您可以使用函数svytable从包装中survey or wtd
  • 访问属性“H”的权限被拒绝

    我编写了下面的代码来使用java脚本捕获网页的整个屏幕截图 我在用着 火狐版本 49 0 1 铬版本 54 0 2840 59 m硒版本 3 0 0 OS Win10 64位Java 1 8 import java io File impo
  • 使用 Tor + Privoxy 抓取谷歌购物结果:如何避免被阻止?

    我已经安装了Tor Privoxy在我的服务器上 它们工作正常 已测试 但现在当我尝试使用urllib2 python 当然 使用代理来抓取谷歌购物结果 我总是被谷歌阻止 有时是503错误 有时是403错误 那么任何人有任何解决方案可以帮助
  • 使用socket.io/node.js在网页上显示流式twitter

    我正在尝试使用 node js socket io 和 twit 构建 Twitter 流式 Web 应用程序 var express require express app express http require http server
  • 用 X"" 测试空字符串[重复]

    这个问题在这里已经有答案了 我知道我可以在 Bash 中测试空字符串 z像这样 if z myvar then do stuff fi 但我看到很多代码都是这样写的 if X X myvar then do stuff fi 这种方法更便携
  • VS2008如何从Web Developer更改为C# Developer设置

    我刚刚重新安装了 vs2008 第一次运行时不小心选择了 Web Developer 而不是 C Developer 现在我习惯的所有键绑定都是错误的 如何将其更改为 C Developer 我尝试了 devenv resetsetting
  • URL Selenium 超出最大重试次数 [重复]

    这个问题在这里已经有答案了 因此 我希望遍历 URL 数组并打开不同的 URL 以使用 Selenium 进行网页抓取 问题是 一旦我点击第二个 browser get url 我就会收到 URL 超出最大重试次数 和 无法建立连接 因为目
  • Symfony2,原则 2:getResult 对象

    posts em gt find Application BlogBundle Entity Post 1 print r posts 为什么我得到了 Barii BlogBundle Entity Post Object id Barii
  • 欧拉计划#29

    嗯 解决了这个问题之后通过天真 的STL集 我正在阅读论坛条目 在那里我找到了这个条目 include
  • Java Swing JToolBar

    我创造了JToolBar Java 摇摆 我在框架上设置了一个背景图像 其中包含JToolBar 我想要我的JToolBar是透明的 以便保持在框架上的图像应该是可见的 我在用setOpaque false 但它对我的工具栏没有任何影响 以
  • 重置子元素的不透明度 - Maple 浏览器(三星电视应用程序)

    我在创建具有子元素的透明元素时遇到问题 使用此代码 子元素从父元素获取不透明度值 我需要将子元素的不透明度重置 设置为任意值 参考浏览器是Maple Browser for a Samsung TV Application video ca
  • 如何在material-ui中将焦点设置在MenuItem上

    我正在尝试以编程方式将焦点设置在 激活 material ui 中菜单组件内的菜单项之一上 我可以通过按 Tab 键手动执行此操作 但我需要以编程方式执行此操作以响应按键事件 menu menu
  • 如何在 Telerik ASP .NET MVC 网格上将布尔值从 true/false 转换为 yes/no

    我希望能够更改 ASP NET MVC 中不可编辑的 Telerik AJAX 网格上不可编辑列的显示值 有问题的列是一个布尔值 因此显示转换将为 Yes true 和 No False 我做了一些实验 发现这有效 不确定它是否会保留在可编
  • 从 Schittkowski DAE 测试套件中求解 PENDULUM2?

    我只是试图解决 Schittkowski DAE 测试套件中的 DAE 问题之一 http klaus schittkowski de mc dae htm http klaus schittkowski de mc dae htm 但没有