SuanShuの紹介
1. 前書き
The SuanShu is a Java math library for numerical analysis, statistics, root finding, linear algebra, optimization, and lots more.それが提供するものの1つは、実数と複素数の両方の機能です。
ライブラリのオープンソースバージョンと、ライセンスが必要なバージョンがあります。ライセンスには、学術、商用、寄稿者など、さまざまな形式があります。
以下の例では、pom.xmlを介してライセンスバージョンを使用していることに注意してください。 現在、オープンソースバージョンはMavenリポジトリでは利用できません。ライセンス版では、ライセンスサーバーが実行されている必要があります。 その結果、GitHubにはこのパッケージのテストはありません。
2. SuanShuのセットアップ
Mavenの依存関係をpom.xmlに追加することから始めましょう。
com.numericalmethod
suanshu
4.0.0
nm-repo
Numerical Method's Maven Repository
http://repo.numericalmethod.com/maven/
default
3. ベクトルの操作
The SuanShu library provides classes for both dense vectors and sparse vectors.denseベクトルは、ほとんどの要素がゼロ以外の値を持つベクトルです。これに対して、sparseベクトルは、ほとんどの値がゼロ値です。
denseベクトルの実装は、実数/複素数のJava配列を使用するだけですが、sparseベクトルの実装は、entriesのJava配列を使用します。ここで、各entryはインデックスと実数値/複素数値。
ほとんどの値がゼロである大きなベクトルがある場合、それがどのようにストレージに大きな違いをもたらすかを見ることができます。 ほとんどの数学ライブラリは、大きなサイズのベクトルをサポートする必要がある場合、このようなアプローチを使用します。
基本的なベクトル演算のいくつかを見てみましょう。
3.1. ベクトルの追加
add()メソッドを使用すると、2つのベクトルを追加するのは非常に簡単です。
public void addingVectors() throws Exception {
Vector v1 = new DenseVector(new double[] {1, 2, 3, 4, 5});
Vector v2 = new DenseVector(new double[] {5, 4, 3, 2, 1});
Vector v3 = v1.add(v2);
log.info("Adding vectors: {}", v3);
}
表示される出力は次のとおりです。
[6.000000, 6.000000, 6.000000, 6.000000, 6.000000]
add(double)メソッドを使用して、すべての要素に同じ番号を追加することもできます。
3.2. ベクトルのスケーリング
ベクトルのスケーリング(つまり、 定数で乗算することも非常に簡単です:
public void scaleVector() throws Exception {
Vector v1 = new DenseVector(new double[]{1, 2, 3, 4, 5});
Vector v2 = v1.scaled(2.0);
log.info("Scaling a vector: {}", v2);
}
出力:
[2.000000, 4.000000, 6.000000, 8.000000, 10.000000]
3.3. ベクトル内積
2つのベクトルの内積を計算するには、innerProduct(Vector)メソッドを呼び出す必要があります。
public void innerProductVectors() throws Exception {
Vector v1 = new DenseVector(new double[]{1, 2, 3, 4, 5});
Vector v2 = new DenseVector(new double[]{5, 4, 3, 2, 1});
double inner = v1.innerProduct(v2);
log.info("Vector inner product: {}", inner);
}
3.4. エラーへの対処
ライブラリは、操作対象のベクターが実行中の操作と互換性があることを確認します。 たとえば、サイズ2のベクトルをサイズ3のベクトルに追加することはできません。 そのため、次のコードは例外になります。
public void addingIncorrectVectors() throws Exception {
Vector v1 = new DenseVector(new double[] {1, 2, 3});
Vector v2 = new DenseVector(new double[] {5, 4});
Vector v3 = v1.add(v2);
}
そして実際、このコードを実行すると次の結果になります。
Exception in thread "main" com.numericalmethod.suanshu.vector.doubles.IsVector$SizeMismatch: vectors do not have the same size: 3 and 2
at com.numericalmethod.suanshu.vector.doubles.IsVector.throwIfNotEqualSize(IsVector.java:101)
at com.numericalmethod.suanshu.vector.doubles.dense.DenseVector.add(DenseVector.java:174)
at com.example.suanshu.SuanShuMath.addingIncorrectVectors(SuanShuMath.java:21)
at com.example.suanshu.SuanShuMath.main(SuanShuMath.java:8)
4. 行列の操作
ベクトルと同様に、行列はdenseおよびsparse形式で、実数および複素数に対してサポートされます。
4.1. 行列の追加
行列の追加は、ベクトルの操作と同じくらい簡単です。
public void addingMatrices() throws Exception {
Matrix m1 = new DenseMatrix(new double[][]{
{1, 2, 3},
{4, 5, 6}
});
Matrix m2 = new DenseMatrix(new double[][]{
{3, 2, 1},
{6, 5, 4}
});
Matrix m3 = m1.add(m2);
log.info("Adding matrices: {}", m3);
}
4.2. 行列の乗算
数学ライブラリを使用して、行列を乗算できます。
public void multiplyMatrices() throws Exception {
Matrix m1 = new DenseMatrix(new double[][]{
{1, 2, 3},
{4, 5, 6}
});
Matrix m2 = new DenseMatrix(new double[][]{
{1, 4},
{2, 5},
{3, 6}
});
Matrix m3 = m1.multiply(m2);
log.info("Multiplying matrices: {}", m3);
}
2×3行列に3×2行列を掛けると、2×2行列になります。
そして、ライブラリがマトリックスサイズの適切なチェックを行うことを証明するために、失敗するはずの乗算を実行してみましょう。
public void multiplyIncorrectMatrices() throws Exception {
Matrix m1 = new DenseMatrix(new double[][]{
{1, 2, 3},
{4, 5, 6}
});
Matrix m2 = new DenseMatrix(new double[][]{
{3, 2, 1},
{6, 5, 4}
});
Matrix m3 = m1.multiply(m2);
}
これを実行すると、次の出力が生成されます。
Exception in thread "main" com.numericalmethod.suanshu.matrix.MatrixMismatchException:
matrix with 3 columns and matrix with 2 rows cannot multiply due to mis-matched dimension
at com.numericalmethod.suanshu.datastructure.DimensionCheck.throwIfIncompatible4Multiplication(DimensionCheck.java:164)
at com.numericalmethod.suanshu.matrix.doubles.matrixtype.dense.DenseMatrix.multiply(DenseMatrix.java:374)
at com.example.suanshu.SuanShuMath.multiplyIncorrectMatrices(SuanShuMath.java:98)
at com.example.suanshu.SuanShuMath.main(SuanShuMath.java:22)
4.3. 逆行列の計算
行列の逆行列の計算は、手動で行うのに時間がかかる場合がありますが、SuanShu数学ライブラリを使用すると簡単になります。
public void inverseMatrix() {
Matrix m1 = new DenseMatrix(new double[][]{
{1, 2},
{3, 4}
});
Inverse m2 = new Inverse(m1);
log.info("Inverting a matrix: {}", m2);
}
SuanShuライブラリを使用してこれを検証できますが、行列にその逆行列を乗算します。結果は単位行列になるはずです。 これを行うには、上記のメソッドに次を追加します。
log.info("Verifying a matrix inverse: {}", m1.multiply(m2));
5. 多項式を解く
One of the other areas the SuanShu provides support for is polynomials.多項式を評価するためのメソッドを提供するだけでなく、そのルート(多項式が0と評価される入力値)を見つけるためのメソッドも提供します。
5.1. 多項式の作成
多項式を作成するには、その係数を指定します。 したがって、3x2-5x+1のような多項式は次のように作成できます。
public Polynomial createPolynomial() {
return new Polynomial(new double[]{3, -5, 1});
}
ご覧のとおり、最初に最高次の係数から始めます。
5.2. 多項式の評価
evaluate()メソッドを使用して、多項式を評価できます。 これは、実際の入力および複雑な入力に対して実行できます。
public void evaluatePolynomial(Polynomial p) {
log.info("Evaluating a polynomial using a real number: {}", p.evaluate(5));
log.info("Evaluating a polynomial using a complex number: {}", p.evaluate(new Complex(1, 2)));
}
表示される出力は次のとおりです。
51.0
-13.000000+2.000000i
5.3. 多項式のルーツを見つける
多項式の根を見つけることは、SuanShu数学ライブラリによって簡単になります。 さまざまな次数の多項式の根を決定するよく知られたアルゴリズムを提供し、多項式の最高次数に基づいて、PolyRootクラスは最適な方法を選択します。
public void solvePolynomial() {
Polynomial p = new Polynomial(new double[]{2, 2, -4});
PolyRootSolver solver = new PolyRoot();
List extends Number> roots = solver.solve(p);
log.info("Finding polynomial roots: {}", roots);
}
出力:
[-2.0, 1.0]
そのため、このサンプル多項式の2つの実根:-2と1が見つかりました。 当然、複雑なルートもサポートされています。
6. 結論
この記事は、SuanShu数学ライブラリーの簡単な紹介です。
いつものように、記事の完全なソースコードはover on GitHubで入手できます。