scilab, передача параметров функции и изменение типа переменной

#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³