使用Integrate.odeint()的ValueError和odepack.error

2024-03-31

我正在尝试编写一个方程来建模,然后绘制一个积分控制系统(特别是关于巡航控制)。但是,每当我运行它时,我都会收到两个错误:

ValueError:对象对于所需数组来说太深 odepack.error:函数调用的结果不是正确的浮点数组。

我读过这些问题:

  • scipy curve_fit 错误:函数调用的结果不是正确的浮点数组 https://stackoverflow.com/questions/18184541/scipy-curve-fit-error-result-from-function-call-is-not-a-proper-array-of-floats
  • 如何使用 scipy odeint 求解这个微分方程? https://stackoverflow.com/questions/20019427/how-to-solve-this-differential-equation-using-scipy-odeint
  • 对象对于所需数组来说太深 - scipy.integrate.odeint https://stackoverflow.com/questions/15709933/object-too-deep-for-desired-array-scipy-integrate-odeint

这看起来应该很有帮助,但是我不确定如何将它们应用到我的问题上。我对 python 还很陌生,所以如果我错过了一些明显的事情或者做了一些特别愚蠢的事情,请耐心等待。我对绘制它没有任何问题,所以一旦我弄清楚如何真正让它工作,我想我已经准备好了。

import numpy as np
import scipy.integrate as integrate

##Parameters

kp=.5 #proportional gain
ki=.1 #integral gain
vr=30 #desired velocity in m/s
Tm=190 #Max Torque in Nm
wm=420 #engine speed
B=0.4 #Beta
an=12 #at gear 4
p=1.3 #air density
Cd=0.32 #Drag coefficient
Cr=.01 #Coefficient of rolling friction
A=2.4 #frontal area

##Variables

m=18000 #weight
v=20 #starting velocity
time=np.linspace(0,10,50) #time
theta=np.radians(4) #Theta

def vderivs(state,t):
    v = state
    vel=[]
    ti=0

    while ti < t:
        v1 = an*controller(ti,vr,v)*torque(v)
        v2 = m*Cr*np.sign(v)
        v3 = 0.5*p*Cd*A*v**2
        v4 = m*np.sin(theta)

        if t < 10:
            vtot = v1+v2+v3
            vfin = np.divide(vtot,m)
        else:
            vtot = v1+v2+v3+v4
            vfin = np.divide(vtot,m)

        vel.append(vfin)
        ti+=1

    trueVel = np.array(vel, float)
    return trueVel

def uderivs(state,t):
    v = state
    deltax = vr - v
    return deltax    

def controller(time,desired,currentV):
    z = integrate.odeint(uderivs, currentV, time)
    u = kp*(vr-currentV)+ki*z
    return u.flatten()

def torque(v):    
    return Tm*(1-B*(np.divide(an*v,wm)-1)**2)   

def velocity(mass,desired,theta,t):
    v = integrate.odeint(vderivs, desired, t)
    return v.flatten()

test = velocity(m,vr,theta,time)
print(test)

如果您还需要我提供任何其他信息,请告诉我!


将其作为单独发布,因为我让您的代码正常工作。好吧,运行并产生输出:P

实际上,一个大问题是一些我没有注意到的隐形广播,但我一路上改变了很多其他事情。

首先,隐形广播是,如果将一维函数与一个参数集成,odeint返回一个列向量,然后当你对行向量的结果进行处理时,你会得到一个二维数组(矩阵)。例如:

In [704]: a
Out[704]: array([0, 1, 2, 3, 4])

In [705]: b
Out[705]: 
array([[0],
       [1],
       [2]])

In [706]: a+b
Out[706]: 
array([[0, 1, 2, 3, 4],
       [1, 2, 3, 4, 5],
       [2, 3, 4, 5, 6]])

您得到的速度输出是一个列向量,例如b并将其与其他时间函数相加,得到一个矩阵。


关于递归,我想我解决了这个问题。两个导函数应采用单个标量t此时他们计算导数。要做到这一点,vderivs需要进行积分,它应该一直进行积分直到t。所以我将它们重新定义为:

dt = .1   # another global constant parameter

def vderivs(v, t):
    ts = np.arange(0, t, dt)
    v1 = an * controller(v, ts) * torque(v)
    v2 = m*Cr*np.sign(v)
    v3 = 0.5*p*Cd*A*v**2 
    v4 = m*np.sin(theta)
    vtot = v1+v2+v3+v4*(ts>=10) # a vector of times includes incline only after ts = 10
    return vtot/m

