Math.NET Numerics
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

255 lines
16 KiB

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>Linear Equation Systems
</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="description" content="Math.NET Numerics, providing methods and algorithms for numerical computations in science, engineering and every day use. .Net 4, .Net 3.5, SL5, Win8, WP8, PCL 47 and 136, Mono, Xamarin Android/iOS."/>
<meta name="author" content="Christoph Ruegg, Marcus Cuda, Jurgen Van Gael"/>
<script src="https://code.jquery.com/jquery-1.8.0.js"></script>
<script src="https://code.jquery.com/ui/1.8.23/jquery-ui.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet"/>
<link type="text/css" rel="stylesheet" href="https://numerics.mathdotnet.com/content/style.css" />
<style>
#main table:not(.pre) {
border: 1px solid #dddddd;
max-width: 100%;
border-style: solid;
border-width: 1px;
border-color: gray;
border-collapse: collapse;
border-right-width: 1px;
border-bottom-width: 1px;
margin-top: 15px;
margin-bottom: 25px;
}
#main table:not(.pre) th, #main table:not(.pre) td {
border: 1px solid #dddddd;
padding: 6px;
}
#main table:not(.pre) th p, #main table:not(.pre) td p {
margin-bottom: 5px;
}
</style>
<script type="text/javascript" src="https://numerics.mathdotnet.com/content/tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
</head>
<body>
<div class="container">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li><a href="https://www.mathdotnet.com">Math.NET Project</a></li>
<li><a href="https://numerics.mathdotnet.com">Math.NET Numerics</a></li>
<li><a href="https://github.com/mathnet/mathnet-numerics">GitHub</a></li>
</ul>
<h3 class="muted">Math.NET Numerics</h3>
</div>
<hr />
<div class="row">
<div class="span9" id="main">
<h1><a name="Linear-Equation-Systems" class="anchor" href="#Linear-Equation-Systems">Linear Equation Systems</a></h1>
<p>A system of linear equations is a collection of linear equations involving the same set of variables:</p>
<p><span class="math">\[\begin{alignat}{7}
3x &amp;\; + \;&amp; 2y &amp;\; - \;&amp; z &amp;\; = \;&amp; 1 &amp; \\
2x &amp;\; - \;&amp; 2y &amp;\; + \;&amp; 4z &amp;\; = \;&amp; -2 &amp; \\
-x &amp;\; + \;&amp; \tfrac{1}{2} y &amp;\; - \;&amp; z &amp;\; = \;&amp; 0 &amp;
\end{alignat}\]</span></p>
<p>More generally, we can write</p>
<p><span class="math">\[\begin{alignat}{7}
a_{11} x_1 &amp;&amp;\; + \;&amp;&amp; a_{12} x_2 &amp;&amp;\; + \cdots + \;&amp;&amp; a_{1n} x_n &amp;&amp;\; = \;&amp;&amp;&amp; b_1 \\
a_{21} x_1 &amp;&amp;\; + \;&amp;&amp; a_{22} x_2 &amp;&amp;\; + \cdots + \;&amp;&amp; a_{2n} x_n &amp;&amp;\; = \;&amp;&amp;&amp; b_2 \\
\vdots\;\;\; &amp;&amp; &amp;&amp; \vdots\;\;\; &amp;&amp; &amp;&amp; \vdots\;\;\; &amp;&amp; &amp;&amp;&amp; \;\vdots \\
a_{m1} x_1 &amp;&amp;\; + \;&amp;&amp; a_{m2} x_2 &amp;&amp;\; + \cdots + \;&amp;&amp; a_{mn} x_n &amp;&amp;\; = \;&amp;&amp;&amp; b_m \\
\end{alignat}\]</span></p>
<p>where we all parameters <span class="math">\(a_{ij}\)</span> and <span class="math">\(b_i\)</span> are known and we would like to find <span class="math">\(x_j\)</span> that satisfy
all these equations. If we have the same number <span class="math">\(n\)</span> of unknown variables <span class="math">\(x_j\)</span> as number of
equations <span class="math">\(m\)</span>, and all these equations are independent, then there is a unique solution.</p>
<p>This is a fundamental problem in the domain of linear algebra, and we can use its power to find the solution.
Accordingly we can write the equivalent problem with matrices and vectors:</p>
<p><span class="math">\[\mathbf{A}=
\begin{bmatrix}
a_{11} &amp; a_{12} &amp; \cdots &amp; a_{1n} \\
a_{21} &amp; a_{22} &amp; \cdots &amp; a_{2n} \\
\vdots &amp; \vdots &amp; \ddots &amp; \vdots \\
a_{m1} &amp; a_{m2} &amp; \cdots &amp; a_{mn}
\end{bmatrix},\quad
\mathbf{x}=\begin{bmatrix}x_1\\x_2\\ \vdots \\x_n\end{bmatrix},\quad
\mathbf{b}=\begin{bmatrix}b_1\\b_2\\ \vdots \\b_m\end{bmatrix}\]</span></p>
<p>such that</p>
<p><span class="math">\[\mathbf{A}\mathbf{x}=\mathbf{b}\]</span></p>
<p>The initial example system would then look like this:</p>
<p><span class="math">\[\begin{bmatrix}3 &amp; 2 &amp; -1 \\2 &amp; -2 &amp; 4 \\-1 &amp; \tfrac{1}{2} &amp; -1\end{bmatrix}
\begin{bmatrix}x\\y\\z\end{bmatrix}
\;=\;
\begin{bmatrix}1\\-2\\0\end{bmatrix}\]</span></p>
<p>Which we can solve explicitly with the LU-decomposition, or simply by using the Solve method:</p>
<table class="pre"><tr><td class="lines"><pre class="fssnip"><span class="l">1: </span>
<span class="l">2: </span>
<span class="l">3: </span>
<span class="l">4: </span>
<span class="l">5: </span>
<span class="l">6: </span>
<span class="l">7: </span>
</pre></td>
<td class="snippet"><pre class="fssnip highlighted"><code lang="csharp"><span class="k">var</span> A <span class="o">=</span> Matrix&lt;<span class="k">double</span>&gt;.Build.DenseOfArray(<span class="k">new</span> <span class="k">double</span>[,] {
{ <span class="n">3</span>, <span class="n">2</span>, <span class="n">-1</span> },
{ <span class="n">2</span>, <span class="n">-2</span>, <span class="n">4</span> },
{ <span class="n">-1</span>, <span class="n">0.5</span>, <span class="n">-1</span> }
});
<span class="k">var</span> b <span class="o">=</span> Vector&lt;<span class="k">double</span>&gt;.Build.Dense(<span class="k">new</span> <span class="k">double</span>[] { <span class="n">1</span>, <span class="n">-2</span>, <span class="n">0</span> });
<span class="k">var</span> x <span class="o">=</span> A.Solve(b);
</code></pre></td></tr></table>
<p>The resulting <span class="math">\(\mathbf{x}\)</span> is <span class="math">\([1,\;-2,\;-2]\)</span>, hence the solution <span class="math">\(x=1,\;y=-2,\;z=-2\)</span>.</p>
<p>In F# the syntax is a bit lighter:</p>
<table class="pre"><tr><td class="lines"><pre class="fssnip"><span class="l">1: </span>
<span class="l">2: </span>
<span class="l">3: </span>
<span class="l">4: </span>
<span class="l">5: </span>
</pre></td>
<td class="snippet"><pre class="fssnip highlighted"><code lang="fsharp"><span class="k">let</span> <span class="i">A</span> <span class="o">=</span> <span class="i">matrix</span> [[ <span class="n">3.0</span>; <span class="n">2.0</span>; <span class="o">-</span><span class="n">1.0</span> ]
[ <span class="n">2.0</span>; <span class="o">-</span><span class="n">2.0</span>; <span class="n">4.0</span> ]
[ <span class="o">-</span><span class="n">1.0</span>; <span class="n">0.5</span>; <span class="o">-</span><span class="n">1.0</span> ]]
<span class="k">let</span> <span class="i">b</span> <span class="o">=</span> <span class="i">vector</span> [ <span class="n">1.0</span>; <span class="o">-</span><span class="n">2.0</span>; <span class="n">0.0</span> ]
<span class="k">let</span> <span class="i">x</span> <span class="o">=</span> <span class="i">A</span><span class="o">.</span><span class="i">Solve</span>(<span class="i">b</span>) <span class="c">// 1;-2;-2</span>
</code></pre></td>
</tr>
</table>
<h2><a name="Normalizing-Equation-Systems" class="anchor" href="#Normalizing-Equation-Systems">Normalizing Equation Systems</a></h2>
<p>In practice, a linear equation system to be solved is often not in the standard form required
to use the linear algebra approach. For example, let's have a look at the following system:</p>
<p><span class="math">\[\begin{bmatrix}1 &amp; 2 &amp; 3 &amp; 4\\2 &amp; 3 &amp; 4 &amp; 5\\3 &amp; 4 &amp; 5 &amp; 6\\4 &amp; 5 &amp; 6 &amp; 7\end{bmatrix}
\begin{bmatrix}0\\0\\V\\T\end{bmatrix}
\;=\;
\begin{bmatrix}F\\M\\20\\0\end{bmatrix}\]</span></p>
<p>The first two values of the solution vector <span class="math">\([0,\;0,\;V,\;T]\)</span> are constant zero, so we can simplify
the system to:</p>
<p><span class="math">\[\begin{bmatrix}3 &amp; 4\\4 &amp; 5\\5 &amp; 6\\6 &amp; 7\end{bmatrix}
\begin{bmatrix}V\\T\end{bmatrix}
\;=\;
\begin{bmatrix}F\\M\\20\\0\end{bmatrix}\]</span></p>
<p>Then we need to subtract the two unknowns from the right side back from the left (so that they
become zero on the right side), by introducing a new column each. First we subtract
<span class="math">\([F,\;0,\;0,\;0]^T\)</span> from both sides:</p>
<p><span class="math">\[\begin{bmatrix}3 &amp; 4 &amp; -1\\4 &amp; 5 &amp; 0\\5 &amp; 6 &amp; 0\\6 &amp; 7 &amp; 0\end{bmatrix}
\begin{bmatrix}V\\T\\F\end{bmatrix}
\;=\;
\begin{bmatrix}0\\M\\20\\0\end{bmatrix}\]</span></p>
<p>Then we subtract <span class="math">\([0,\;M,\;0,\;0]^T\)</span> from both sides the same way:</p>
<p><span class="math">\[\begin{bmatrix}3 &amp; 4 &amp; -1 &amp; 0\\4 &amp; 5 &amp; 0 &amp; -1\\5 &amp; 6 &amp; 0 &amp; 0\\6 &amp; 7 &amp; 0 &amp; 0\end{bmatrix}
\begin{bmatrix}V\\T\\F\\M\end{bmatrix}
\;=\;
\begin{bmatrix}0\\0\\20\\0\end{bmatrix}\]</span></p>
<p>Which is in standard from, so we can solve normally:</p>
<table class="pre"><tr><td class="lines"><pre class="fssnip"><span class="l">1: </span>
<span class="l">2: </span>
<span class="l">3: </span>
<span class="l">4: </span>
<span class="l">5: </span>
<span class="l">6: </span>
</pre></td>
<td class="snippet"><pre class="fssnip highlighted"><code lang="fsharp"><span class="k">let</span> <span class="i">A&#39;</span> <span class="o">=</span> <span class="i">matrix</span> [[ <span class="n">3.0</span>; <span class="n">4.0</span>; <span class="o">-</span><span class="n">1.0</span>; <span class="n">0.0</span> ]
[ <span class="n">4.0</span>; <span class="n">5.0</span>; <span class="n">0.0</span>; <span class="o">-</span><span class="n">1.0</span> ]
[ <span class="n">5.0</span>; <span class="n">6.0</span>; <span class="n">0.0</span>; <span class="n">0.0</span>; ]
[ <span class="n">6.0</span>; <span class="n">7.0</span>; <span class="n">0.0</span>; <span class="n">0.0</span> ]]
<span class="k">let</span> <span class="i">b&#39;</span> <span class="o">=</span> <span class="i">vector</span> [ <span class="n">0.0</span>; <span class="n">0.0</span>; <span class="n">20.0</span>; <span class="n">0.0</span> ]
<span class="k">let</span> <span class="i">x&#39;</span> <span class="o">=</span> <span class="i">A&#39;</span><span class="o">.</span><span class="i">Solve</span>(<span class="i">b&#39;</span>) <span class="c">// -140; 120; 60; 40</span>
</code></pre></td>
</tr>
</table>
</div>
<div class="span3">
<ul class="nav nav-list" id="menu">
<li class="nav-header">Math.NET Numerics</li>
<li><a href="https://numerics.mathdotnet.com/Packages.html">NuGet & Binaries</a></li>
<li><a href="https://numerics.mathdotnet.com/ReleaseNotes.html">Release Notes</a></li>
<li><a href="https://numerics.mathdotnet.com/License.html">MIT/X11 License</a></li>
<li><a href="https://numerics.mathdotnet.com/Compatibility.html">Platform Support</a></li>
<li><a href="https://numerics.mathdotnet.com/api/">Class Reference</a></li>
<li><a href="https://github.com/mathnet/mathnet-numerics/issues">Issues & Bugs</a></li>
<li><a href="https://numerics.mathdotnet.com/Users.html">Who is using Math.NET?</a></li>
<li class="nav-header">Contributing</li>
<li><a href="https://numerics.mathdotnet.com/Contributors.html">Contributors</a></li>
<li><a href="https://numerics.mathdotnet.com/Contributing.html">Contributing</a></li>
<li><a href="https://numerics.mathdotnet.com/Build.html">Build & Tools</a></li>
<li><a href="http://feedback.mathdotnet.com/forums/2060-math-net-numerics">Your Ideas</a></li>
<li class="nav-header">Getting Help</li>
<li><a href="https://discuss.mathdotnet.com/c/numerics">Discuss</a></li>
<li><a href="https://stackoverflow.com/questions/tagged/mathdotnet">Stack Overflow</a></li>
<li class="nav-header">Getting Started</li>
<li><a href="https://numerics.mathdotnet.com/">Getting started</a></li>
<li><a href="https://numerics.mathdotnet.com/Constants.html">Constants</a></li>
<li>Floating-Point Numbers</li>
<li>Arbitrary Precision Numbers</li>
<li>Complex Numbers</li>
<li><a href="https://numerics.mathdotnet.com/Matrix.html">Matrices and Vectors</a></li>
<li><a href="https://numerics.mathdotnet.com/Euclid.html">Euclid & Number Theory</a></li>
<li>Combinatorics</li>
<li class="nav-header">Evaluation</li>
<li><a href="https://numerics.mathdotnet.com/Functions.html">Special Functions</a></li>
<li>Differentiation</li>
<li><a href="https://numerics.mathdotnet.com/Integration.html">Integration</a></li>
<li class="nav-header">Statistics/Probability</li>
<li><a href="https://numerics.mathdotnet.com/DescriptiveStatistics.html">Descriptive Statistics</a></li>
<li><a href="https://numerics.mathdotnet.com/Probability.html">Probability Distributions</a></li>
<li class="nav-header">Generation</li>
<li><a href="https://numerics.mathdotnet.com/Generate.html">Generating Data</a></li>
<li><a href="https://numerics.mathdotnet.com/Random.html">Random Numbers</a></li>
<li class="nav-header">Transformation</li>
<li>Fourier Transform (FFT)</li>
<li>Filtering & DSP</li>
<li>Window Functions</li>
<li class="nav-header">Solving Equations</li>
<li><a href="https://numerics.mathdotnet.com/LinearEquations.html">Linear Equation Systems</a></li>
<li>Nonlinear Root Finding</li>
<li class="nav-header">Optimization</li>
<li>Linear Least Squares</li>
<li>Nonlinear Optimization</li>
<li><a href="https://numerics.mathdotnet.com/Distance.html">Distance Metrics</a></li>
<li class="nav-header">Curve Fitting</li>
<li><a href="https://numerics.mathdotnet.com/Regression.html">Regression</a></li>
<li>Interpolation</li>
<li>Fourier Approximation</li>
<li class="nav-header">Native Providers</li>
<li><a href="https://numerics.mathdotnet.com/MKL.html">Intel MKL</a></li>
<li class="nav-header">Working Together</li>
<li><a href="https://numerics.mathdotnet.com/CSV.html">Delimited Text Files (CSV)</a></li>
<li><a href="https://numerics.mathdotnet.com/MatrixMarket.html">NIST MatrixMarket</a></li>
<li><a href="https://numerics.mathdotnet.com/MatlabFiles.html">MATLAB</a></li>
<li><a href="https://numerics.mathdotnet.com/IFSharpNotebook.html">IF# Notebook</a></li>
<li>FsLab & Deedle</li>
<li>Microsoft Excel</li>
<li>numl.net machine learning</li>
<li>R-project</li>
</ul>
</div>
</div>
</div>
</body>
</html>