首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于单位时间离散导数的等效于Matlab中的diff()函数的Simulink块

用于单位时间离散导数的等效于Matlab中的diff()函数的Simulink块
EN

Stack Overflow用户
提问于 2014-05-12 11:48:26
回答 1查看 7.5K关注 0票数 2

如何使用diff()块实现Matlab中可用的Simulink函数?

我需要读取数字传感器数据序列(x,y) where,x=[0, 5, 10, 15, 20, 25, 30, ... 100]。我要计算x中的变化,即del_x。我的假设是,由于它是一个数据序列,我可以假设时间为单位时间t=[0, 1, 2, 3, 4, 5, 6, 7, ... 20]

现在,我使用Model Configuration Parameters在Simulink中尝试了这个简单的模型:

代码语言:javascript
复制
Start time: 0.0
Stop time: 20
Solver Option = Fixed-step
Solver: discrete (no continuous states)
Fixed-step size (fundamental sample time): 1

在这里,simin等于上面描述的输入数组x。但simout变成了del_x = [5, 10, 15, 20, 25, 30, 35 ... 100]。所以我的问题是,x(或simout)的变化不应该是del_x = [0, 5, 5, 5, 5, 5, 5, 5, ... ],因为x的变化总是在5的时候不断变化吗?在Matlab中,diff()函数给出了所需的结果。

使用等式:del_x = (x[i] - x[i-1])/(t[i]-t[i-1]) = (x[i] - x[i-1])/(1)

为什么输出是输入x[t]的延迟版本x[t]而不是x中的更改?Discrete Derivative block不是应该与Matlab中的diff()函数相同吗?同样,Difference block也给出了同样的不想要的结果。为了更大的画面,我需要导出一个更大版本的Simulink模型到C++代码中,以获得传感器的errorchange in error,以实现闭环控制系统,但这个简单的仿真并没有给出我想要的结果。

更新:,它与Matlab函数块一起工作,里面有diff()。但是Simulink需要经过一个漫长的编译阶段才能实现它。我在这里错过了什么简单的东西吗?

UPDATE2:所有示例时间相同,即1 (显示->样本时间-> All选项)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-12 14:54:54

您应该将源(来自工作区)设置为每一时间立即输出一个示例。目前,我认为你所有的数据都是在同一时间发布的。您在"From工作区“中的simin应该类似于下面的结构。

代码语言:javascript
复制
simin.time = 0:20;
simin.signals.values = (0:5:100)';
simin.signals.dimensions = 1;

现在,如果您将示例时间设置为1并运行模型20步,那么您应该得到所需的输出。

对于这些数据,MATLAB函数中的代码不会做您想做的事情。您需要使用一个持久变量来实现diff,以便与具有延迟的其他块匹配。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23608238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档