1. 序章

SuanShuは、数値解析、統計、求根アルゴリズム、線形代数、最適化などを行うためのJava数学ライブラリです。 SuanShuが提供するものの1つは、実数と複素数の両方の機能です。

ライブラリのオープンソースバージョンと、ライセンスが必要なバージョンがあります。ライセンスの形式は、アカデミック、コマーシャル、コントリビューターです。

以下の例では、pom.xmlを介してライセンスされたバージョンを使用していることに注意してください。 オープンソースバージョンは現在、Mavenリポジトリでは利用できません。 ライセンスバージョンでは、ライセンスサーバーが実行されている必要があります。 その結果、GitHubにはこのパッケージのテストはありません。

2. SuanShuのセットアップ

Mavenの依存関係をpom.xmlに追加することから始めましょう。

<dependencies>
    <dependency>
        <groupId>com.numericalmethod</groupId>
        <artifactId>suanshu</artifactId>
        <version>4.0.0</version>
    </dependency>
</dependencies>
<repositories>
    <repository>
        <id>nm-repo</id>
        <name>Numerical Method's Maven Repository</name>
        <url>http://repo.numericalmethod.com/maven/</url>
        <layout>default</layout>
    </repository>
</repositories>

3. ベクトルの操作

SuanShuライブラリは、密なベクトルと疎なベクトルの両方のクラスを提供します。 密なベクトルは、 sparse [とは対照的に、ほとんどの要素がゼロ以外の値を持つベクトルです。 X194X]ほとんどの値がゼロ値を持つベクトル。

density ベクトルの実装は単純に実数/複素数の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.baeldung.suanshu.SuanShuMath.addingIncorrectVectors(SuanShuMath.java:21)
    at com.baeldung.suanshu.SuanShuMath.main(SuanShuMath.java:8)

4. 行列の操作

ベクトルに加えて、ライブラリは行列演算のサポートも提供します。ベクトルと同様に、行列は高密度およびスパース形式で、実数および複素数でサポートされます。数字。

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.baeldung.suanshu.SuanShuMath.multiplyIncorrectMatrices(SuanShuMath.java:98)
    at com.baeldung.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. 多項式を解く

SuanShuがサポートする他の領域の1つは、多項式です。多項式を評価する方法だけでなく、その根(多項式が0と評価される入力値)を見つける方法も提供します。

5.1. 多項式の作成

多項式は、その係数を指定することで作成できます。 したがって、 3×2-5x +1のような多項式は次のように作成できます。

public Polynomial createPolynomial() {
    return new Polynomial(new double[]{3, -5, 1});
}

ご覧のとおり、最初に最高次数の係数から始めます。

5.2. 多項式の評価

Evaluation()メソッドを使用して、多項式を評価できます。 これは、実際の入力と複雑な入力に対して実行できます。

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と1の2つの実根が見つかりました。 もちろん、複雑なルートもサポートされています。

6. 結論

この記事は、SuanShu数学ライブラリの簡単な紹介です。

いつものように、記事の完全なソースコードは、GitHubから入手できます。