Gauss-Jordan matrix inversion: Difference between revisions
Content added Content deleted
(Added Easylang) |
No edit summary |
||
Line 2,514: | Line 2,514: | ||
1.000 -2.000 1.000 3.000 |
1.000 -2.000 1.000 3.000 |
||
</pre> |
</pre> |
||
=={{header|Free Pascal}}== |
|||
<syntaxhighlight lang="pascal">program MatrixInverse; |
|||
{$mode ObjFPC}{$H+} |
|||
const |
|||
MATRIX_1: array of array of Real = ((1, 2, 3), (4, 1, 6), (7, 8, 9)); |
|||
MATRIX_2: array of array of Real = ((3.0, 1.0, 5.0, 9.0, 7.0), |
|||
(8.0, 2.0, 8.0, 0.0, 1.0), |
|||
(1.0, 7.0, 2.0, 0.0, 3.0), |
|||
(0.0, 1.0, 7.0, 0.0, 9.0), |
|||
(3.0, 5.0, 6.0, 1.0, 1.0)); |
|||
type |
|||
Matrix = array of array of Real; |
|||
function PopulateMatrix(A: Matrix; Order: Integer): Matrix; |
|||
var |
|||
i, j: Integer; |
|||
begin |
|||
SetLength(Result, Succ(Order), Succ(Order * 2)); |
|||
for i := 0 to Pred(Order) do |
|||
for j := 0 to Pred(Order) do |
|||
Result[i + 1, j + 1] := A[i, j]; |
|||
end; |
|||
procedure PrintMatrix(const A: Matrix; Order: Integer); |
|||
var |
|||
i, j: Integer; |
|||
begin |
|||
for i := 1 to Order do |
|||
begin |
|||
for j := 1 to Order do |
|||
Write(A[i, j]:8:4, ' '); |
|||
WriteLn; |
|||
end; |
|||
end; |
|||
procedure PrintInverse(const A: Matrix; Order: Integer); |
|||
var |
|||
i, j: Integer; |
|||
begin |
|||
for i := 1 to Order do |
|||
begin |
|||
for j := Order + 1 to 2 * Order do |
|||
Write(A[i, j]:8:4, ' '); |
|||
WriteLn; |
|||
end; |
|||
end; |
|||
procedure InterchangeRows(var A: Matrix; Order: Integer; Row1, Row2: Integer); |
|||
var |
|||
j: Integer; |
|||
temp: Real; |
|||
begin |
|||
for j := 1 to 2 * Order do |
|||
begin |
|||
temp := A[Row1, j]; |
|||
A[Row1, j] := A[Row2, j]; |
|||
A[Row2, j] := temp; |
|||
end; |
|||
end; |
|||
procedure DivideRow(var A: Matrix; Order: Integer; Row: Integer; Divisor: Real); |
|||
var |
|||
j: Integer; |
|||
begin |
|||
for j := 1 to 2 * Order do |
|||
A[Row, j] := A[Row, j] / Divisor; |
|||
end; |
|||
procedure SubtractRows(var A: Matrix; Order: Integer; Row1, Row2: Integer; Multiplier: Real); |
|||
var |
|||
j: Integer; |
|||
begin |
|||
for j := 1 to 2 * Order do |
|||
A[Row1, j] := A[Row1, j] - Multiplier * A[Row2, j]; |
|||
end; |
|||
procedure GaussJordan(var A: Matrix; Order: Integer); |
|||
var |
|||
i, j: Integer; |
|||
Pivot, Multiplier: Real; |
|||
begin |
|||
// Create the augmented matrix |
|||
for i := 1 to Order do |
|||
for j := Order + 1 to 2 * Order do |
|||
if j = (i + Order) then |
|||
A[i, j] := 1; |
|||
// Interchange rows if needed |
|||
for i := Order downto 2 do |
|||
if A[i - 1, 1] < A[i, 1] then |
|||
InterchangeRows(A, Order, i - 1, i); |
|||
// Perform Gauss-Jordan elimination |
|||
for i := 1 to Order do |
|||
begin |
|||
Pivot := A[i, i]; |
|||
DivideRow(A, Order, i, Pivot); |
|||
for j := 1 to Order do |
|||
if j <> i then |
|||
begin |
|||
Multiplier := A[j, i]; |
|||
SubtractRows(A, Order, j, i, Multiplier); |
|||
end; |
|||
end; |
|||
end; |
|||
procedure DoGaussJordan(B: Matrix); |
|||
var |
|||
A: Matrix; |
|||
Order: Integer; |
|||
begin |
|||
Order := Length(B); |
|||
A := PopulateMatrix(B, Order); |
|||
WriteLn('=== Original Matrix ==='); |
|||
PrintMatrix(A, Order); |
|||
GaussJordan(A, Order); |
|||
WriteLn('=== Inverse Matrix ==='); |
|||
PrintInverse(A, Order); |
|||
end; |
|||
begin |
|||
DoGaussJordan(MATRIX_1); |
|||
WriteLn; |
|||
DoGaussJordan(MATRIX_2); |
|||
end. |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre>=== Original Matrix === |
|||
1.0000 2.0000 3.0000 |
|||
4.0000 1.0000 6.0000 |
|||
7.0000 8.0000 9.0000 |
|||
=== Inverse Matrix === |
|||
-0.8125 0.1250 0.1875 |
|||
0.1250 -0.2500 0.1250 |
|||
0.5208 0.1250 -0.1458 |
|||
=== Original Matrix === |
|||
3.0000 1.0000 5.0000 9.0000 7.0000 |
|||
8.0000 2.0000 8.0000 0.0000 1.0000 |
|||
1.0000 7.0000 2.0000 0.0000 3.0000 |
|||
0.0000 1.0000 7.0000 0.0000 9.0000 |
|||
3.0000 5.0000 6.0000 1.0000 1.0000 |
|||
=== Inverse Matrix === |
|||
0.0286 0.1943 0.1330 -0.0596 -0.2578 |
|||
-0.0058 -0.0326 0.1211 -0.0380 0.0523 |
|||
-0.0302 -0.0682 -0.1790 0.0605 0.2719 |
|||
0.1002 -0.0673 -0.0562 -0.0626 0.0981 |
|||
0.0241 0.0567 0.1258 0.0682 -0.2173</pre> |
|||
=={{header|Generic}}== |
=={{header|Generic}}== |
||
Line 4,307: | Line 4,458: | ||
-0.69565 0.36232 0.07971 0.19565 |
-0.69565 0.36232 0.07971 0.19565 |
||
-0.56522 0.23188 -0.02899 0.56522</pre> |
-0.56522 0.23188 -0.02899 0.56522</pre> |
||
=={{header|Perl}}== |
=={{header|Perl}}== |