【问题标题】:How to do integration in mfile just like in Simulink in matlab?如何在 mfile 中进行集成,就像在 matlab 中的 Simulink 中一样?
【发布时间】:2015-10-11 18:19:03
【问题描述】:

我不确定为什么这段代码不起作用:

if true
  %% PID Test file
% Start the script
clear
clc
kp = 180;
kI = 3200;
kD = 1;
start_time = 0;
step_time = 1;
end_time = 2;
Ts = 0.1;% Sample Time
step_value = 1;
initial_value = 0;
Fn = 50;
  W = 2*pi*Fn;
  Phase = 0;
  Amp = 1;
steps = 1;
if steps
[t,y] = step_fun(start_time,step_time,end_time,Ts,step_value,initial_value);
sim('PID_Test_sim.mdl')
else
  t = start_time:Ts:end_time;
  y = sin(W*t);
  sim('PID_Test_sim.mdl')
end
x_min = start_time;
x_max = end_time;
y_min = initial_value - 1;
y_max = step_value + 1;
figure();
subplot(2,1,1);
stairs(t,y);grid on;hold on; stairs(ScopeData.time,ScopeData.signals(1,2).values,'--r');hold off;%y([y_min y_max]);xlim([x_min x_max]);
subplot(2,1,2);
plot(t,y);grid on;hold on; plot(ScopeData.time,ScopeData.signals(1,2).values,'--r');hold off;%y([y_min y_max]);xlim([x_min x_max]);
Input = y;
time = t;
dt = diff(time);
D = [0,diff(Input.*kD) ./ dt]';
I = [cumtrapz(time,(Input.*kI))]';
%I = [0;(I(1:end-1)+I(2))];
I_test = I;
I_test(I_test>0) = (I(find(I>0,1,'first'))) + I(I>0);
I_test = [0,I_test(1:end-1)];
P = [Input*kp]';
Compare = ScopeData1;
figure();
subplot(3,1,1);
stairs(time,P);grid on;hold on; stairs(Compare.time,Compare.signals(1,1).values,'--r');hold off
subplot(3,1,2);
plot(time,I);grid on;hold on; plot(Compare.time,Compare.signals(1,2).values,'--r');hold off
subplot(3,1,3);
plot(time,D);grid on;hold on; plot(Compare.time,Compare.signals(1,3).values,'--r');hold off
Test = [I ScopeData1.signals(1,2).values time'];
[time,Output] = PID_fun(kp,kI,kD,Input,time,ScopeData1);
figure();
subplot(2,1,1);
stairs(t,y);grid on;hold on; stairs(ScopeData.time,ScopeData.signals(1,2).values,'--r');hold off;
subplot(2,1,2);
plot(time,Output);grid on;hold on; plot(ScopeData.time,ScopeData.signals(1,1).values,'--r');hold off;
Test = [I ScopeData1.signals(1,2).values I_test P ScopeData1.signals(1,1).values D ScopeData1.signals(1,3).values time' Output ScopeData.signals(1,1).values];

这是一个非常简单的代码,它生成一个阶跃信号(在 step_fun 中),然后运行模拟 mdl,它是一个以阶跃函数作为输入的 PID 控制器。然后我正在运行我的 PID 函数,该函数稍后由变量 (P,I,D) 解释,并且在集成中我正在模拟和 mfile 之间产生不同的结果?你能帮帮我吗?结果是:

     % code
% My integration results of the input signal when kI = 3200;
mfile    simulation
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
0   0
160 0
480 320
800 640
1120    960
1440    1280
1760    1600
2080  1920
2400  2240
2720  2560
3040  2880
3360  3200

这是一些带有结果的数字:

最好的问候和提前谢谢

【问题讨论】:

  • 即使您的代码的非 Simulink 部分也无法运行,因此很难提供有用的帮助。这些图没有帮助,但从打印的数字来看,两个模拟可能在做同样的事情,只是时间上有一个偏移。您说 Simulink 使用固定时间步长,但随后您使用 diff 计算向量 dt。向量中的值应该接近,但可能存在数值错误。尝试使用实际的固定时间步长。什么决定了该步骤的开始时间?也许> 需要是>= 或类似的。
  • 首先感谢重播。您无法运行非 Simulink 代码,因为您没有“step_fun”。对于这些数字,您将无法运行它们,因为它们是模拟结果和 mfile 结果之间的比较。所以在你的情况下,如果你只是想运行我的代码,我建议:1-将变量(步骤 = 1)设置为零,然后你将生成一个仍然无法与模拟进行比较的正弦波,因为你没有模拟模型只是一个 PID 块,其输入具有与 mfile 中生成的相同属性的正弦波或阶跃波。所以你可以自己做!!!!!!

标签: matlab simulink


【解决方案1】:

没有看到 Simulink 模型很难判断,但我怀疑在 Simulink 中您使用的是可变步长求解器,它能够比在 MATLAB 文件中花费更小的时间步长,从而为您提供更准确的结果。

如果您有控制系统工具箱,我建议您使用 pid 命令在 MATLAB 中创建 PID,然后使用 steplsim 命令计算阶跃响应,而不是手动尝试.我的猜测是结果会更接近。

【讨论】:

  • 感谢您的重播。我在 simulink 和 mfile 中使用相同的步长时间 (Ts),并且我还在使用 Ts 作为步长时间的固定步长求解器进行模拟。我正在使用的 simulink mdl 只是 simulink 中 mfile 的一个实现(您可以看到结果具有相同数量的索引)所以我仍然不确定为什么我得到不同的结果。我有工具,但我想使用我自己的 mfile,因为我的数据非常大,我不想在这些方法上浪费时间(使用我自己的 mfile 时,我节省了大约 40 分钟的模拟时间)
  • 这可能是因为您使用的是固定步长求解器,因此需要很长时间。使用可变步长求解器,它会快很多。 Simulink 是在时域中模拟复杂系统的正确工具。您是否尝试过在 MATLAB 代码中使用 pidstep/lsim
  • 是和不是。我知道我可以直接使用 pid 函数,但我不想。我正在对三相测量的电压和电流信号进行一些闪烁评估。 (Fs >= 20 kHz 的 10 分钟数据)作为此评估的一部分,我需要获取这些信号的 PLL,以便生成没有任何闪烁值的电网电压信号(Pst = 0,Plt = 0)。我已经确定了我的 Zerocrossing 并计算了 W = 2*pi*f 之后的频率,最后我需要得到 Wt,这是 W 的积分。所以我需要 cumtrapz 正常工作,所以我有一个正确的 Wt我的测量信号
【解决方案2】:

所以最后我确实回答了我自己的问题:)

模拟在当前点 t(i-1) 之前的点上进行积分,而 cumtrapz 对当前点 t(i) 进行积分,这就是不同之处。

作为结果,我将我的 cumtrapz 更改为 cumtrapzt,在那里我计算了给定数据集 (t(end-1)) 的 diff(t) 到 t(i-1)

感谢大家的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-02
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2010-09-08
    • 2011-06-09
    相关资源
    最近更新 更多