* Bug #12184 fixed - Performances of the function 'derivat' improved. 86/10086/3
Alain Lamy [Wed, 26 Dec 2012 08:57:44 +0000 (09:57 +0100)]
Change-Id: I6c3e6c25e03f2e639acc780666b0a7cea4f31296

scilab/CHANGES_5.4.X
scilab/modules/polynomials/macros/derivat.sci

index c399909..5b53721 100644 (file)
@@ -212,7 +212,9 @@ Bug fixes
 
 * Bug #12179 fixed - Fix an incompatibility with MPI version of HDF5.
 
-* Bug #12190 fixed - Update the description of sprspn.
+* Bug #12184 fixed - Performances of the function 'derivat' improved.
+
+* Bug #12190 fixed - Description of sprspn updated in help page.
 
 
                     Changes between version 5.3.3 and 5.4.0
index 33f6a08..cda1d2a 100644 (file)
@@ -7,38 +7,57 @@
 // are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 
-
-function p=derivat(p)
+function [p] = derivat(p)
 //pd=derivat(p)  computes the derivative of the polynomial or rational
 //function marix relative to the dummy variable
-//!
+//
+
   select typeof(p)
-  case "constant" then 
-    p=0*p
+
+  case "constant" then
+    p = 0*p; // includes case p == []
+
   case "polynomial" then
-    [m,n]=size(p);var=varn(p);
-    for i=1:m
-      for j=1:n
-       pij=p(i,j);nij=degree(pij);
-       if nij==0 then
-         p(i,j)=0;
-       else
-         pij=coeff(pij).*(0:nij);
-         p(i,j)=poly(pij(2:nij+1),var,'c');
-       end
+    var = varn(p); // dummy variable
+    [m,n]=size(p);
+    deg = degree(p);
+    degmax = max(deg);
+
+    if (degmax < n*m)
+      x = poly(0, var);
+      pd = zeros(p) * x;
+      for i = 1:degmax
+        pd = pd + coeff(p,i) * i * x^(i-1);
       end
-    end
-  case "rational" then
-    num=p.num;den=p.den
-    [m,n]=size(num)
-    for i=1:m
+      p = pd;
+    else
+      for i=1:m
       for j=1:n
-       num(i,j)=derivat(num(i,j))*den(i,j)-num(i,j)*derivat(den(i,j));
-       den(i,j)=den(i,j)**2;
+             pij=p(i,j);
+        nij=deg(i,j);
+             if (nij==0) then
+               p(i,j)=0;
+             else
+               pij=coeff(pij).*(0:nij);
+               p(i,j)=poly(pij(2:nij+1),var,'c');
+             end
+      end
       end
     end
-    p.num=num;p.den=den;
+
+  case "rational" then
+    num = p.num;
+    den = p.den;
+
+    num = derivat(num) .* den - num .* derivat(den);
+    den = den.^2;
+
+    p.num = num;
+    p.den = den;
+
   else
     error(msprintf(gettext("%s: Wrong type for input argument #%d: A floating point number or polynomial or rational fraction array expected.\n"),"derivat",1))
+
   end
+
 endfunction