如何从Simulink模型获取传递函数到Matlab

时间:2013-12-14 21:00:05

标签: matlab simulink

我想从Simulnik文件model.mdl中绘制一个传递函数,我使用块来自Workspace(simin)和To Workspace(simou)从Matlab开始模拟。

现在出现了问题。我简直找不到在Matlab中运行这个Simulink模型的方法。

这是我的代码;

sim('model');  


h=simout/simin;

[H,omega]=freqz(h);
%plot

我得到了这个错误;

Error evaluating parameter 'VariableName' in 'model/From
Workspace'

Caused by:
    Error using sigma (line 8)
    Undefined function or variable 'simin'.

我做错了什么?

这是我的模特: enter image description here

非常感谢你。

3 个答案:

答案 0 :(得分:2)

你真的知道转移功能吗?在Simulink中正确实现?然后错误表明您没有为您的工作区块分配正确的变量名称,您只保留默认的VariableName。对于频率响应,您需要使用tf在Simulink外部定义传输函数,然后使用bodeplot绘制它。 (看看这些答案的结尾)


但在我看来,你有一些 inputdata 和一些 outputdata ,你想估算传递函数,最后获得该传递函数的频率响应。 Simulink没有必要这样做。找到传输函数后,您可以使用Transfer function块将其实现到Simulink中,使用From Workspace块提供模拟,并使用Scope显示结果。但首先你需要转移功能。

假设您有变量inputdataoutputdata,首先需要创建传递函数数据集:

% prepare data for tftest, 100 is a random chosen sampling time
tfdata = iddata(data(:,1),data(:,2),100);

然后您可以使用tfest估算具有选定极数的传递函数:

N = 5;     % Number of poles
sys = tfest(tfdata,N);

您获得的频率响应,例如与bodeplot

bodeplot(sys)

您打算使用的函数FREQZ仅用于数字滤波器,而不用于传递函数。

最后,您可以使用Simulink测试您的模型:

enter image description here

Transfer Fcn阻止的分子是sys.num{1},分母sys.den{1}(我的例子)。

如果Scope中显示的图表(请注意,您应该在范围设置中禁用“限制数据指向持续5000”)与您的outputdata类似,估算成功。


我为你的模型做了一个测试:(固定步骤求解器,没有连续状态,0.0001步进时间。)

enter image description here

然后是以下代码:

tfdata = iddata(inputdata,outputdata,0.0001);
N = 5;
sys = tfest(tfdata,N);
bodeplot(sys)

返回:

sys =

  From input "u1" to output "y1":

  -2068 s^4 + 2.89e06 s^3 + 7.017e10 s^2 + 5.205e13 s - 8.931e15

  -------------------------------------------------------

  s^5 + 1.034e04 s^4 + 4.552e07 s^3 + 1.114e11 s^2  + 8.337e13 s + 8.931e15

enter image description here

或将其转换为离散:

sysd = c2d(sys,0.0001)

sysd =

  From input "u1" to output "y1":

  -0.0995 z^-1 + 0.4644 z^-2 - 0.7491 z^-3 + 0.5061 z^-4 - 0.1219 z^-5  

  -------------------------------------------------------

  1 - 4.042 z^-1 + 6.554 z^-2 - 5.332 z^-3 + 2.176 z^-4  - 0.3556 z^-5 

我无法帮助你,无论如何这是一个功课,对吧?所以其余的由你决定。老实说,手工计算吧!它将更精确!

答案 1 :(得分:2)

嗯,错误消息应该是不言自明的:您还没有在基础工作区中定义变量simin。定义它(作为时间的函数),然后你的模型就会运行。

顺便说一下,从Simulink模型获取传递函数的更好方法是使用dlinmod,正如其他人已经指出的那样,或linearize如果你有Simulink控制设计。您的方法容易产生噪音而且不够稳健。它还依赖于您输入的所有频率成分,这是不太可能的。 Simulink Control Design还提供frestimate来估计模型的频率响应函数。

答案 2 :(得分:1)

查看dlinmod:围绕工作点(来自Simulink模型)提取离散时间线性状态空间模型。

相关问题