如何使用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
这里,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 ++代码中,以获得传感器的error
和change in error
,以实现闭环控制系统但是这个简单的模拟并没有给出我想要的结果。
UPDATE:它适用于内置diff()
的Matlab功能块。但是Simulink需要经历一个漫长的编译阶段才能实现它。难道我在这里缺少一些简单的东西吗?
UPDATE2:所有采样时间都相同,即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以匹配具有延迟的其他块。