而且当然uderivs照原样就可以了,但可以写得更简单:

def uderivs(v, t):
    return vr - v

然后,确保velocity and controller传递正确的值(使用v0代替v为起始速度):

def controller(currentV, time):
    z = integrate.odeint(uderivs, currentV, time)
    return kp*(vr-currentV) + ki*z.squeeze()

def velocity(desired, theta, time):
    return integrate.odeint(vderivs, desired, time)

谁知道物理是否正确,但这给出:

请注意,它尚未达到所需的速度,因此我增加了解决该问题的时间

time = np.linspace(0,50,50) #time

这是我运行的所有代码:

import matplotlib.pylab as plt
import numpy as np
import scipy.integrate as integrate

##Parameters
kp = .5 #proportional gain
ki = .1 #integral gain
vr = 30 #desired velocity in m/s
Tm = 190 #Max Torque in Nm
wm = 420 #engine speed
B = 0.4 #Beta
an = 12 #at gear 4
p = 1.3 #air density
Cd = 0.32 #Drag coefficient
Cr = .01 #Coefficient of rolling friction
A = 2.4 #frontal area

##Variables
m = 18000.0 #weight
v0 = 20. #starting velocity
t = np.linspace(0, 20, 50) #time
dt = .1
theta = np.radians(4) #Theta

def torque(v):    
    return Tm * (1 - B*(an*v/wm - 1)**2)  

def vderivs(v, t):
    ts = np.arange(0, t, dt)
    v1 = an * controller(v, ts) * torque(v)
    v2 = m*Cr*np.sign(v)
    v3 = 0.5*p*Cd*A*v**2
    v4 = m*np.sin(theta)
    vtot = v1+v2+v3+v4*(ts>=10)
    return vtot/m

def uderivs(v, t):
    return vr - v

def controller(currentV, time):
    z = integrate.odeint(uderivs, currentV, time)
    return kp*(vr-currentV) + ki*z.squeeze()

def velocity(desired, theta, time):
    return integrate.odeint(vderivs, desired, time)

