Simulink не может определить размеры и / или типы выходов для блока «MATLAB Function» - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть маленькая модель Simulink следующим образом:

enter image description here

и код обратной связи:

function [xdot,y] = fcn(x,u)

    % define your constants
    g = 9.81;
    m = 0.05;
    R = 1;
    L = 0.01;
    C = 0.0001; 
    x1 = 0.012;
    x2 = 0;
    x3 = 0.84;

    % nonlinear set of equations
    xdot = [x2; g-((C/m)*(x3/x1)^2); -((R/L) +(((2*C)/L)*(((x2*x3)/((x1)^2)))))] + [0;0;1/L]*u;

    y = x';   

Однако при попытке запустить Simulink выдает следующие ошибки:

Предполагаемый размер ('[1 3]') для данных 'y' не соответствует указанному размеру ( 'Скалярная'). Компонент: MATLAB Функция | Категория: Кодер ошибки Simulink не может определить размеры и / или типы выходов для блока 'MATLAB Функция 'из-за ошибок в теле блока или ограничений базовый анализ. Ошибки могут быть неточными. Исправить указанное ошибки или явно указать размеры и / или типы для всех блоков выходы.

Я искал в некоторой документации входы и выходы переменного размера , установил флажок переменного размера и также ввел верхнюю границу как [1 3].

Когда я пытаюсь снова бежать, я получаю:

Выражение '[1 3]' для максимума данных 'y' должно вычисляться как скаляр.

Я не уверен, как решить эту ошибку. Я также посмотрел здесь , но все еще не мог заставить его работать. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Вы, вероятно, обнаружите, что ваш код будет работать, внеся следующие изменения,

  • У вас нет данных переменного размера, и вы можете установить для всех этих параметров значения по умолчанию.

  • (Как указано в одном из других ответов), вам нужно изменить способ ввода x в ваши уравнения, потому что в данный момент он не используется для вычисления xdot.

  • Переместите x1, x2 и x3, чтобы получить вектор начальных условий 3 * 1 для блока Integrator. (Предполагая, что это то, что они на самом деле.)

С этими изменениями блок должен обнаружить, что сигнал x имеет размер 3 на 1 (поскольку блок Integrator имеет 3 начальных значения), и, следовательно, ваш вывод xdot равен 3 на 1, и ваш y вывод - 1 на 3.

Чтобы быть в безопасности, вы также можете рассмотреть возможность размещения следующих 2 строк в верхней части вашей функции.

xdot = zeros(3,1);
y = zeros(1,3);

Эти строки будут использоваться во время инициализации блока, чтобы сообщать компилятору, какой будет размер выходных сигналов.

ПРИМЕЧАНИЕ: почему вы делаете y вектором 1 на 3? Это очень необычно, и я подозреваю, что вы действительно хотите, чтобы это был вектор 3 на 1 (если вы хотите вывести состояния) или , вы должны суммировать значения x, чтобы получить y в этом случае это просто скаляр.

Не относится к вышеперечисленному, но вы также можете рассмотреть возможность задания констант параметров блока, чтобы вы могли изменять их без редактирования функции.

0 голосов
/ 19 ноября 2018

Я думаю, вам придется установить размеры для всех входов и выходов функционального блока в диспетчере портов и данных, как вы пытались.

Установите размер для y до [1 3], x до [3 1] и xdot до [3 1].

Кроме того, я думаю, что в вашем нелинейном пространстве состояний есть ошибка, поскольку ваша матрица 'A' теперь постоянна.Поэтому, чтобы сделать их зависимыми от текущего состояния, замените объявление x1 и т. Д. На:

x1 = x(1);
x2 = x(2);
x3 = x(3); 

Я предполагаю, что значения, которые у вас есть прямо сейчас, являются вашими начальными условиями для дифференциальных уравнений, которые выпридется установить в блоке интегратора.

...