如何将具有内部功能的m文件导入simulink?

how to importing m-file with internal function to simulink?

我的问题有些难以描述,但我尽量用最好的方式表达。 我有一个模型,其中包含一个名为 '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

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

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

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

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