* Bug #11980 fixed - csim returned an error message in some cases: "Submatrix 90/10390/5
Charlotte HECQUET [Fri, 1 Feb 2013 16:41:15 +0000 (17:41 +0100)]
                     incorrectly defined".

Change-Id: I8ad5e8203dc58621fc9b3fb7dda8d6e88a1e6cc0

scilab/CHANGES_5.4.X
scilab/modules/cacsd/macros/csim.sci
scilab/modules/cacsd/tests/nonreg_tests/bug_11980.tst [new file with mode: 0644]

index fc2d133..9c57246 100644 (file)
@@ -146,9 +146,6 @@ Xcos
 * Bug #12265 fixed - xcos_simulate help example diagrams were badly rendered
                      due to CLR blocks.
 
-* Bug #12266 fixed - Stopping "Papillon de lorentz" demonstration
-                     while simulation was on made CMSCOPE crash.
-
 
 Documentation
 ==============
@@ -252,6 +249,9 @@ Bug fixes
 
 * Bug #11976 fixed - Check csvTextScan 3rd parameter validity.
 
+* Bug #11980 fixed - csim returned an error message in some cases: "Submatrix
+                     incorrectly defined".
+
 * Bug #11981 fixed - Smooth french help page had a wrong declaration
                      (colonnes => lignes).
 
@@ -327,8 +327,6 @@ Bug fixes
 
 * Bug #12219 fixed - delete("all") does not recreate a basic axe within cleaned figure.
 
-* Bug #12221 fixed - fspec was not documented and there was an error message "undefined variable: Sl".
-
 * Bug #12232 fixed - There were several memleaks in various fillers.
 
 * Bug #12235 fixed - Matplot did not update on color_map change.
index 9d84063..c4b44ee 100644 (file)
 
 
 function [y,x]=csim(u,dt,sl,x0,tol)
-//Syntax:
-//  [y [,x]]=csim(u,dt,sl,[x0]) 
-// simulation of the controlled linear system sl.
-// sl is assumed to be a continuous-time system.
-// u is the control and x0 the initial state.
-//
-//u can be:
-// - a function 
-//    [inputs]=u(t)
-// - a list
-//    list(ut,parameter1,....,parametern) such that
-//    inputs=ut(t,parameter1,....,parametern)
-// - the character string 'impuls' for impulse response calculation
-//    (here sl is assumed SISO without direct feedthrough and x0=0)
-// - the character string 'step' for step response calculation 
-//    (here sl is assumed SISO without direct feedthrough and x0=0)
-//dt is a vector of instants with dt(1) = initial time
-//                   that is:           x0=x
-//                                          dt(1)
-//
-//y matrix such that:
-//  y=[y       y  ...  y     ]
-//      dt(1)   dt(2)   dt(n)
-//x matrix such that:
-//  x=[x       x  ...  x     ]
-//      dt(1)   dt(2)   dt(n)
-//
-//See also:
-// dsimul flts ltitr rtitr ode impl
-//!
+    //Syntax:
+    //  [y [,x]]=csim(u,dt,sl,[x0]) 
+    // simulation of the controlled linear system sl.
+    // sl is assumed to be a continuous-time system.
+    // u is the control and x0 the initial state.
+    //
+    //u can be:
+    // - a function 
+    //    [inputs]=u(t)
+    // - a list
+    //    list(ut,parameter1,....,parametern) such that
+    //    inputs=ut(t,parameter1,....,parametern)
+    // - the character string 'impuls' for impulse response calculation
+    //    (here sl is assumed SISO without direct feedthrough and x0=0)
+    // - the character string 'step' for step response calculation 
+    //    (here sl is assumed SISO without direct feedthrough and x0=0)
+    //dt is a vector of instants with dt(1) = initial time
+    //                   that is:           x0=x
+    //                                          dt(1)
+    //
+    //y matrix such that:
+    //  y=[y       y  ...  y     ]
+    //      dt(1)   dt(2)   dt(n)
+    //x matrix such that:
+    //  x=[x       x  ...  x     ]
+    //      dt(1)   dt(2)   dt(n)
+    //
+    //See also:
+    // dsimul flts ltitr rtitr ode impl
+    //!
 
