如何将Simulink模型中的传递函数转换为Matlab

如何将Simulink模型中的传递函数转换为Matlab,matlab,simulink,Matlab,Simulink,我想从Simulnik文件model.mdl中绘制一个传递函数,其中我使用了从工作区(simin)到工作区(simou)的块从Matlab开始模拟 现在问题来了。我根本找不到在Matlab中运行这个Simulink模型的方法 这是我的密码 sim('model'); h=simout/simin; [H,omega]=freqz(h); %plot 我得到这个错误 Error evaluating parameter 'VariableName' in 'model/From Wor

我想从Simulnik文件model.mdl中绘制一个传递函数,其中我使用了从工作区(simin)到工作区(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'.
我做错了什么

这是我的模型:


非常感谢。

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


但在我看来,你有一些输入数据和一些输出数据,你想估计传递函数,最后得到传递函数的频率响应。Simulink不需要这样做。找到传递函数后,可以使用
传递函数
块将其实现到Simulink中,使用
从工作区
块馈送模拟,并使用
范围
显示结果。但首先你需要传递函数

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

% 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
中显示的图形(请注意,应在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中正确实现?然后,错误表明您没有为from workspace块分配正确的变量名,您只是保留了默认的
VariableName
。对于频率响应,您需要使用
tf
在Simulink外部定义传递函数,然后使用
bodeplot
绘制它。 (看看这些答案的结尾)


但在我看来,你有一些输入数据和一些输出数据,你想估计传递函数,最后得到传递函数的频率响应。Simulink不需要这样做。找到传递函数后,可以使用
传递函数
块将其实现到Simulink中,使用
从工作区
块馈送模拟,并使用
范围
显示结果。但首先你需要传递函数

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

% 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
中显示的图形(请注意,应在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
模型)。

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

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


顺便说一句,从Simulink模型获得传递函数的更好方法是使用,正如其他人已经指出的,或者如果您有Simulink控件设计。您的方法容易产生噪音,而且不太可靠。它还依赖于你的输入具有所有感兴趣的频率成分,这是不可能的。Simulink控件设计还提供了估算模型频率响应函数的功能。

好吧,错误消息应该是不言自明的:您尚未在基本工作区中定义变量
simin
。把它定义为