#scilab
Вопрос:
Я пытаюсь построить графический интерфейс для вывода графиков для проектирования системы управления при вводе параметров передаточной функции.У меня возникли некоторые проблемы с передачей параметров функции и изменением типа переменной.
У меня есть структура с примерами параметров моделирования:
param = []; param.parameter = "s"; param.dom = "c"; //domain(c for continuous, d for discrete) param.num = 1; //numerator of transfer function param.den = "(s 1)^3"; //denominator param.fmin = 0.01; //min freq of the plot param.fmax = 100; //max freq
и функция для построения графиков:
// display function function displayProblem(param) parameter = param.parameter; dom = param.dom; num = param.num; den = param.den; fmin = param.fmin; fmax = param.fmax; s = poly(0,parameter.string); h = syslin(dom.string,num,den); // Plotting of model data delete(gca()); //bode(h,fmin1,fmax1); gain_axes = newaxes(); gain_axes.title.font_size = 3; gainplot(h,fmin,fmax); gain_axes.axes_bounds = [1/3,0,1/3,1/2]; gain_axes.title.text = "Gain Plot"; phase_axes = newaxes(); gain_axes.title.font_size = 3; phaseplot(h,fmin,fmax); phase_axes.axes_bounds = [1/3,1/2,1/3,1/2]; phase_axes.title.text = "Phase Plot"; phase_axes = newaxes(); gain_axes.title.font_size = 3; nyquist(h); phase_axes.axes_bounds = [2/3,0,1/3,1/2]; phase_axes.title.text = "Nyquist Plot"; endfunction
Что-то не так при передаче числителя и знаменателя функции. Тип переменной не соответствует тому, что требовал syslin. Если я заменю » num » и » den » на » 1 » и «(s 1)^3», все будет работать довольно хорошо. Кроме того, если я попробую это построчно в панели управления, это сработает, но не в СциНотах. Как правильно с этим бороться? Любое предложение будет очень воспринято.
Ответ №1:
В вашем коде есть 3 ошибки: Замените
param.den = "(s 1)^3"; //denominator
с
param.den = (%s 1)^3;
Действительно, Scilab имеет встроенный полиномиальный тип. Многочлены не определяются ни как строка, ни как вектор коэффициентов. Предопределенной константой %s
является одночленное s
число .
В дополнение,
s = poly(0,parameter.string);
бесполезно (и неверно: parameter
будет работать, в то время parameter.string
как не будет, так parameter
как не имеет строкового поля: Это строка). Просто уберите линию.
Кроме того, замените
h = syslin(dom.string,num,den);
с помощью простого
h = syslin(dom, num,den);
Наконец, хотя компоновка рисунка не проста, вы можете использовать bode() в функции следующим образом:
// delete(gca()); subplot(1,3,2) bode(h, fmin, fmax) subplot(2,3,3) nyquist(h) gcf().children.title.text=["Nyquist Plot" "Phase Plot" "Gain Plot"]
Все в одном, код вашей функции может вернуться к
function displayProblem(param) [dom, num, den] = (param.dom, param.num, param.den); [fmin, fmax] = (param.fmin, param.fmax); h = syslin(dom, num,den); // Plotting of model data subplot(1,3,2) bode(h,fmin,fmax); subplot(2,3,3) nyquist(h); gcf().children.title.text=["Nyquist Plot" "Phase Plot" "Gain Plot"]; endfunction
С уважением
Комментарии:
1. Привет, большое спасибо за ваши предложения. Я попытался использовать «%s» вместо » s » и удалил «s = poly(…)». Это хорошо сработало. Когда я попробовал » h = syslin(dom,num,den)», он продолжал предупреждать меня о неправильном типе для dom, num и den. Использование «dom.string» отчасти помогло построить сюжет, но » num » и » den » все равно получили предупреждение за неправильный тип. Ваши предположения довольно хорошо сработали в контрольной группе, но не в СциНотах. Я согласен, что параметр и dom должны быть строковыми, и я не понимаю, почему это не сработает…
2. Ирен Зет, Какую версию Scilab вы используете (введите —gt; getversion // в консоли)? Кстати, не могли бы вы, пожалуйста, опубликовать полное фактическое сообщение «предупреждение» о том, что «оно постоянно предупреждало меня о неправильном типе для dom, num и den»? Спасибо
3. И, пожалуйста, опубликуйте результат—gt;gt;
param.dom, param.num, param.den
, чтобы посмотреть, что в нем.4. Я использовал версию 6.1.1. Если я поставлю
h = syslin(dom,num,den);
, как вы предложили, предупреждение будет syslin: Неправильный тип для входного аргумента #1: Ожидается строка, скалярная или пустая матрица.5. Результатом
param.dom, param.num, param.den
являетсяans = "c", ans =1. , ans = 1 3s 3s² s³