声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3560|回复: 5

传递函数参数辨识问题求助!

[复制链接]
发表于 2006-3-24 19:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我现在有一个三阶的传递函数,其中有三个参数不能确定,我已经通过频率响应实验的方法得到了一组数据,也就是对应一个频率测得了系统的一个输出值。现在想用matlab进行曲线拟和,求出传递函数中的未知参数。<BR>我已经用lsqcurvefit()函数试过了,方法是设函数Y=abs(G(jw))*X,其中X是频率幅值,Y是测得的对应频率的系统输出幅值,abs(G(jw))就是求传递函数的幅值。但是这样做的结果不理想,求得的三个未知参数代入传递函数后,画出的Bode图与实验数据得到的Bode图有很大出入。请各位指点错误在什么地方,或者有什么更好的方法可以用?
回复
分享到:

使用道具 举报

发表于 2006-3-25 08:47 | 显示全部楼层

回复:(yanwei1020)传递函数参数辨识问题求助!

能否把Y=abs(G(jw))*X 写的具体点<BR>不知道你包含哪些未知数
 楼主| 发表于 2006-3-25 12:49 | 显示全部楼层
<P 0cm 0cm 0pt"><FONT face="Times New Roman">函数如下:<BR>其中X设为1,相当于函数是Y=abs(G(jw)),其中w是自变量,Y是函数值<BR>-------------------------------------------------------------------------<BR>function y=nihe(x,w)<BR>a=0.0145;<BR>g=2.5e-4;<BR>u0=1.256e-6;<BR>Ag=8.1e-6;<BR>Rg=g/(u0*Ag);<BR>Nc=4000;<BR>Ja=0.311971818e-006;<BR>R=400;<BR>L=Nc^2/Rg;<BR>Km=4*Rg*(a/g)^2*x(1)^2;<BR>Kt=2*Nc*(a/g)*x(1);<BR>y=abs(x(3)*Kt./(L*Ja*w.^3*i^3+R*Ja*w.^2*i^2+L*x(2)*w*i+(x(2)-Km)*R))<BR><BR>----------------------------------------------------------------------<BR><BR>Matlab窗口中调用的是:<BR><BR>------------------------------------------------------------------------</P>
<P 0cm 0cm 0pt">&gt;&gt; [x,resid]=lsqcurvefit(@nihe,[0.5e-5,4,30],aa,b)</P>
<P 0cm 0cm 0pt">x =</P>
<P 0cm 0cm 0pt"><p> </p></P>
<P 0cm 0cm 0pt">   0.00000571114886   6.65738502965719  29.66126750247055</P>
<P 0cm 0cm 0pt"><p> </p></P>
<P 0cm 0cm 0pt"><p> </p></P>
<P 0cm 0cm 0pt">resid =</P>
<P 0cm 0cm 0pt"><p> </p></P>
<P 0cm 0cm 0pt">   0.00471267854579</P>
<P 0cm 0cm 0pt">--------------------------------------------------------------------------------<BR><BR></FONT></P>
发表于 2006-3-25 17:09 | 显示全部楼层

回复:(yanwei1020)传递函数参数辨识问题求助!

<P>从程序看应该没有太多问题<BR><BR>检查一下你的函数输入是否有问题<BR><BR>另外可以用你合后的函数计算一下原数据点的值看看差别大不大</P>
 楼主| 发表于 2006-3-25 19:21 | 显示全部楼层
<P>谢谢happy!<BR>上面那个函数拟和后的结果差别挺大的,然后我换了一种方法,因为考虑的原来的函数涉及参数太多,现在我直接把传递函数中的未知的参数作为未知量,这样就有四个未知参数,分别是x(1)、x(2)、x(3)、x(4),函数还是上面那个函数,在Matlab里写成下面的形式:<BR><BR>-----------------------------------------------------------------------------------<BR>&gt;&gt; x0=[10.5 13 10.8 3.7];<BR>&gt;&gt; nihe=inline('abs((x(1).*x(2))./(0.6511104*0.31197181e-6.*(i*aa).^3+400*0.311971818e-6.*(i*aa).^2+0.6511104*x(3).*(i*aa)+(x(3)-x(4))*400))','x','aa');<BR>&gt;&gt; [x,resid]=lsqcurvefit(nihhh,x0,w,b)<BR>-----------------------------------------------------------------------------------<BR>运行的结果是:<BR><BR>-----------------------------------------------------------------------<BR>Optimization terminated: first-order optimality less than OPTIONS.TolFun,<BR> and no negative/zero curvature detected in trust region model.</P>
<P>x =</P>
<P>  10.16912642549034  12.09428502203738  10.12954486552832   3.60115723265321</P>
<P><BR>resid =</P>
<P>   0.00471023030471<BR>------------------------------------------------------------------------------<BR>这次拟和之后,系统地Bode图和实验得到的图基本形状挺相似了。但是还是有些差别。<BR>根据上面那个resid = 0.00471023030471,应该是精度不高。我参照了薛定宇的书,修改精度限制,运行:<BR><BR>----------------------------<BR>f=optimset; f.TolFun=1e-5;<BR><BR>&gt;&gt; [x,resid]=lsqcurvefit(nihhh,x0,w,b,[],[],f)<BR>Optimization terminated: first-order optimality less than OPTIONS.TolFun,<BR> and no negative/zero curvature detected in trust region model.</P>
<P>x =</P>
<P>  10.59473781945222  13.57022868708455  11.70048598360950   4.03621143050545</P>
<P><BR>resid =</P>
<P>   0.00471017851879<BR>----------------------------<BR>但是精度并没有提高,请问如何才能使拟和的精度更好一些?<BR><BR></P>
发表于 2006-3-26 19:00 | 显示全部楼层

回复:(yanwei1020)传递函数参数辨识问题求助!

不知道是否考虑过分段拟合?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-25 10:26 , Processed in 0.057532 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表