Simulink块相当于单位时间内离散导数的Matlab中的diff()函数

时间:2014-05-12 11:48:26

标签: matlab simulink derivative

如何使用diff()阻止实现Matlab中提供的Simulink功能?

我需要读取一系列数字传感器数据(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中尝试了这个简单的模型,Model Configuration Parameters为:

Start time: 0.0
Stop time: 20
Solver Option = Fixed-step
Solver: discrete (no continuous states)
Fixed-step size (fundamental sample time): 1

Simple Discrete Derivative test in Simulink

这里,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-1]的延迟版x[t]而不是x的变化?是不是Discrete Derivative block应该在Matlab中与diff()函数运行相同? Difference block也会产生相同的不良结果。为了更大的图片,我需要将更大版本的Simulink模型导出到C ++代码中,以获得传感器的errorchange in error,以实现闭环控制系统但是这个简单的模拟并没有给出我想要的结果。

UPDATE:它适用于内置diff()的Matlab功能块。但是Simulink需要经历一个漫长的编译阶段才能实现它。难道我在这里缺少一些简单的东西吗?

Matlab function block implementation of diff() function

UPDATE2:所有采样时间都相同,即1(显示 - >采样时间 - >全部选项)。

enter image description here

1 个答案:

答案 0 :(得分:2)

您应该设置源(从工作区)到每个时刻输出一个样本。目前我认为你的所有数据都是在同一时刻出现的。你的simin in" From workspace"应该与您的案例类似于以下结构。

simin.time = 0:20;
simin.signals.values = (0:5:100)';
simin.signals.dimensions = 1;

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

对于这些数据,MATLAB函数中的代码将无法满足您的需求。您需要使用持久变量实现diff以匹配具有延迟的其他块。