bug 6745 fix 11/311/3
Serge Steer [Thu, 29 Apr 2010 09:26:40 +0000 (11:26 +0200)]
Change-Id: I2045f87806ec626d777a365a6ebdf00ceac677d0

scilab/CHANGES_5.3.X
scilab/modules/cacsd/macros/g_margin.sci
scilab/modules/cacsd/tests/nonreg_tests/bug_6745.dia.ref [new file with mode: 0644]
scilab/modules/cacsd/tests/nonreg_tests/bug_6745.tst [new file with mode: 0644]

index a812be7..56c197d 100644 (file)
@@ -260,6 +260,8 @@ Bug fixes:
 
 * bug 6744 fixed - p_margin() returned an erroneous result.
 
+* bug 6745 fixed - g_margin() returned an erroneous result.
+
 * bug 6784 fixed - It was not possible to move a Scilab installation without
                    breaking the (previously installed) ATOMS packages load.
 
index 8dc8478..a435d40 100644 (file)
@@ -24,7 +24,7 @@ function [gm,fr]=g_margin(h)
   if h.dt=='c' then  //continuous time case
     // get s such as h(s)=h(-s) and s=iw 
      s=%i*poly(0,"w");
-     w=roots(imag(horner(h.num,s)*conj(horner(h.den,s))) )
+     w=roots(imag(horner(h.num,s)*conj(horner(h.den,s))),"e")
      ws=real(w(abs(imag(w))<eps&real(w)<=0)) //points where phase is -180°
      ws(abs(horner(h.den,%i*ws))==0)=[];
      if ws==[] then gm=%inf,fr=[],return,end
@@ -36,10 +36,10 @@ function [gm,fr]=g_margin(h)
     z=poly(0,varn(h.den));
     sm=simp_mode();simp_mode(%f);hh=h-horner(h,1/z);simp_mode(sm)
     //find the numerator roots
-    z=roots(hh.num);
+    z=roots(hh.num,"e");
     z(abs(abs(z)-1)>eps)=[]// retain only roots with modulus equal to 1
     w=log(z)/(%i*dt)
-    ws=real(w(abs(imag(w))<eps&real(w)<=0)) //points where phase is -180°
+    ws=real(w(abs(imag(w))<eps)) //points where phase is -180°
     if ws==[] then gm=%inf,fr=[],return,end
     mingain=real(horner(h,exp(%i*ws*dt)))
   end
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_6745.dia.ref b/scilab/modules/cacsd/tests/nonreg_tests/bug_6745.dia.ref
new file mode 100644 (file)
index 0000000..22e94d1
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2010 - INRIA - Serge Steer
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- Non-regression test for bug 6745 -->
+// <-- JVM NOT MANDATORY -->
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=6745
+//
+// <-- Short Description -->
+//  g_margin() returned an erroneous result
+z=poly(0,'z');
+Hbo=syslin(1,(0.042-0.03933*z-0.15407*z^2+0.18518*z^3+6.939e-18*z^4)/(-0.042+0.088*z+0.114*z^2-0.36*z^3+0.2*z^4));
+[m,fr]=g_margin(Hbo);
+if abs(fr-0.5)>1d-10 then bugmes();quit;end
+r=repfreq(Hbo,fr);
+if ~isreal(r,1e-10) then bugmes();quit;end
+if real(r)>0 then bugmes();quit;end
+if abs(20*log10(1/abs(r))-m)>1d-10 then bugmes();quit;end
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_6745.tst b/scilab/modules/cacsd/tests/nonreg_tests/bug_6745.tst
new file mode 100644 (file)
index 0000000..7a3970a
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2010 - INRIA - Serge Steer
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- Non-regression test for bug 6745 -->
+// <-- JVM NOT MANDATORY -->
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=6745
+//
+// <-- Short Description -->
+//  g_margin() returned an erroneous result
+
+z=poly(0,'z');
+Hbo=syslin(1,(0.042-0.03933*z-0.15407*z^2+0.18518*z^3+6.939e-18*z^4)/(-0.042+0.088*z+0.114*z^2-0.36*z^3+0.2*z^4));
+[m,fr]=g_margin(Hbo);
+if abs(fr-0.5)>1d-10 then pause,end
+r=repfreq(Hbo,fr);
+if ~isreal(r,1e-10) then pause,end
+if real(r)>0 then pause,end
+if abs(20*log10(1/abs(r))-m)>1d-10 then pause,end