yanwei1020 发表于 2006-3-24 19:49

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

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

happy 发表于 2006-3-25 08:47

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

能否把Y=abs(G(jw))*X 写的具体点<BR>不知道你包含哪些未知数

yanwei1020 发表于 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; =lsqcurvefit(@nihe,,aa,b)</P>
<P 0cm 0cm 0pt">x =</P>
<P 0cm 0cm 0pt"><p> </p></P>
<P 0cm 0cm 0pt">   0.00000571114886   6.6573850296571929.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>

happy 发表于 2006-3-25 17:09

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

<P>从程序看应该没有太多问题<BR><BR>检查一下你的函数输入是否有问题<BR><BR>另外可以用你合后的函数计算一下原数据点的值看看差别大不大</P>

yanwei1020 发表于 2006-3-25 19:21

<P>谢谢happy!<BR>上面那个函数拟和后的结果差别挺大的,然后我换了一种方法,因为考虑的原来的函数涉及参数太多,现在我直接把传递函数中的未知的参数作为未知量,这样就有四个未知参数,分别是x(1)、x(2)、x(3)、x(4),函数还是上面那个函数,在Matlab里写成下面的形式:<BR><BR>-----------------------------------------------------------------------------------<BR>&gt;&gt; x0=;<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; =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.1691264254903412.0942850220373810.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; =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.5947378194522213.5702286870845511.70048598360950   4.03621143050545</P>
<P><BR>resid =</P>
<P>   0.00471017851879<BR>----------------------------<BR>但是精度并没有提高,请问如何才能使拟和的精度更好一些?<BR><BR></P>

happy 发表于 2006-3-26 19:00

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

不知道是否考虑过分段拟合?
页: [1]
查看完整版本: 传递函数参数辨识问题求助!