Cramer's rule: Difference between revisions
Content added Content deleted
Line 1,267: | Line 1,267: | ||
<lang J> A cramer b |
<lang J> A cramer b |
||
2 _12 _4 1</lang> |
2 _12 _4 1</lang> |
||
=={{header|Java}}== |
|||
Supports double data type. A more robust solution would support arbitrary precision integers, arbitrary precision decimals, arbitrary precision rationals, or even arbitrary precision algebraic numbers. |
|||
<lang Java> |
|||
import java.util.ArrayList; |
|||
import java.util.Arrays; |
|||
import java.util.List; |
|||
public class CramersRule { |
|||
public static void main(String[] args) { |
|||
Matrix mat = new Matrix(Arrays.asList(2d, -1d, 5d, 1d), |
|||
Arrays.asList(3d, 2d, 2d, -6d), |
|||
Arrays.asList(1d, 3d, 3d, -1d), |
|||
Arrays.asList(5d, -2d, -3d, 3d)); |
|||
List<Double> b = Arrays.asList(-3d, -32d, -47d, 49d); |
|||
System.out.println("Solution = " + cramersRule(mat, b)); |
|||
} |
|||
private static List<Double> cramersRule(Matrix matrix, List<Double> b) { |
|||
double denominator = matrix.determinant(); |
|||
List<Double> result = new ArrayList<>(); |
|||
for ( int i = 0 ; i < b.size() ; i++ ) { |
|||
result.add(matrix.replaceColumn(b, i).determinant() / denominator); |
|||
} |
|||
return result; |
|||
} |
|||
private static class Matrix { |
|||
private List<List<Double>> matrix; |
|||
@Override |
|||
public String toString() { |
|||
return matrix.toString(); |
|||
} |
|||
@SafeVarargs |
|||
public Matrix(List<Double> ... lists) { |
|||
matrix = new ArrayList<>(); |
|||
for ( List<Double> list : lists) { |
|||
matrix.add(list); |
|||
} |
|||
} |
|||
public Matrix(List<List<Double>> mat) { |
|||
matrix = mat; |
|||
} |
|||
public double determinant() { |
|||
if ( matrix.size() == 1 ) { |
|||
return get(0, 0); |
|||
} |
|||
if ( matrix.size() == 2 ) { |
|||
return get(0, 0) * get(1, 1) - get(0, 1) * get(1, 0); |
|||
} |
|||
double sum = 0; |
|||
double sign = 1; |
|||
for ( int i = 0 ; i < matrix.size() ; i++ ) { |
|||
sum += sign * get(0, i) * coFactor(0, i).determinant(); |
|||
sign *= -1; |
|||
} |
|||
return sum; |
|||
} |
|||
private Matrix coFactor(int row, int col) { |
|||
List<List<Double>> mat = new ArrayList<>(); |
|||
for ( int i = 0 ; i < matrix.size() ; i++ ) { |
|||
if ( i == row ) { |
|||
continue; |
|||
} |
|||
List<Double> list = new ArrayList<>(); |
|||
for ( int j = 0 ; j < matrix.size() ; j++ ) { |
|||
if ( j == col ) { |
|||
continue; |
|||
} |
|||
list.add(get(i, j)); |
|||
} |
|||
mat.add(list); |
|||
} |
|||
return new Matrix(mat); |
|||
} |
|||
private Matrix replaceColumn(List<Double> b, int column) { |
|||
List<List<Double>> mat = new ArrayList<>(); |
|||
for ( int row = 0 ; row < matrix.size() ; row++ ) { |
|||
List<Double> list = new ArrayList<>(); |
|||
for ( int col = 0 ; col < matrix.size() ; col++ ) { |
|||
double value = get(row, col); |
|||
if ( col == column ) { |
|||
value = b.get(row); |
|||
} |
|||
list.add(value); |
|||
} |
|||
mat.add(list); |
|||
} |
|||
return new Matrix(mat); |
|||
} |
|||
private double get(int row, int col) { |
|||
return matrix.get(row).get(col); |
|||
} |
|||
} |
|||
} |
|||
</lang> |
|||
{{out}} |
|||
<pre> |
|||
Solution = [2.0, -12.0, -4.0, 1.0] |
|||
</pre> |
|||
=={{header|JavaScript}}== |
=={{header|JavaScript}}== |