как импортировать m-файл с внутренней функцией в 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? Спасибо всем :)


person Vahid_EL    schedule 14.11.2015    source источник


Ответы (1)


Я не верю, что вы действительно хотите делать то, о чем говорит ваш вопрос. Ваш файл main.m эквивалентен пользовательскому интерфейсу Simulink, т. е. биту, в котором указывается время выполнения решателя и модели (среди прочего). Нет смысла использовать его в Simulink.

Однако ваш второй блок кода, vdp, где определены функциональные возможности модели, безусловно, можно использовать в Simulink. Это (по крайней мере, внешне) выглядит так, как будто его можно добавить прямо в модель с помощью блока MATLAB Function. Вы бы передали его вывод (т.е. xdot) непосредственно в блок Continuous Time Integrator, а затем передали бы вывод интегратора (который будет x) обратно во второй ввод блока MATLAB Function. Вы бы подали блок Clock на первый вход блока MATLAB Function.

Конечно, вы также можете реализовать функциональность vdp, используя блоки Simulink, а не в m-коде.

person Phil Goddard    schedule 16.11.2015