* Bug #8058 fixed - intc() only worked with default tolerances 08/12508/3
Paul BIGNIER [Thu, 12 Sep 2013 08:17:26 +0000 (10:17 +0200)]
Let the user set the tolerance and return the estimated error.

Change-Id: I8fa5e0faa0a4cb15eb9ef9e30834935897114c59

17 files changed:
SEP/INDEX
SEP/SEP_106_intc_error_control.odt [new file with mode: 0644]
scilab/CHANGES_5.5.X
scilab/modules/differential_equations/help/en_US/intc.xml
scilab/modules/differential_equations/help/en_US/intg.xml
scilab/modules/differential_equations/help/fr_FR/intc.xml [new file with mode: 0644]
scilab/modules/differential_equations/macros/intc.sci
scilab/modules/differential_equations/tests/unit_tests/intc.dia.ref [new file with mode: 0644]
scilab/modules/differential_equations/tests/unit_tests/intc.tst [new file with mode: 0644]
scilab/modules/helptools/etc/images_md5.txt
scilab/modules/helptools/images/ScilabCaution.png
scilab/modules/helptools/images/ScilabEdit.png
scilab/modules/helptools/images/ScilabExecute.png
scilab/modules/helptools/images/ScilabImportant.png
scilab/modules/helptools/images/ScilabNote.png
scilab/modules/helptools/images/ScilabTip.png
scilab/modules/helptools/images/ScilabWarning.png

index 0b62131..72bac39 100644 (file)
--- a/SEP/INDEX
+++ b/SEP/INDEX
@@ -101,3 +101,4 @@ SEP #102: members function.
 SEP #103: Localization : allow multiple domains and add addlocalizationdomain function.
 SEP #104: New optional output argument for routh_t (num)
 SEP #105: Three new optional output arguments to optim().
+SEP #106: Error control in function intc.
diff --git a/SEP/SEP_106_intc_error_control.odt b/SEP/SEP_106_intc_error_control.odt
new file mode 100644 (file)
index 0000000..775c0fa
Binary files /dev/null and b/SEP/SEP_106_intc_error_control.odt differ
index ff280e9..112b35d 100644 (file)
@@ -320,6 +320,8 @@ Bug Fixes
 
 * Bug #7960 fixed - plzr could not produce pole zero plot for a simple transfer function.
 
+* Bug #8058 fixed - The user can now set the tolerances of intc function.
+
 * Bug #8098 fixed - cumsum could not be applied to rational matrices.
 
 * Bug #8162 fixed - Area of stability of plzr was wrong for continuous systems (+unit test added).
index 8960d30..ecd3bcb 100644 (file)
@@ -2,11 +2,12 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA - Farid BELAHCENE
- * 
+ * Copyright (C) 2013 - Scilab Enterprises - Paul Bignier: added error control
+ *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
- * are also available at    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
  *
  -->
@@ -17,7 +18,7 @@
     </refnamediv>
     <refsynopsisdiv>
         <title>Calling Sequence</title>
-        <synopsis>[y]=intc(a,b,f)</synopsis>
+        <synopsis>[y  [,err]] = intc(a, b, f [,abserr [,relerr]])</synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Arguments</title>
@@ -25,7 +26,7 @@
             <varlistentry>
                 <term>a, b</term>
                 <listitem>
-                    <para>two complex numbers</para>
+                    <para>two complex scalars</para>
                 </listitem>
             </varlistentry>
             <varlistentry>
                     <para>"external" function</para>
                 </listitem>
             </varlistentry>
+            <varlistentry>
+                <term>abserr, rerr</term>
+                <listitem>
+                    <para>real scalars, absolute and relative errors.
+                        Default values: <literal>1.d-14</literal> and <literal>1d-8</literal>.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>err</term>
+                <listitem>
+                    <para>real number, estimated absolute error on the result.</para>
+                </listitem>
+            </varlistentry>
         </variablelist>
     </refsection>
     <refsection>
         <title>Description</title>
         <para>