plt.plot(t, velocity(v0, theta, t), 'k-', lw=2, label='velocity')
plt.plot(t, controller(v0, t), 'r', lw=2, label='controller')
plt.legend()
plt.show()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Integrate.odeint()的ValueError和odepack.error 的相关文章

  • 反编译Python 3.9.2的PYC文件[重复]

    这个问题在这里已经有答案了 目前 我有一个 3 9 2 版本的 python 的 PYC 文件 P S 这适用于所有 3 9 及更高版本 我正在尝试反编译 PYC 文件 但它显示错误 因为 uncompyle6 或者更确切地说 新版本 de
  • 在Python中从大文件中搜索单词列表

    我是新蟒蛇 我有一个单词列表和一个非常大的文件 我想删除文件中包含单词列表中的单词的行 单词列表按排序给出 并且可以在初始化期间输入 我正在努力寻找解决这个问题的最佳方法 我现在正在进行线性搜索 这花费了太多时间 有什么建议么 您可以使用i
  • 使用python从gst管道抓取帧到opencv

    我在用着OpenCV http opencv org 和GStreamer0 10 我使用此管道通过自定义套接字通过 UDP 接收 MPEG ts 数据包sockfd由 python 提供并显示它xvimagesink 而且效果很好 以下命
  • 在Python上获取字典的前x个元素

    我是Python的新手 所以我尝试用Python获取字典的前50个元素 我有一本字典 它按值降序排列 k 0 l 0 for k in len dict d l 1 if l lt 51 print dict 举个小例子 dict d m
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • 如何使用scrapy检查网站是否支持http、htts和www前缀

    我正在使用 scrapy 来检查某些网站是否工作正常 当我使用http example com https example com or http www example com 当我创建 scrapy 请求时 它工作正常 例如 在我的pa
  • Python HMAC:类型错误:字符映射必须返回整数、None 或 unicode

    我在使用 HMAC 时遇到了一个小问题 运行这段代码时 signature hmac new key secret key msg string to sign digestmod sha1 我收到一个奇怪的错误 File usr loca
  • 两个不同长度的数据帧的列之间的余弦相似度?

    我在 df1 中有文本列 在 df2 中有文本列 df2 的长度将与 df1 的长度不同 我想计算 df1 text 中每个条目与 df2 text 中每个条目的余弦相似度 并为每场比赛给出分数 输入样本 df1 mahesh suresh
  • Ubuntu systemd 自定义服务因 python 脚本而失败

    希望获得有关 Ubuntu 中的 systemd 守护进程服务的一些帮助 我写了一个 python 脚本来禁用 Dell XPS 上的触摸屏 这更像是一个问题 而不是一个有用的功能 该脚本可以工作 但我不想一直启动它 这就是为什么我想到编写
  • 使用 Python 将连续日期分组在一起

    Given dates datetime 2014 10 11 datetime 2014 10 1 datetime 2014 10 2 datetime 2014 10 3 datetime 2014 10 5 datetime 201
  • 使用另一个数据帧在数据帧中创建子列

    我对 python 和 pandas 很陌生 在这里 我有一个以下数据框 did features offset word JAPE feature manual feature 0 200 0 aa 200 200 0 200 11 bf
  • 可以使用哪些技术来衡量 pandas/numpy 解决方案的性能

    Question 如何简洁全面地衡量下面各个功能的性能 Example 考虑数据框df df pd DataFrame Group list QLCKPXNLNTIXAWYMWACA Value 29 52 71 51 45 76 68 6
  • 为什么 __dict__ 和 __weakref__ 类从未在 Python 中重新定义?

    类创建似乎从来没有re 定义 dict and weakref class属性 即 如果它们已经存在于超类的字典中 则它们不会添加到其子类的字典中 但始终re 定义 doc and module class属性 为什么 gt gt gt c
  • 如何将项目插入到特定索引处的空数组中?

    我想将一个项目插入到空数组的指定索引中 我看到有 Array prototype splice 方法 但是 如果我在空数组上使用 splice 它只会添加项目来结束数组 如下所示 var a a splice 3 0 item 3 cons
  • 使用 PIL 在 Tkinter 中显示动画 GIF

    我正在尝试制作一个程序来使用 Tkinter 显示动画 GIF 这是我最初使用的代码 from future import division Just because division doesn t work right in 2 7 4
  • 如何在亚马逊 EC2 上调试 python 网站?

    我是网络开发新手 这可能是一个愚蠢的问题 但我找不到可以帮助我的确切答案或教程 我工作的公司的网站 用 python django 构建 托管在亚马逊 EC2 上 我想知道从哪里开始调试这个生产站点并检查存储在那里的日志和数据库 我有帐户信
  • AWS Lambda 不读取环境变量

    我正在编写一个 python 脚本来查询 Qualys API 中的漏洞元数据 我在 AWS 中将其作为 lambda 函数执行 我已经在控制台中设置了环境变量 但是当我执行函数时 出现以下错误 module initialization
  • 如何给URL添加变量?

    我正在尝试从网站收集数据 我有一个 Excel 文件 其中包含该网站的所有不同扩展名 F i www example com example2 我有一个脚本可以成功从网站中提取 HTML 但现在我想为所有扩展自动执行此操作 然而 当我说 s
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • Array.of 与“[ ]”。何时使用 Array.of 而不是“[ ]”?

    当我发现时我正在读一些书Array of https developer mozilla org en docs Web JavaScript Reference Global Objects Array of 根据 MDN Array o