-  [lhs,rhs]=argn(0)
-  //
-  if rhs<3 then error(39),end
-  sltyp=typeof(sl)
-  if and(sltyp<>['state-space' 'rational']) then 
-    error(msprintf(_("%s: Wrong type for input argument #%d: %s data structure expected.\n"),"csim",3,"syslin"))
-  end
-  if sltyp=='rational' then sl=tf2ss(sl),end
-  if sl.dt<>'c' then 
-    warning(msprintf(gettext("%s: Input argument %d is assumed continuous time.\n"),"csim",1));
-  end
-  //
-  [a,b,c,d]=sl(2:5);
-  if type(d)==2&degree(d)>0 then 
-    d=coeff(d,0);
-    warning(msprintf(gettext("%s: Direct feedthrough set to its zero degree coefficient.\n"),"csim"));
-  end
-  [ma,mb]=size(b);
-  //
-  imp=0;step=0
-  text='if t==0 then y=0, else y=1,end'
-  //
-  select type(u)
-  case 10 then //input given by its type (step or impuls)
-    if mb<>1 then error(95,1);end;
-    if part(u,1)=='i' then
-      //impuse response
-      imp=1;
-      if norm(d,1)<>0 then
-       warning(msprintf(gettext("%s: Direct feedthrough set to zero.\n"),"csim"));
-       d=0*d;
-      end;
-    elseif part(u,1)=='s' then
-      step=1
-      if norm(d,1)<>0 then
-       warning(msprintf(gettext("%s: Direct feedthrough set to zero.\n"),"csim"));
-       d=0*d;
-      end;
-    else
-      error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"),"csim",1,"""step"",""impuls"""))
-    end;
-    deff('[y]=u(t)',text);
-  case 11 then //input given by a function of time
-    comp(u)
-  case 13 then //input given by a function of time
-  case 1 then //input given by a vector of data
-    [mbu,ntu]=size(u);
-    if mbu<>mb | ntu<>size(dt,'*') then 
-      error(msprintf(gettext("%s: Incompatible input arguments #%d and #%d: Same column dimensions expected.\n"),"csim",1,2))
+    [lhs,rhs]=argn(0)
+    //
+    if rhs<3 then error(39),end
+    sltyp=typeof(sl)
+    if and(sltyp<>['state-space' 'rational']) then 
+        error(msprintf(_("%s: Wrong type for input argument #%d: %s data structure expected.\n"),"csim",3,"syslin"))
+    end
+    if sltyp=='rational' then sl=tf2ss(sl),end
+    if sl.dt<>'c' then 
+        warning(msprintf(gettext("%s: Input argument %d is assumed continuous time.\n"),"csim",1));
     end
-  case 15 then  //input given by a list: function of time with parameters
-    uu=u(1),
-    if type(uu)==11 then 
-      comp(uu),
-      u(1)=uu,
+    //
+    [a,b,c,d]=sl(2:5);
+    if type(d)==2&degree(d)>0 then 
+        d=coeff(d,0);
+        warning(msprintf(gettext("%s: Direct feedthrough set to its zero degree coefficient.\n"),"csim"));
     end
-  else error(44,2)
-  end;
-  //
-  if rhs==3 then x0=sl(6),end
-  if imp==1|step==1 then x0=0*x0,end
-  nt=size(dt,'*');x=0*ones(ma,nt)
+    [ma,mb]=size(b);
+    //
+    imp=0;step=0
+    text='if t==0 then y=0, else y=1,end'
+    //
+    select type(u)
+    case 10 then //input given by its type (step or impuls)
+        if mb<>1 then error(95,1);end;
+        if part(u,1)=='i' then
+            //impuse response
+            imp=1;
+            if norm(d,1)<>0 then
+                warning(msprintf(gettext("%s: Direct feedthrough set to zero.\n"),"csim"));
+                d=0*d;
+            end;
+        elseif part(u,1)=='s' then
+            step=1
+            if norm(d,1)<>0 then
+                warning(msprintf(gettext("%s: Direct feedthrough set to zero.\n"),"csim"));
+                d=0*d;
+            end;
+        else
+            error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"),"csim",1,"""step"",""impuls"""))
+        end;
+        deff('[y]=u(t)',text);
+    case 11 then //input given by a function of time
+        comp(u)
+    case 13 then //input given by a function of time
+    case 1 then //input given by a vector of data
+        [mbu,ntu]=size(u);
+        if mbu<>mb | ntu<>size(dt,'*') then 
+            error(msprintf(gettext("%s: Incompatible input arguments #%d and #%d: Same column dimensions expected.\n"),"csim",1,2))
+        end
+    case 15 then  //input given by a list: function of time with parameters
+        uu=u(1),
+        if type(uu)==11 then 
+            comp(uu),
+            u(1)=uu,
+        end
+    else error(44,2)
+    end;
+    //
+    if rhs==3 then x0=sl(6),end
+    if imp==1|step==1 then x0=0*x0,end
+    nt=size(dt,'*');x=0*ones(ma,nt);
+    [a,v]=balanc(a);
+    v1=v;//save for backward transformation
+
+    //apply transformation u without matrix inversion
+    [k,l]=find(v<>0) //get the permutation
+
+    //apply right transformation 
+    v=v(k,l);//diagonal matrix
+    c=c(:,k)*v; 
+    //apply left transformation 
+    v=diag(1 ./diag(v));b=v*b(k,:);x0=v*x0(k)
+
+    [a,v2,bs]=bdiag(a,1);b=v2\b;c=c*v2;x0=v2\x0;
+    //form the differential equation function
+    if type(u)==1 then
+        //form a continuous time interpolation of the given data
+        ut=u;
+        if min(size(ut))==1 then ut=matrix(ut,1,-1),end
+        deff('[y]=u(t)',['ind=find(dt<=t);nn=ind($)'
+        'if (t==dt(nn)|nn==nt) then '
+        '   y=ut(:,nn)'
+        'else '
+        '   y=ut(:,nn)+(t-dt(nn))/(dt(nn+1)-dt(nn))*(ut(:,nn+1)-ut(:,nn))'
+        'end']);
+        deff('[ydot]=%sim2(%tt,%y)','ydot=ak*%y+bk*u(%tt)');
+    elseif type(u)<>15 then
+        deff('[ydot]=%sim2(%tt,%y)','ydot=ak*%y+bk*u(%tt)');
+        ut=ones(mb,nt);for k=1:nt, ut(:,k)=u(dt(k)),end
+    else
+        %sim2=u
+        tx=' ';for l=2:size(u), tx=tx+',%'+string(l-1);end;
+        deff('[ydot]=sk(%tt,%y,u'+tx+')','ydot=ak*%y+bk*u(%tt'+tx+')');
+        %sim2(0)=sk;u=u(1)
+        deff('[ut]=uu(t)',...
+        ['['+part(tx,3:length(tx))+']=%sim2(3:'+string(size(%sim2))+')';
+        'ut=ones(mb,nt);for k=1:nt, ut(:,k)=u(t(k)'+tx+'),end'])
+        ut=uu(dt);
+    end;
 
-  [a,v]=balanc(a);
-  v1=v;//save for backward transformation
-  
-  //apply transformation u without matrix inversion
-  [k,l]=find(v<>0) //get the permutation
-  
-  //apply right transformation 
-  v=v(k,l);//diagonal matrix
-  c=c(:,k)*v; 
-  //apply left transformation 
-  v=diag(1 ./diag(v));b=v*b(k,:);x0=v*x0(k)
-  
-  [a,v2,bs]=bdiag(a,1);b=v2\b;c=c*v2;x0=v2\x0;
-  //form the differential equation function
-  if type(u)==1 then
-    //form a continuuous time interpolation of the given data
-    ut=u;
-    if min(size(ut))==1 then ut=matrix(ut,1,-1),end
-    deff('[y]=u(t)',['ind=find(dt<=t);nn=ind($)'
-                    'if (t==dt(nn)|nn==nt) then '
-                    '   y=ut(:,nn)'
-                    'else '
-                    '   y=ut(:,nn)+(t-dt(nn))/(dt(nn+1)-dt(nn))*(ut(:,nn+1)-ut(:,nn))'
-                    'end']);
-    deff('[ydot]=%sim2(%tt,%y)','ydot=ak*%y+bk*u(%tt)');
-  elseif type(u)<>15 then
-    deff('[ydot]=%sim2(%tt,%y)','ydot=ak*%y+bk*u(%tt)');
-    ut=ones(mb,nt);for k=1:nt, ut(:,k)=u(dt(k)),end
-  else
-    %sim2=u
-    tx=' ';for l=2:size(u), tx=tx+',%'+string(l-1);end;
-    deff('[ydot]=sk(%tt,%y,u'+tx+')','ydot=ak*%y+bk*u(%tt'+tx+')');
-    %sim2(0)=sk;u=u(1)
-    deff('[ut]=uu(t)',...
-        ['['+part(tx,3:length(tx))+']=%sim2(3:'+string(size(%sim2))+')';
-         'ut=ones(mb,nt);for k=1:nt, ut(:,k)=u(t(k)'+tx+'),end'])
-    ut=uu(dt);
-  end;
-  
-  //simulation
-  k=1;
-  for n=bs',
-    kk=k:k+n-1
-    ak=a(kk,kk)
-    bk=b(kk,:)
-    nrmu=max([norm(bk*ut,1),norm(x0(kk))])
-    if nrmu > 0 then
-      if rhs<5 then
-       atol=1.d-12*nrmu;rtol=atol/100
-      else
-       atol=tol(1);rtol=tol(2)
-      end
-      x(kk,:)=ode('adams',x0(kk),dt(1),dt,rtol,atol,%sim2)
-      if imp==1 then x(kk,:)=ak*x(kk,:)+bk*ut,end
+    //simulation
+    k=1;
+    for n=bs', 
+        kk=k:k+n-1;
+        ak=a(kk,kk);
+        bk=b(kk,:);
+        nrmu=max([norm(bk*ut,1),norm(x0(kk))]);
+        if nrmu > 0 then
+            if rhs<5 then
+                atol=1.d-12*nrmu;rtol=atol/100;
+            else
+                atol=tol(1);rtol=tol(2);
+            end
+            xkk=ode('adams',x0(kk),dt(1),dt,rtol,atol,%sim2);
+            if size(xkk,2)<>size(x,2) then
+                error(msprintf(_("%s: Simulation failed before final time is reached.\n"),"csim"))
+            end
+            x(kk,:)=xkk;
+            if imp==1 then x(kk,:)=ak*x(kk,:)+bk*ut,end
+        end;
+        k=k+n
     end;
-    k=k+n
-  end;
-  if imp==0&step==0 then y=c*x+d*ut,else y=c*x,end
-  if lhs==2 then x=v1*v2*x,end
+    if imp==0 & step==0 then y=c*x+d*ut, else y=c*x,end
+    if lhs==2 then x=v1*v2*x,end
 endfunction
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_11980.tst b/scilab/modules/cacsd/tests/nonreg_tests/bug_11980.tst
new file mode 100644 (file)
index 0000000..bcd48c1
--- /dev/null
@@ -0,0 +1,32 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// English imposed for warnings
+// <-- ENGLISH IMPOSED -->
+//
+// Ref not checked because of many lsode outputs which are different according to platform (x86/x64).
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 11980 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=11980
+//
+// <-- Short Description -->
+// Submatrix incorrectly defined.
+// at line     148 of function csim called by :  
+// y=csim('step',t,numerador/denominador).
+
+s=poly(0,'s'); funcprot(0);
+kp=96.770532;
+ki=42.568724;
+kd=18.711118;
+numerador=s^5*kd+s^4*(60*kd+kp)+s^3*(1500*kd-60*kp+ki)+s^2*(-15000*kd+1500*kp-60*ki)+s*(-15000*kp+1500*ki)-15000*ki;
+denominador=s^5*(kd)+s^4*(-1-60*kd+kp)+s^3*(-1500-60+1500*kd-60*kp+ki)+s^2*(-15000-1500-15000*kd+1500*kp-60*ki)+s*(-15000-15000*kp+1500*ki)-15000*ki;
+t=0:0.01:100;
+errMsg = msprintf(_("%s: Simulation failed before final time is reached.\n"),"csim");
+assert_checkerror("csim(""step"",t,numerador/denominador);", errMsg);