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

单位时间离散导数的Simulink块等效于Matlab中的diff()函数,matlab,simulink,derivative,Matlab,Simulink,Derivative,如何使用Simulink块实现Matlab中可用的diff()函数 我需要读取一系列数字传感器数据(x,y)其中,x=[0,5,10,15,20,25,30,…100]。我想计算x的变化,即del_x。我的假设是,由于它是一个数据序列,我可以假设时间为单位时间t=[0,1,2,3,4,5,6,7,….20] 现在我在Simulink中尝试了这个简单的模型,模型配置参数为: Start time: 0.0 Stop time: 20 Solver Option = Fixed-step Solve

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

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

现在我在Simulink中尝试了这个简单的模型,模型配置参数为:

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,…]
,因为x的变化总是以5为单位不断变化吗?在Matlab中,
diff()
函数为我提供了所需的结果

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

为什么输出是输入
x[t]
的延迟版本
x[t]
,而不是x中的更改?
离散导数块
的操作与Matlab中的
diff()函数
的操作相同吗?另外,
差分块
也给出了同样的不希望得到的结果。为了更大的图片,我需要将一个更大版本的Simulink模型导出到C++代码中,以便得到传感器的<代码>错误>代码>代码>更改错误< /代码>,以实现闭环控制系统,但是这个简单的仿真并没有给出我想要的结果。 更新:它与内置
diff()
的Matlab功能块一起工作。但是Simulink需要经历一个漫长的编译阶段才能实现它。我在这里不缺少一些简单的东西吗

更新2:所有采样时间都相同,即
1
(显示->采样时间->所有选项)


您应该将源(从工作区)设置为每次输出一个样本。目前,我认为你所有的数据都是在同一时刻发出的。“来自工作区”中的simin应该类似于您案例中的以下结构

simin.time = 0:20;
simin.signals.values = (0:5:100)';
simin.signals.dimensions = 1;
现在,如果您将采样时间设置为1,并运行模型20个步骤,那么您应该会得到所需的输出


对于这些数据,您在MATLAB函数中的代码不会执行您想要的操作。您需要使用一个持久变量来实现差异,以匹配具有延迟的其他块。

您可能希望使用因果运算符
Z(f(x)-f(x-1))=1-Z^-1
,或者我遗漏了什么?如果我使用与您的建议在数学上等价的差异块
(Z-1)/Z
simout
与我描述的相同。它只是[x(2)…x(20)],因为输入[x(1)x(2)…x(20)]不是我想要的。但是Matlab中的
diff()
函数似乎可以工作。我的固定步长模拟配置参数有什么问题吗?在“从工作区”块中是否使用采样时间1?你检查过所有的信号都是采样时间1的吗(参见)?是的,所有的采样时间都是1。啊,这就是我做得不对的地方。非常感谢,它现在可以工作了。