matlab - Simulink block 相当于 Matlab 中的 diff() 函数,用于单位时间内的离散导数

标签 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应该与 diff() 操作相同Matlab 中的函数?还有Difference block给出了同样不期望的结果。出于更大的考虑,我需要将较大版本的 Simulink 模型导出到 C++ 代码中,以获得 errorchange in error传感器以实现闭环控制系统,但这个简单的模拟并没有给出我想要的结果。

更新:它与 Matlab 功能 block 一起使用 diff()里面。但Simulink仅仅实现它就需要经历漫长的编译阶段。我在这里缺少一些简单的东西吗?

Matlab function block implementation of diff() function

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

enter image description here

最佳答案

您应该将源(来自工作区)设置为每个时刻输出一个样本。目前,我认为您的所有数据都会同时流出。 “来自工作区”中的 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/

相关文章:

python - 如何在python中为导数实现以下公式?

c - matlab和c的cos函数不同

python - 将 Matlab 矩阵读入 Python

matlab - Simulink-Simulation with parfor(并行计算)

java - 如何在 Java 代码中接收 Simulink 常量值?

python - 有没有一种矢量化的方法来计算 sympy 中的梯度?

fft - 计算导数傅立叶系数 Julia

java - 在 MATLAB 的 com.mathworks 内部获得帮助

matlab - 矢量化矩阵乘法

matlab - 建模与仿真编程语言