Gauss-Jordan matrix inversion: Difference between revisions
Content added Content deleted
(Added Algol 68) |
Alextretyak (talk | contribs) (Added 11l) |
||
Line 6: | Line 6: | ||
'''A''' being an '''n''' × '''n''' matrix. |
'''A''' being an '''n''' × '''n''' matrix. |
||
<br><br> |
<br><br> |
||
=={{header|11l}}== |
|||
{{trans|Nim}} |
|||
<lang 11l>V Eps = 1e-10 |
|||
F transformToRref(&mat) |
|||
V lead = 0 |
|||
L(r) 0 .< mat.len |
|||
I lead >= mat[0].len |
|||
R |
|||
V i = r |
|||
L mat[i][lead] == 0 |
|||
i++ |
|||
I i == mat.len |
|||
i = r |
|||
lead++ |
|||
I lead == mat[0].len |
|||
R |
|||
swap(&mat[i], &mat[r]) |
|||
V d = mat[r][lead] |
|||
I abs(d) > Eps |
|||
L(&item) mat[r] |
|||
item /= d |
|||
L(i) 0 .< mat.len |
|||
I i != r |
|||
V m = mat[i][lead] |
|||
L(c) 0 .< mat[0].len |
|||
mat[i][c] -= mat[r][c] * m |
|||
lead++ |
|||
F inverse(mat) |
|||
V augmat = [[0.0] * (2 * mat.len)] * mat.len |
|||
L(i) 0 .< mat.len |
|||
L(j) 0 .< mat.len |
|||
augmat[i][j] = mat[i][j] |
|||
augmat[i][mat.len + i] = 1 |
|||
transformToRref(&augmat) |
|||
V result = [[0.0] * mat.len] * mat.len |
|||
L(i) 0 .< mat.len |
|||
L(j) 0 .< mat.len |
|||
I augmat[i][j] != Float(i == j) |
|||
X ValueError(‘matrix is singular’) |
|||
result[i][j] = augmat[i][mat.len + j] |
|||
R result |
|||
F print_mat(mat) |
|||
L(row) mat |
|||
V line = ‘’ |
|||
L(val) row |
|||
I !line.empty |
|||
line ‘’= ‘ ’ |
|||
line ‘’= ‘#3.5’.format(val) |
|||
print(line) |
|||
F runTest(mat) |
|||
print(‘Matrix:’) |
|||
print_mat(mat) |
|||
print() |
|||
print(‘Inverse:’) |
|||
print_mat(inverse(mat)) |
|||
print() |
|||
print() |
|||
V m1 = [[Float(1), 2, 3], |
|||
[Float(4), 1, 6], |
|||
[Float(7), 8, 9]] |
|||
V m2 = [[Float( 2), -1, 0], |
|||
[Float(-1), 2, -1], |
|||
[Float( 0), -1, 2]] |
|||
V m3 = [[Float(-1), -2, 3, 2], |
|||
[Float(-4), -1, 6, 2], |
|||
[Float( 7), -8, 9, 1], |
|||
[Float( 1), -2, 1, 3]] |
|||
runTest(m1) |
|||
runTest(m2) |
|||
runTest(m3)</lang> |
|||
{{out}} |
|||
<pre> |
|||
Matrix: |
|||
1.00000 2.00000 3.00000 |
|||
4.00000 1.00000 6.00000 |
|||
7.00000 8.00000 9.00000 |
|||
Inverse: |
|||
-0.81250 0.12500 0.18750 |
|||
0.12500 -0.25000 0.12500 |
|||
0.52083 0.12500 -0.14583 |
|||
Matrix: |
|||
2.00000 -1.00000 0.00000 |
|||
-1.00000 2.00000 -1.00000 |
|||
0.00000 -1.00000 2.00000 |
|||
Inverse: |
|||
0.75000 0.50000 0.25000 |
|||
0.50000 1.00000 0.50000 |
|||
0.25000 0.50000 0.75000 |
|||
Matrix: |
|||
-1.00000 -2.00000 3.00000 2.00000 |
|||
-4.00000 -1.00000 6.00000 2.00000 |
|||
7.00000 -8.00000 9.00000 1.00000 |
|||
1.00000 -2.00000 1.00000 3.00000 |
|||
Inverse: |
|||
-0.91304 0.24638 0.09420 0.41304 |
|||
-1.65217 0.65217 0.04348 0.65217 |
|||
-0.69565 0.36232 0.07971 0.19565 |
|||
-0.56522 0.23188 -0.02899 0.56522 |
|||
</pre> |
|||
=={{header|360 Assembly}}== |
=={{header|360 Assembly}}== |