【问题标题】:How to get a transfer function from a Simulink model into Matlab如何从 Simulink 模型中获取传递函数到 Matlab
【发布时间】:2014-01-02 12:03:48
【问题描述】:

我想从 Simulnik 文件 model.mdl 中绘制一个传递函数,其中我使用了 From 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'.

我做错了什么?

这是我的模型:

非常感谢。

【问题讨论】:

    标签: matlab simulink


    【解决方案1】:

    你真的知道传递函数吗?在 Simulink 中是否正确实现?然后错误表明您没有为 from 工作区块分配正确的变量名称,您只是保留了默认的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 测试您的模型:

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

    如果Scope 中显示的图表(请注意,您应该在范围设置中禁用“将数据点限制为最后 5000”)与您的outputdata 相似,则估计成功。


    我为您的模型进行了测试:(固定步长求解器,无连续状态,0.0001 步长)。

    然后是下面的代码:

    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
    

    和:

    或将其转换为离散的:

    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 
    

    我帮不了你了,反正这是一个家庭作业,对吧?所以剩下的就看你了。老实说,手动计算!会更准确!

    【讨论】:

    • 感谢您的广泛回复,但我认为我们误解了。我的 simulink 模型包含一堆 1/z 单位延迟、总和和增益。所以基本上我有一个数字滤波器,我需要绘制这个滤波器的传递函数。所以问题是如何从 Matlab 中运行 Simulink model.mdl,然后绘制传递函数(这很容易)。谢谢
    • 但是数字滤波器是如何定义的?为什么不能只使用这个过滤器的属性并用FREQZ 绘制传递函数?你需要 Simin/Simout 做什么?还是您想要整个模型的传递函数?然后,您需要使用tfest 阅读我在回答中所写的内容。如果您使用模型的一些屏幕截图来扩展您的问题,这将有所帮助。而不是那些非常明显且易于修复的错误。
    • 我只得到了 Simulink 方案。我还在我的第一篇文章中添加了我的模型的屏幕截图。是的,我想要整个模型的传递函数。我还应该使用 tfest 吗?
    • 我会手动计算。然后用tfest 的结果进行检查。我不知道您是否会遇到麻烦,因为它是离散模型模型。 tfest 将返回一个时间连续传递函数,但您可以稍后对其进行转换。我会在几分钟后编辑我的答案。
    • 非常感谢您的努力。效果很好!
    【解决方案2】:

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

    顺便说一句,从 Simulink 模型中获取传递函数的更好方法是使用 dlinmod,正如其他人已经指出的那样,或者如果您有 Simulink Control Design,则使用 linearize。您的方法容易产生噪音并且不是很健壮。它还依赖于您的输入具有所有感兴趣的频率分量,这不太可能。 Simulink Control Design 还提供frestimate 来估计模型的频率响应函数。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-28
        • 1970-01-01
        • 2012-02-26
        • 1970-01-01
        相关资源
        最近更新 更多