0

我的问题有些难以描述,但我尽量表达出来。我有一个模型,其主文件名为“main.m”,带有一些代码。在“main.m”文件中,我使用 ode45 来求解微分方程。

这是我的“main.m”代码:

[t,x]=ode45(@vdp,[0 100],[0 0 -15 0]);

subplot(2,1,1);
plot(t,x(:,1),'r-',t,x(:,3),'b-');
title('Positions');
legend('Loco','Wagon');
xlabel('Time');
ylabel('Distance');
grid;
subplot(2,1,2);
plot(t,x(:,2),'r-',t,x(:,4),'b-');
title('Velocities');
legend('Loco','Wagon');
xlabel('Time');
ylabel('Velocity');
grid;

如您所知,对于 ode45,我们需要一个函数来描述微分方程,为此,我使用了另一个名为“vdp.m”的文件。我的“vdp.m”代码:请注意,我的输入是“u”变量,输出是“dx(1),dx(2),dx(3),dx(4)”?

function dx = vdp(t,x)
%% Setting Parameters
c0 = 7.6658*10^-3; % unit = Nkg^-1
cv = 1.08*10^-4;   % unit = Ns(mkg)^-1
ca = 2.06*10^-5;   % unit = Ns^2(m^2 kg)^-1
m1 = 50000;       % unit = kg
m2 = 48500;       % unit = kg
k1 = 85*10^2;      % unit = Nm^-1
d1 = 85*10^4;      % unit = kgs^-1
% Force Input
u = 3000;       % unit = N  48750
%u2 = 0;
teta1 = 0;
teta2 = 0;
D1 = 0;
D2 = 0;
% dx=zeros(6,1); % a column vector
%% Generate Control Input
if t>=0 && t<=10
    a=0;
    u1=u*a;
elseif t>10 && t<=15
    a=1;
    u1=u*a;
elseif t>15 && t<=55
    a=50;
    u1=u*a;
elseif t>55 && t<=75
    a=-97;
    u1=u*a;
else
    a=0;
    u1=u*a;
end
%% State Equations
% x1 -> position of loco
% x2 -> velocity of loco
% x3 -> position of wagon
% x4 -> velocity of wagon

if t>=0 && t<=10
    dx(1)=0; dx(2)=0; dx(3)=0; dx(4)=0;
    dx = [dx(1);dx(2);dx(3);dx(4)];
elseif t>10 && t<=75
    dx(1)=x(2);
    dx(2)=(1/m1)*(u1-k1*(x(1)-x(3))-d1*(x(2)-x(4))-(c0+cv*x(2))*m1- ...
        ca*((x(2))^2)*(m1+m2)-9.98*(sin(teta1))*m1-0.004*D1*m1);
    dx(3)=x(4);
    dx(4)=(1/m2)*(-k1*(x(3)-x(1))-d1*(x(4)-x(2))-(c0+cv*x(4))*m2- ... 
        9.98*(sin(teta2))*m2-0.004*D2*m2);
    dx = [dx(1);dx(2);dx(3);dx(4)];
else
    dx(1)=0; dx(2)=0; dx(3)=0; dx(4)=0;
    dx = [dx(1);dx(2);dx(3);dx(4)];
end

现在我想在 Simulink 中使用“main.m”文件程序作为一个块,因为这些代码描述了我的模型行为。有什么方法可以将“main.m”文件导入块并在我的 simulink 模型中使用该块,或者将两个 m 文件组合到一个文件并制作一个使用 MATLAB Function Block 的函数?谢谢大家:)

4

1 回答 1

0

我不相信你真的想做你的问题所说的你想做的事情。您的main.m文件相当于 Simulink 用户界面,即指定求解器和模型运行时间(以及其他内容)的位。想在 Simulink 中使用它是没有意义的。

但是,vdp定义模型功能的第二个代码块,当然可以在 Simulink 中使用。它(至少在表面上)看起来好像可以使用 MATLAB Function 模块直接放入模型中。您可以将其输出(即 xdot)直接输入到 Continuous Time Integrator 模块中,然后将积分器的输出(将是 x)输入回 MATLAB Function 模块的第二个输入中。您需要将 Clock 模块输入 MATLAB Function 模块的第一个输入。

当然,您也可以使用 Simulink 模块而不是在 m 代码中实现 vdp 功能。

于 2015-11-16T03:16:14.773 回答