随机推荐

  • VS 2015 中未解决 Microsoft.NETCORE.app 依赖关系

    我在使用 Visual Studio 2015 时遇到问题 当我创建新的 CORE 1 0 项目时 引用显示错误 指出 NETCoreApp 无法解析 当我打开project json 文件时 Microsoft NETCore App 带
  • 在页面内容上方浮动一个 div [重复]

    这个问题在这里已经有答案了 我实现了一个动态显示搜索选项的弹出框 我希望该框 浮动 在所有网站内容之上 目前 当显示该框时 它会取代其下方的所有内容 并且看起来很糟糕 我相信我已经尝试将框的 div 的 z index 设置为高于其余页面内
  • 恢复 SQL Server 2005 数据库后将所有用户链接到登录

    请注意 此问题询问有关链接所有用户的问题 这与询问有关链接单个用户的可能重复问题不同 我希望在两台服务器之间移动数据库 我已经从第一台服务器备份了数据库 并在第二台服务器上进行了数据库恢复 到目前为止一切顺利 然而 我们的应用程序使用了数据
  • 在后台使用 prawn 和 resque 生成 pdf

    我正在尝试通过 Resque 后台作业在后台创建 PDF 文档 我用于创建 PDF 的代码位于 Rails 辅助方法中 我想在 Resque 工作线程中使用该方法 例如 class DocumentCreator queue documen
  • php循环列表中的随机产品[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有来自女巫的产品列表 我需要随机显
  • Android 底页 - 滚动问题

    我需要底部纸张停在两个位置 我有以下底页代码
  • 关于 .git/HEAD 的存储库:错误:清单丢失或不可读 - 请运行 init

    我正在使用repo 在ubuntu中 下载android 4 4源代码 上次我通过按组合键 Ctrl Z 终止了 repo 进程 这次当我使用命令 repo init 和 reposync 启动它时 出现以下错误 错误 在sync Errn
  • AtomicReferenceArray 的工作原理

    我想知道 AtomicReferenceArray 是否可以用作 ConcurrentLinkedQueue 的替代品 如果可以使用有界结构 我目前有类似的东西 ConcurrentLinkedQueue
  • UITableView tableHeaderView 中的 UIButton 不响应触摸

    好吧 我觉得自己像个白痴 我无法让这个工作正常进行 而且 SO 上的其他答案都没有让我得到任何帮助 我有一个非常简单的UIView我已经在 xib 中定义并加载为tableHeaderView of my UITableViewContro
  • 从 oracle 表中恢复已删除的行

    是否可以从 oracle 表中恢复已删除的行 我的数据存储在表 MANUAL TRANSACTIONS 中 架构名称是 CCO 我不小心删除了表中的 50 万行 并且也进行了提交 现在我想恢复它们 我正在使用 Oracle 11g R2 谢
  • 为什么 Clippy 建议传递 Arc 作为参考?

    我正在检查我的代码中的 Clippy 发现 发现迂腐的规则needless pass by value https rust lang github io rust clippy master index html needless pas
  • 如何使用 Puppeteer 读取 span 元素的值

    我正在尝试进行一些网页抓取 读取 html 页面内的一些行 我需要寻找在某些页面中重复出现的文本 span 元素 在下面的示例中 我想以 文本编号 1 文本编号 2 文本编号 3 的字符串数组结尾 span Text number 1 sp
  • 用于多种翻译的可翻译实体和形式

    考虑来自以下位置的 Category 实体及其 CategoryTranslation 实体 http github com l3pp4rd DoctrineExtensions blob master doc translatable m
  • 在快速帮助文档注释中添加 Swift 类的链接?

    假设我有两个课程 This class should be used together with Foo class Bar func doNothing Description of what Foo does goes here cla
  • 通过 PHP 连接时用户的 MS SQL Native Client 登录失败

    我有一个带有 IIS 7 5 MS SQL 2012 Express 的 Windows 2008 R2 Datacenter 服务器 使用 PHP 5 6 尝试通过 Windows 身份验证连接到我创建的数据库 testDB 但未能这样做
  • “错误”类型的值没有成员“代码”[重复]

    这个问题在这里已经有答案了 我正在将一个测试应用程序移至 Xcode 8 Beta 5 并将我的代码转换为 Swift 3 关于切换到 Swift 3 我留下了一些错误Error from NSError 我在 Xcode 中收到错误消息
  • Rspec any_instance.stub 引发 nil:NilClass 异常的未定义方法 `any_instance_recorder_for'

    这是我正在测试的类Foo rb class Foo def bar return 2 end end 这是我的测试包含在Foo spec rb require Foo rb describe Foo do before all do put
  • 使用 sed 删除两个模式之间的行(不包括)

    Ok 我知道这是一个微不足道的问题 但是 我如何从文件中删除两个已知模式 单词之间的行 pattern1垃圾模式2 获得 pattern1模式2 有谁知道学习 sed 的好 简单的 资源吗 有很多清晰的例子吗 sed n pattern1
  • CSS 问题,填写表单时标题会上升

    我有一个奇怪的 CSS 问题 我不太确定如何解决这个问题 当我按下网站上的 登录 按钮并开始输入用户名时 标题会上升 我真的不知道是什么原因造成的 有任何想法吗 Thanks 这是一些代码 表格 tooltip wrap position
  • 使用Integrate.odeint()的ValueError和odepack.error

    我正在尝试编写一个方程来建模 然后绘制一个积分控制系统 特别是关于巡航控制 但是 每当我运行它时 我都会收到两个错误 ValueError 对象对于所需数组来说太深 odepack error 函数调用的结果不是正确的浮点数组 我读过这些问