<?xml version='1.0'?> <?xml-stylesheet type='text/xsl' href='pmathml.xsl'?> <html xmlns='http://www.w3.org/1999/xhtml'> <head> <title>Invert an LU Factored Equation</title> <meta name="description" id="description" content="Invert an LU Factored Equation"/> <meta name="keywords" id="keywords" content=" Luinvert linear invert Lu equation "/> <style type='text/css'> body { color : black } body { background-color : white } A:link { color : blue } A:visited { color : purple } A:active { color : purple } </style> <script type='text/javascript' language='JavaScript' src='_luinvert_xml.js'> </script> </head> <body> <table><tr> <td> <a href="http://www.coin-or.org/CppAD/" target="_top"><img border="0" src="_image.gif"/></a> </td> <td><a href="lu_factor.hpp.xml" target="_top">Prev</a> </td><td><a href="luinvert.cpp.xml" target="_top">Next</a> </td><td> <select onchange='choose_across0(this)'> <option>Index-></option> <option>contents</option> <option>reference</option> <option>index</option> <option>search</option> <option>external</option> </select> </td> <td> <select onchange='choose_up0(this)'> <option>Up-></option> <option>CppAD</option> <option>library</option> <option>LuDetAndSolve</option> <option>LuInvert</option> </select> </td> <td> <select onchange='choose_down3(this)'> <option>CppAD-></option> <option>Install</option> <option>Introduction</option> <option>AD</option> <option>ADFun</option> <option>library</option> <option>Example</option> <option>configure</option> <option>Appendix</option> </select> </td> <td> <select onchange='choose_down2(this)'> <option>library-></option> <option>ErrorHandler</option> <option>NearEqual</option> <option>speed_test</option> <option>SpeedTest</option> <option>NumericType</option> <option>CheckNumericType</option> <option>SimpleVector</option> <option>CheckSimpleVector</option> <option>nan</option> <option>pow_int</option> <option>Poly</option> <option>LuDetAndSolve</option> <option>RombergOne</option> <option>RombergMul</option> <option>Runge45</option> <option>Rosen34</option> <option>OdeErrControl</option> <option>OdeGear</option> <option>OdeGearControl</option> <option>BenderQuad</option> <option>LuRatio</option> <option>std_math_unary</option> <option>CppAD_vector</option> <option>TrackNewDel</option> </select> </td> <td> <select onchange='choose_down1(this)'> <option>LuDetAndSolve-></option> <option>LuSolve</option> <option>LuFactor</option> <option>LuInvert</option> </select> </td> <td> <select onchange='choose_down0(this)'> <option>LuInvert-></option> <option>LuInvert.cpp</option> <option>lu_invert.hpp</option> </select> </td> <td> <select onchange='choose_current0(this)'> <option>Headings-></option> <option>Syntax</option> <option>Description</option> <option>Include</option> <option>Matrix Storage</option> <option>ip</option> <option>jp</option> <option>LU</option> <option>---..L</option> <option>---..U</option> <option>---..P</option> <option>---..A</option> <option>X</option> <option>Example</option> <option>Source</option> </select> </td> </tr></table><br/> <center><b><big><big>Invert an LU Factored Equation</big></big></b></center> <code><span style='white-space: nowrap'><br/> </span></code><b><big><a name="Syntax" id="Syntax">Syntax</a></big></b> <code><font color="blue"><br/> # include <cppad/lu_invert.hpp></font></code> <code><span style='white-space: nowrap'><br/> </span></code><code><font color="blue"><span style='white-space: nowrap'>LuInvert(</span></font></code><i><span style='white-space: nowrap'>ip</span></i><code><font color="blue"><span style='white-space: nowrap'>, </span></font></code><i><span style='white-space: nowrap'>jp</span></i><code><font color="blue"><span style='white-space: nowrap'>, </span></font></code><i><span style='white-space: nowrap'>LU</span></i><code><font color="blue"><span style='white-space: nowrap'>, </span></font></code><i><span style='white-space: nowrap'>X</span></i><code><font color="blue"><span style='white-space: nowrap'>)</span></font></code> <br/> <br/> <b><big><a name="Description" id="Description">Description</a></big></b> <br/> Solves the matrix equation <code><font color="blue"></font></code><i><span style='white-space: nowrap'>A</span></i><code><font color="blue"><span style='white-space: nowrap'> * </span></font></code><i><span style='white-space: nowrap'>X</span></i><code><font color="blue"><span style='white-space: nowrap'> = </span></font></code><i><span style='white-space: nowrap'>B</span></i> using an LU factorization computed by <a href="lufactor.xml" target="_top"><span style='white-space: nowrap'>LuFactor</span></a> . <br/> <br/> <b><big><a name="Include" id="Include">Include</a></big></b> <br/> The file <code><font color="blue">cppad/lu_invert.hpp</font></code> is included by <code><font color="blue">cppad/cppad.hpp</font></code> but it can also be included separately with out the rest of the <code><font color="blue">CppAD</font></code> routines. <br/> <br/> <b><big><a name="Matrix Storage" id="Matrix Storage">Matrix Storage</a></big></b> <br/> All matrices are stored in row major order. To be specific, if <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow> <mi mathvariant='italic'>Y</mi> </mrow></math> is a vector that contains a <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow> <mi mathvariant='italic'>p</mi> </mrow></math> by <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow> <mi mathvariant='italic'>q</mi> </mrow></math> matrix, the size of <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow> <mi mathvariant='italic'>Y</mi> </mrow></math> must be equal to <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow> <mi mathvariant='italic'>p</mi> <mo stretchy="false">*</mo> <mi mathvariant='italic'>q</mi> </mrow></math> and for <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow> <mi mathvariant='italic'>i</mi> <mo stretchy="false">=</mo> <mn>0</mn> <mo stretchy="false">,</mo> <mo stretchy="false">…</mo> <mo stretchy="false">,</mo> <mi mathvariant='italic'>p</mi> <mn>-1</mn> </mrow></math> , <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow> <mi mathvariant='italic'>j</mi> <mo stretchy="false">=</mo> <mn>0</mn> <mo stretchy="false">,</mo> <mo stretchy="false">…</mo> <mo stretchy="false">,</mo> <mi mathvariant='italic'>q</mi> <mn>-1</mn> </mrow></math> , <math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mrow> <msub><mi mathvariant='italic'>Y</mi> <mrow><mi mathvariant='italic'>i</mi> <mo stretchy="false">,</mo> <mi mathvariant='italic'>j</mi> </mrow> </msub> <mo stretchy="false">=</mo> <mi mathvariant='italic'>Y</mi> <mo stretchy="false">[</mo> <mi mathvariant='italic'>i</mi> <mo stretchy="false">*</mo> <mi mathvariant='italic'>q</mi> <mo stretchy="false">+</mo> <mi mathvariant='italic'>j</mi> <mo stretchy="false">]</mo> </mrow></math> <br/> <b><big><a name="ip" id="ip">ip</a></big></b> <br/> The argument <i>ip</i> has prototype <code><font color="blue"><span style='white-space: nowrap'><br/>      const </span></font></code><i><span style='white-space: nowrap'>SizeVector</span></i><code><font color="blue"><span style='white-space: nowrap'> &</span></font></code><i><span style='white-space: nowrap'>ip</span></i><code><font color="blue"><span style='white-space: nowrap'><br/> </span></font></code>(see description for <i>SizeVector</i> in <a href="lufactor.xml#SizeVector" target="_top"><span style='white-space: nowrap'>LuFactor</span></a> specifications). The size of <i>ip</i> is referred to as <i>n</i> in the specifications below. The elements of <i>ip</i> determine the order of the rows in the permuted matrix. <br/> <br/> <b><big><a name="jp" id="jp">jp</a></big></b> <br/> The argument <i>jp</i> has prototype <code><font color="blue"><span style='white-space: nowrap'><br/>      const </span></font></code><i><span style='white-space: nowrap'>SizeVector</span></i><code><font color="blue"><span style='white-space: nowrap'> &</span></font></code><i><span style='white-space: nowrap'>jp</span></i><code><font color="blue"><span style='white-space: nowrap'><br/> </span></font></code>(see description for <i>SizeVector</i> in <a href="lufactor.xml#SizeVector" target="_top"><span style='white-space: nowrap'>LuFactor</span></a> specifications). The size of <i>jp</i> must be equal to <i>n</i>. The elements of <i>jp</i> determine the order of the columns in the permuted matrix. <br/> <br/> <b><big><a name="LU" id="LU">LU</a></big></b> <br/> The argument <i>LU</i> has the prototype <code><font color="blue"><span style='white-space: nowrap'><br/>      const </span></font></code><i><span style='white-space: nowrap'>FloatVector</span></i><code><font color="blue"><span style='white-space: nowrap'> &</span></font></code><i><span style='white-space: nowrap'>LU</span></i><code><font color="blue"><span style='white-space: nowrap'><br/> </span></font></code>and the size of <i>LU</i> must equal <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow> <mi mathvariant='italic'>n</mi> <mo stretchy="false">*</mo> <mi mathvariant='italic'>n</mi> </mrow></math> (see description for <i>FloatVector</i> in <a href="lufactor.xml#FloatVector" target="_top"><span style='white-space: nowrap'>LuFactor</span></a> specifications). <br/> <br/> <b><a name="LU.L" id="LU.L">L</a></b> <br/> We define the lower triangular matrix <i>L</i> in terms of <i>LU</i>. The matrix <i>L</i> is zero above the diagonal and the rest of the elements are defined by <code><font color="blue"><span style='white-space: nowrap'><br/>      </span></font></code><i><span style='white-space: nowrap'>L</span></i><code><font color="blue"><span style='white-space: nowrap'>(</span></font></code><i><span style='white-space: nowrap'>i</span></i><code><font color="blue"><span style='white-space: nowrap'>, </span></font></code><i><span style='white-space: nowrap'>j</span></i><code><font color="blue"><span style='white-space: nowrap'>) = </span></font></code><i><span style='white-space: nowrap'>LU</span></i><code><font color="blue"><span style='white-space: nowrap'>[ </span></font></code><i><span style='white-space: nowrap'>ip</span></i><code><font color="blue"><span style='white-space: nowrap'>[</span></font></code><i><span style='white-space: nowrap'>i</span></i><code><font color="blue"><span style='white-space: nowrap'>] * </span></font></code><i><span style='white-space: nowrap'>n</span></i><code><font color="blue"><span style='white-space: nowrap'> + </span></font></code><i><span style='white-space: nowrap'>jp</span></i><code><font color="blue"><span style='white-space: nowrap'>[</span></font></code><i><span style='white-space: nowrap'>j</span></i><code><font color="blue"><span style='white-space: nowrap'>] ]<br/> </span></font></code>for <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow> <mi mathvariant='italic'>i</mi> <mo stretchy="false">=</mo> <mn>0</mn> <mo stretchy="false">,</mo> <mo stretchy="false">…</mo> <mo stretchy="false">,</mo> <mi mathvariant='italic'>n</mi> <mn>-1</mn> </mrow></math> and <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow> <mi mathvariant='italic'>j</mi> <mo stretchy="false">=</mo> <mn>0</mn> <mo stretchy="false">,</mo> <mo stretchy="false">…</mo> <mo stretchy="false">,</mo> <mi mathvariant='italic'>i</mi> </mrow></math> . <br/> <br/> <b><a name="LU.U" id="LU.U">U</a></b> <br/> We define the upper triangular matrix <i>U</i> in terms of <i>LU</i>. The matrix <i>U</i> is zero below the diagonal, one on the diagonal, and the rest of the elements are defined by <code><font color="blue"><span style='white-space: nowrap'><br/>      </span></font></code><i><span style='white-space: nowrap'>U</span></i><code><font color="blue"><span style='white-space: nowrap'>(</span></font></code><i><span style='white-space: nowrap'>i</span></i><code><font color="blue"><span style='white-space: nowrap'>, </span></font></code><i><span style='white-space: nowrap'>j</span></i><code><font color="blue"><span style='white-space: nowrap'>) = </span></font></code><i><span style='white-space: nowrap'>LU</span></i><code><font color="blue"><span style='white-space: nowrap'>[ </span></font></code><i><span style='white-space: nowrap'>ip</span></i><code><font color="blue"><span style='white-space: nowrap'>[</span></font></code><i><span style='white-space: nowrap'>i</span></i><code><font color="blue"><span style='white-space: nowrap'>] * </span></font></code><i><span style='white-space: nowrap'>n</span></i><code><font color="blue"><span style='white-space: nowrap'> + </span></font></code><i><span style='white-space: nowrap'>jp</span></i><code><font color="blue"><span style='white-space: nowrap'>[</span></font></code><i><span style='white-space: nowrap'>j</span></i><code><font color="blue"><span style='white-space: nowrap'>] ]<br/> </span></font></code>for <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow> <mi mathvariant='italic'>i</mi> <mo stretchy="false">=</mo> <mn>0</mn> <mo stretchy="false">,</mo> <mo stretchy="false">…</mo> <mo stretchy="false">,</mo> <mi mathvariant='italic'>n</mi> <mn>-2</mn> </mrow></math> and <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mrow> <mi mathvariant='italic'>j</mi> <mo stretchy="false">=</mo> <mi mathvariant='italic'>i</mi> <mo stretchy="false">+</mo> <mn>1</mn> <mo stretchy="false">,</mo> <mo stretchy="false">…</mo> <mo stretchy="false">,</mo> <mi mathvariant='italic'>n</mi> <mn>-1</mn> </mrow></math> . <br/> <br/> <b><a name="LU.P" id="LU.P">P</a></b> <br/> We define the permuted matrix <i>P</i> in terms of the matrix <i>L</i> and the matrix <i>U</i> by <code><font color="blue"></font></code><i><span style='white-space: nowrap'>P</span></i><code><font color="blue"><span style='white-space: nowrap'> = </span></font></code><i><span style='white-space: nowrap'>L</span></i><code><font color="blue"><span style='white-space: nowrap'> * </span></font></code><i><span style='white-space: nowrap'>U</span></i>. <br/> <br/> <b><a name="LU.A" id="LU.A">A</a></b> <br/> The matrix <i>A</i>, which defines the linear equations that we are solving, is given by <code><font color="blue"><span style='white-space: nowrap'><br/>      </span></font></code><i><span style='white-space: nowrap'>P</span></i><code><font color="blue"><span style='white-space: nowrap'>(</span></font></code><i><span style='white-space: nowrap'>i</span></i><code><font color="blue"><span style='white-space: nowrap'>, </span></font></code><i><span style='white-space: nowrap'>j</span></i><code><font color="blue"><span style='white-space: nowrap'>) = </span></font></code><i><span style='white-space: nowrap'>A</span></i><code><font color="blue"><span style='white-space: nowrap'>[ </span></font></code><i><span style='white-space: nowrap'>ip</span></i><code><font color="blue"><span style='white-space: nowrap'>[</span></font></code><i><span style='white-space: nowrap'>i</span></i><code><font color="blue"><span style='white-space: nowrap'>] * </span></font></code><i><span style='white-space: nowrap'>n</span></i><code><font color="blue"><span style='white-space: nowrap'> + </span></font></code><i><span style='white-space: nowrap'>jp</span></i><code><font color="blue"><span style='white-space: nowrap'>[</span></font></code><i><span style='white-space: nowrap'>j</span></i><code><font color="blue"><span style='white-space: nowrap'>] ]<br/> </span></font></code>(Hence <i>LU</i> contains a permuted factorization of the matrix <i>A</i>.) <br/> <br/> <b><big><a name="X" id="X">X</a></big></b> <br/> The argument <i>X</i> has prototype <code><font color="blue"><span style='white-space: nowrap'><br/>      </span></font></code><i><span style='white-space: nowrap'>FloatVector</span></i><code><font color="blue"><span style='white-space: nowrap'> &</span></font></code><i><span style='white-space: nowrap'>X</span></i><code><font color="blue"><span style='white-space: nowrap'><br/> </span></font></code>(see description for <i>FloatVector</i> in <a href="lufactor.xml#FloatVector" target="_top"><span style='white-space: nowrap'>LuFactor</span></a> specifications). The matrix <i>X</i> must have the same number of rows as the matrix <i>A</i>. The input value of <i>X</i> is the matrix <i>B</i> and the output value solves the matrix equation <code><font color="blue"></font></code><i><span style='white-space: nowrap'>A</span></i><code><font color="blue"><span style='white-space: nowrap'> * </span></font></code><i><span style='white-space: nowrap'>X</span></i><code><font color="blue"><span style='white-space: nowrap'> = </span></font></code><i><span style='white-space: nowrap'>B</span></i>. <br/> <br/> <b><big><a name="Example" id="Example">Example</a></big></b> <br/> The file <a href="lu_solve.hpp.xml" target="_top"><span style='white-space: nowrap'>lu_solve.hpp</span></a> is a good example usage of <code><font color="blue">LuFactor</font></code> with <code><font color="blue">LuInvert</font></code>. The file <a href="luinvert.cpp.xml" target="_top"><span style='white-space: nowrap'>LuInvert.cpp</span></a> contains an example and test of using <code><font color="blue">LuInvert</font></code> by itself. It returns true if it succeeds and false otherwise. <br/> <br/> <b><big><a name="Source" id="Source">Source</a></big></b> <br/> The file <a href="lu_invert.hpp.xml" target="_top"><span style='white-space: nowrap'>lu_invert.hpp</span></a> contains the current source code that implements these specifications. <hr/>Input File: cppad/lu_invert.hpp </body> </html>