-            If <literal>f</literal> is  a complex-valued function, <literal> intc(a,b,f) </literal>
-            computes the integral from <literal>a</literal> to <literal>b</literal> of <literal>f(z)dz</literal> along the  
-            straight line <literal>a b</literal> of the complex plane.
+            If <literal>f</literal> is a complex-valued function, <literal>intc(a, b, f)</literal>
+            computes the integral from <literal>a</literal> to <literal>b</literal> of <literal>f(z)dz</literal> along the
+            straight line <literal>[a b]</literal> of the complex plane.
         </para>
     </refsection>
     <refsection>
         <title>Examples</title>
-        <programlisting role="example"><![CDATA[ 
-function y=f(z)
-  y = z^(3 + %pi * %i)
+        <programlisting role="example"><![CDATA[
+function y = f(z)
+  y = z^(3 + %pi * %i);
 endfunction
 
 intc(1+%i, 4-%i, f)
+
+[r, err] = intc(1+%i, 4-%i, f, 1d-10, 1d-6)
  ]]></programlisting>
     </refsection>
-    
     <refsection role="see also">
         <title>See Also</title>
         <simplelist type="inline">
@@ -66,4 +82,13 @@ intc(1+%i, 4-%i, f)
             </member>
         </simplelist>
     </refsection>
+    <refsection>
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.0</revnumber>
+                <revremark>Absolute and relative (input) and absolute (output) errors management added.</revremark>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 99febe2..b18d078 100644 (file)
@@ -3,11 +3,11 @@
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA
  * ...
- * 
+ *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
- * are also available at    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
  *
  -->
@@ -18,7 +18,7 @@
     </refnamediv>
     <refsynopsisdiv>
         <title>Calling Sequence</title>
-        <synopsis>[v,err [,ierr]]=intg(a,b,f [,ea [,er])</synopsis>
+        <synopsis>[v, err [,ierr]]=intg(a, b, f [,ea [,er]])</synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Arguments</title>
     </refsection>
     <refsection>
         <title>Examples</title>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 // Function written in the Scilab language
 function y=f(x),y=x*sin(30*x)/sqrt(1-((x/(2*%pi))^2)),endfunction
 exact=-2.5432596188;
diff --git a/scilab/modules/differential_equations/help/fr_FR/intc.xml b/scilab/modules/differential_equations/help/fr_FR/intc.xml
new file mode 100644 (file)
index 0000000..16d9a5e
--- /dev/null
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2008 - INRIA - Farid BELAHCENE
+ * Copyright (C) 2013 - Scilab Enterprises - Paul Bignier: ajout du contrôle d'erreur
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+ *
+ -->
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="en" xml:id="intc">
+    <refnamediv>
+        <refname>intc</refname>
+        <refpurpose>intégrale de Cauchy</refpurpose>
+    </refnamediv>
+    <refsynopsisdiv>
+        <title>Séquence d'appel</title>
+        <synopsis>[y [,err]] = intc(a, b, f [,abserr [,relerr]])</synopsis>
+    </refsynopsisdiv>
+    <refsection>
+        <title>Paramètres</title>
+        <variablelist>
+            <varlistentry>
+                <term>a, b</term>
+                <listitem>
+                    <para>scalaires complexes</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>f</term>
+                <listitem>
+                    <para>fonction "externe"</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>abserr, rerr</term>
+                <listitem>
+                    <para>scalaires réels, erreurs absolue et relative recherchées.
+                        Valeurs par défaut: <literal>1.d-14</literal> et <literal>1d-8</literal>.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>err</term>
+                <listitem>
+                    <para>scalaire réel, erreur absolue estimée sur le résultat.</para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </refsection>
+    <refsection>
+        <title>Description</title>
+        <para>
+            Si <literal>f</literal> est une fonction complexe, <literal>intc(a, b, f)</literal>
+            calcule l'intérgale de <literal>a</literal> à <literal>b</literal> de <literal>f(z)dz</literal> le long
+            du segment <literal>[a b]</literal> du plan complexe.
+        </para>
+    </refsection>
+    <refsection>
+        <title>Exemples</title>
+        <programlisting role="example"><![CDATA[
+function y = f(z)
+  y = z^(3 + %pi * %i)
+endfunction
+
+intc(1+%i, 4-%i, f)
+
+[r, err] = intc(1+%i, 4-%i, f, 1d-10, 1d-6)
+ ]]></programlisting>
+    </refsection>
+    <refsection role="see also">
+        <title>See Also</title>
+        <simplelist type="inline">
+            <member>
+                <link linkend="intg">intg</link>
+            </member>
+            <member>
+                <link linkend="intl">intl</link>
+            </member>
+        </simplelist>
+    </refsection>
+    <refsection>
+        <title>Historique</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.0</revnumber>
+                <revremark>Ajout des erreurs absolue et relative (entrée) et absolue (sortie).</revremark>
+            </revision>
+        </revhistory>
+    </refsection>
+</refentry>
index 4c30995..1c83924 100644 (file)
@@ -1,5 +1,6 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA - Farid BELAHCENE
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier: added argument checking and error control
 //
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
@@ -7,19 +8,62 @@
 // are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 
-function r=intc(a,b,f)
-    //If f is a complex-valued macro,intc(a,b,f) computes
-    //the integral from a to b of f(z)dz along the straight
-    //line a-b of the complex plane.
+function [r, err] = intc(a, b, f, abserr, relerr)
+    // If f is a complex-valued macro, intc(a, b, f) computes
+    // the integral from a to b of f(z)dz along the straight
+    // line a-b of the complex plane.
+    // abserr: absolute error required. Default: 1d-14.
+    // relerr: relative error required. Default: 1d-8.
+    // err : estimated absolute error on the result.
 
-    //First compile f if necessary:
-    if type(f)==11 then
+    [lhs, rhs] = argn();
+
+    if rhs < 3 then
+        error(msprintf(_("%s: Wrong number of input argument(s): at least %d expected.\n"), "intc", 3));
+    end
+
+    if rhs == 3 then
+        abserr = 1d-14;
+        relerr = 1d-8;
+    elseif rhs == 4 then
+        if type(abserr) <> 1 then
+            error(msprintf(_("%s: Wrong type for input argument #%d: Real expected.\n"), "intc", 4));
+        end
+        if ~isscalar(abserr) then
+            error(msprintf(_("%s: Wrong size for input argument #%d: (%d,%d) expected.\n"), "intc", 4, 1, 1));
+        end
+        relerr = 1d-8;
+    else
+        if type(abserr) <> 1 then
+            error(msprintf(_("%s: Wrong type for input argument #%d: Real expected.\n"), "intc", 4));
+        end
+        if ~isscalar(abserr) then
+            error(msprintf(_("%s: Wrong size for input argument #%d: (%d,%d) expected.\n"), "intc", 4, 1, 1));
+        end
+        if type(relerr) <> 1 then
+            error(msprintf(_("%s: Wrong type for input argument #%d: Real expected.\n"), "intc", 5));
+        end
+        if ~isscalar(relerr) then
+            error(msprintf(_("%s: Wrong size for input argument #%d: (%d,%d) expected.\n"), "intc", 5, 1, 1));
+        end
+    end
+
+    if and(type(f) <> [11 13 130]) then
+        error(msprintf(_("%s: Wrong type for input argument #%d: Scilab function expected.\n"), "intc", 3));
+    end
+
+    // Compile f if necessary:
+    if type(f) == 11 then
         comp(f);
     end
-    //Define two functions which define the real part and
-    //imaginary part of f(g(t))*g'(t) where g(t) is a
-    //parametrization of the line a-b.
-    deff("<r>=real1(t,a,b,f)","r=real(f((1-t)*a+t*b)*(b-a))")
-    deff("<r>=imag1(t,a,b,f)","r=imag(f((1-t)*a+t*b)*(b-a))")
-    r=intg(0,1,list(real1,a,b,f))+%i*intg(0,1,list(imag1,a,b,f))
+    // Define two functions which define the real part and
+    // imaginary part of f(g(t))*g'(t) where g(t) is a
+    // parametrization of the line a-b.
+    deff("<r> = real1(t, a, b, f)", "r = real(f((1-t)*a+t*b)*(b-a));")
+    deff("<r> = imag1(t, a, b, f)", "r = imag(f((1-t)*a+t*b)*(b-a));")
+    [r1, err1] = intg(0, 1, list(real1, a, b, f), abserr, relerr);
+    [r2, err2] = intg(0, 1, list(imag1, a, b, f), abserr, relerr);
+    r = r1 + %i*r2;
+    err = err1 + %i*err2;
+
 endfunction
diff --git a/scilab/modules/differential_equations/tests/unit_tests/intc.dia.ref b/scilab/modules/differential_equations/tests/unit_tests/intc.dia.ref
new file mode 100644 (file)
index 0000000..7bc7d30
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// Function written in the Scilab language
+function y = f(z)
+    y = z^(3 + %pi * %i);
+endfunction
+expectedI = -115.71602 + 40.575931*%i;
+I = intc(1+%i, 4-%i, f);
+assert_checkalmostequal(I, expectedI, [], 1e-5);
+abstol = 1d-10;
+reltol = 1d-6;
+expectedErr = 3.187D-12 + 8.741D-11*%i;
+[I, err] = intc(1+%i, 4-%i, f, abstol, reltol);
+assert_checkalmostequal(I, expectedI, [], 1e-5);
+assert_checkalmostequal(err, expectedErr, [], 1e-5);
diff --git a/scilab/modules/differential_equations/tests/unit_tests/intc.tst b/scilab/modules/differential_equations/tests/unit_tests/intc.tst
new file mode 100644 (file)
index 0000000..5691340
--- /dev/null
@@ -0,0 +1,25 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+
+// Function written in the Scilab language
+function y = f(z)
+    y = z^(3 + %pi * %i);
+endfunction
+expectedI = -115.71602 + 40.575931*%i;
+
+I = intc(1+%i, 4-%i, f);
+assert_checkalmostequal(I, expectedI, [], 1e-5);
+
+abstol = 1d-10;
+reltol = 1d-6;
+expectedErr = 3.187D-12 + 8.741D-11*%i;
+
+[I, err] = intc(1+%i, 4-%i, f, abstol, reltol);
+assert_checkalmostequal(I, expectedI, [], 1e-5);
+assert_checkalmostequal(err, expectedErr, [], 1e-5);
index c68659c..e208955 100644 (file)
@@ -708,7 +708,7 @@ csim_2.png=26554bbec6828a1f5ac20cbb509d38d4
 csim_3.png=c1b39c2350976c73e2b641855d55ddba
 csim_4.png=2795df06343733566b9081791d821f28
 csim_5.png=ac09bcd32af2fb43ae1028732ebbc1b7
-dae_1.png=f2902f78357a77a69afa81370a7fae7b
+dae_1.png=354c9c3bd2dd2364c41faa6521e4f8dc
 dae_2.png=27ba222bd0de354067def52e330cfbad
 damp_en_US_1.png=e81873a345f84e42ce2c4f4779d3421d
 damp_fr_FR_1.png=e81873a345f84e42ce2c4f4779d3421d
index a9e4ff3..8edb56e 100644 (file)
Binary files a/scilab/modules/helptools/images/ScilabCaution.png and b/scilab/modules/helptools/images/ScilabCaution.png differ
index 188e1c1..e139988 100644 (file)
Binary files a/scilab/modules/helptools/images/ScilabEdit.png and b/scilab/modules/helptools/images/ScilabEdit.png differ
index a7de0fe..b083271 100644 (file)
Binary files a/scilab/modules/helptools/images/ScilabExecute.png and b/scilab/modules/helptools/images/ScilabExecute.png differ
index 81e9ed2..3a80744 100644 (file)
Binary files a/scilab/modules/helptools/images/ScilabImportant.png and b/scilab/modules/helptools/images/ScilabImportant.png differ
index 8851b99..ed46c3e 100644 (file)
Binary files a/scilab/modules/helptools/images/ScilabNote.png and b/scilab/modules/helptools/images/ScilabNote.png differ
index 8851b99..ed46c3e 100644 (file)
Binary files a/scilab/modules/helptools/images/ScilabTip.png and b/scilab/modules/helptools/images/ScilabTip.png differ
index a9e4ff3..8edb56e 100644 (file)
Binary files a/scilab/modules/helptools/images/ScilabWarning.png and b/scilab/modules/helptools/images/ScilabWarning.png differ