如何实现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
应该与 diff()
操作相同Matlab 中的函数?还有Difference block
给出了同样不期望的结果。出于更大的考虑,我需要将较大版本的 Simulink 模型导出到 C++ 代码中,以获得 error
和change in error
传感器以实现闭环控制系统,但这个简单的模拟并没有给出我想要的结果。
更新:它与 Matlab 功能 block 一起使用 diff()
里面。但Simulink仅仅实现它就需要经历漫长的编译阶段。我在这里缺少一些简单的东西吗?
更新2:所有采样时间都相同,即 1
(显示->采样时间->所有选项)。
最佳答案
您应该将源(来自工作区)设置为每个时刻输出一个样本。目前,我认为您的所有数据都会同时流出。 “来自工作区”中的 simin 应类似于您的案例的以下结构。
simin.time = 0:20;
simin.signals.values = (0:5:100)';
simin.signals.dimensions = 1;
现在,如果您将采样时间设置为 1 并运行模型 20 个步骤,那么您应该会得到所需的输出。
对于此数据,您在 MATLAB Function 中的代码将无法执行您想要的操作。您需要使用持久变量来实现 diff,以匹配其他具有延迟的 block 。
关于matlab - Simulink block 相当于 Matlab 中的 diff() 函数,用于单位时间内的离散导数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23608238/