« マクドナルドからの暗号をGoogle ColabのJulia言語で解く。 | トップページ | 高周波・RFニュース 2025年9月30日 Next G Allianceの6Gウェビナーは10月14日、Ansysのアレーアンテナ設計ウェビナーは本日、QualcommのWi-Fi 8解説記事、Huaweiが5G-AとAIの講演、Marvell、Semtechらが1.6T光インターコネクト発表 »

2025年9月29日 (月)

Javaの数値計算ライブラリApache Commons Mathを使う(6) OptimizationのNelder-Mead SimplexでRosenbrock関数(5パラメータ)を最小になる点を探す。今回からGoogle Geminiも使ってみる。

今回はこの例題。

Visual C# (C_sharp)の数値計算ライブラリ MathNET Numericsを使う(6) OptimizationのNelder-Mead SimplexでRosenbrock関数(5パラメータ)を最小になる点を探す 

Apache Commons MathにはNelderMeadSimplexというクラスはあるのだが全然使い方がわからん…検索してもこれ、というのがない。

そこでGoogle Gemini 2.5 Proに聞いてみた。一発で動くのができた。

コードはこんな感じで。

import org.apache.commons.math3.analysis.MultivariateFunction;
import org.apache.commons.math3.optim.InitialGuess;
import org.apache.commons.math3.optim.MaxEval;
import org.apache.commons.math3.optim.PointValuePair;
import org.apache.commons.math3.optim.nonlinear.scalar.GoalType;
import org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunction;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.NelderMeadSimplex;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer;
import java.util.Arrays;

public class RosenbrockOptimizer {
    public static void main(String[] args) {

        // 1. 目的関数の定義 (5パラメータのRosenbrock関数)
        // MultivariateFunctionインターフェースをラムダ式で実装します。
        MultivariateFunction rosenbrock = (double[] x) -> {
            double sum = 0.0;
            // N次元のRosenbrock関数の公式に従って計算
            for (int i = 0; i < x.length - 1; i++) {
                double term1 = x[i+1] - x[i] * x[i];
                double term2 = 1.0 - x[i];
                sum += 100.0 * term1 * term1 + term2 * term2;
            }
            return sum;
        };

        // 2. オプティマイザの準備 (Nelder-Mead法)
        // コンストラクタの引数は収束判定のための許容誤差です。
        // (relative threshold, absolute threshold)
        SimplexOptimizer optimizer = new SimplexOptimizer(1e-12, 1e-12);

        // 3. 最適化の実行
        System.out.println("5次元Rosenbrock関数の最小化を開始します...");
        System.out.println("アルゴリズム: Nelder-Mead Simplex");

        // 初期値 (原点から開始)
        double[] startPoint = new double[]{1.3, 0.7, 0.8, 1.9, 1.2};
       
        // Nelder-Meadシンプレックスを5次元で初期化
        int dimension = 5;
        NelderMeadSimplex simplex = new NelderMeadSimplex(dimension);
       
        // 最適化を実行し、結果を取得
        PointValuePair result = optimizer.optimize(
            new MaxEval(20000), // 最大評価回数(終了条件)
            new ObjectiveFunction(rosenbrock), // 目的関数
            GoalType.MINIMIZE, // 目的(最小化)
            new InitialGuess(startPoint), // 初期推測値
            simplex // 使用するアルゴリズム(シンプレックス)
        );

        // 4. 結果の表示
        System.out.println("----------------------------------------");
        System.out.println("計算完了");
        System.out.println("評価回数: " + optimizer.getEvaluations());
        System.out.println("反復回数: " + optimizer.getIterations());
        System.out.println("最小値 (f(x)): " + result.getValue());
        System.out.println("その時の点 (x): " + Arrays.toString(result.getPoint()));
        System.out.println("----------------------------------------");
        System.out.println("理論上の最小値は f(1,1,1,1,1) = 0 です。");
    }
}

結果:



5次元Rosenbrock関数の最小化を開始します...

アルゴリズム: Nelder-Mead Simplex

----------------------------------------

計算完了

評価回数: 617

反復回数: 386

最小値 (f(x)): 1.129924260917651E-12

その時の点 (x): [1.0000000580197625, 1.0000001155585465, 1.0000002391902205, 1.0000004894555592, 1.0000008896018324]

----------------------------------------

理論上の最小値は f(1,1,1,1,1) = 0 です。

 

すごいな。もう人間いらない…

 

 

« マクドナルドからの暗号をGoogle ColabのJulia言語で解く。 | トップページ | 高周波・RFニュース 2025年9月30日 Next G Allianceの6Gウェビナーは10月14日、Ansysのアレーアンテナ設計ウェビナーは本日、QualcommのWi-Fi 8解説記事、Huaweiが5G-AとAIの講演、Marvell、Semtechらが1.6T光インターコネクト発表 »

パソコン・インターネット」カテゴリの記事

学問・資格」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« マクドナルドからの暗号をGoogle ColabのJulia言語で解く。 | トップページ | 高周波・RFニュース 2025年9月30日 Next G Allianceの6Gウェビナーは10月14日、Ansysのアレーアンテナ設計ウェビナーは本日、QualcommのWi-Fi 8解説記事、Huaweiが5G-AとAIの講演、Marvell、Semtechらが1.6T光インターコネクト発表 »

最近の記事

2026年2月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28

最近のコメント

無料ブログはココログ
フォト