Clojure(JVMで動くLISP系)でJavaの数値計算ライブラリApache Commons Mathを使う(6) OptimizationのNelder-Mead SimplexでRosenbrock関数(5パラメータ)を最小になる点を探す。ChatGPTにClojureらしく書き直してもらう。
今回はこの例題。
Javaの数値計算ライブラリApache Commons Mathを使う(6) OptimizationのNelder-Mead SimplexでRosenbrock関数(5パラメータ)を最小になる点を探す。今回からGoogle Geminiも使ってみる。
最初に書いたのがあまりにもJavaっぽいのでChatGPTにもう少しClojureらしく書き直してもらったコードがこれ。
(ns mini.RosenbrockOptimizer
(:import [org.apache.commons.math3.analysis MultivariateFunction]
[org.apache.commons.math3.optim InitialGuess MaxEval PointValuePair]
[org.apache.commons.math3.optim.nonlinear.scalar GoalType ObjectiveFunction]
[org.apache.commons.math3.optim.nonlinear.scalar.noderiv NelderMeadSimplex SimplexOptimizer]))
;; --- Rosenbrock関数(Clojure版) ---
(defn rosenbrock
"N次元Rosenbrock関数 f(x)."
[xs]
(->> (range (dec (count xs)))
(map (fn [i]
(let [xi (nth xs i)
xi+1 (nth xs (inc i))
term1 (- xi+1 (* xi xi))
term2 (- 1.0 xi)]
(+ (* 100.0 term1 term1)
(* term2 term2)))))
(reduce + 0.0)))
(defn rosenbrock-fn []
(reify MultivariateFunction
(value [_ x] (rosenbrock (vec x)))))
;; --- 最適化 ---
(defn minimize-rosenbrock
"5次元Rosenbrock関数を最小化し、結果をマップで返す"
[]
(let [optimizer (SimplexOptimizer. 1e-12 1e-12)
start [1.3 0.7 0.8 1.9 1.2]
simplex (NelderMeadSimplex. (count start))
result (.optimize optimizer
(into-array org.apache.commons.math3.optim.OptimizationData
[(MaxEval. 20000)
(ObjectiveFunction. (rosenbrock-fn))
GoalType/MINIMIZE
(InitialGuess. (double-array start))
simplex]))]
{:evaluations (.getEvaluations optimizer)
:iterations (.getIterations optimizer)
:min-value (.getValue ^PointValuePair result)
:argmin (vec (.getPoint ^PointValuePair result))}))
;; --- 実行用 ---
(defn -main [& _]
(println "5次元Rosenbrock関数の最小化を開始します...")
(println "アルゴリズム: Nelder-Mead Simplex")
(let [{:keys [evaluations iterations min-value argmin]}
(minimize-rosenbrock)]
(println "----------------------------------------")
(println "計算完了")
(println "評価回数:" evaluations)
(println "反復回数:" iterations)
(println "最小値 (f(x)):" min-value)
(println "その時の点 (x):" argmin)
(println "----------------------------------------")
(println "理論上の最小値は f(1,1,1,1,1) = 0 です。")))
(-main)
|
結果は
5次元Rosenbrock関数の最小化を開始します...
アルゴリズム: Nelder-Mead Simplex
----------------------------------------
計算完了
評価回数: 617
反復回数: 386
最小値 (f(x)): 1.129924260917651E-12
その時の点 (x): [1.0000000580197625 1.0000001155585465 1.0000002391902205 1.0000004894555592 1.0000008896018324]
----------------------------------------
となった。
« 高周波・RFニュース 2025年12月26日 IEEE antennas and propagation magazineでレーザー誘起グラフェンアンテナ紹介、Journal of Microwavesで機械学習によるマイクロ波回路比較、Ooklaの2026年ワイヤレス業界予測、TDKのデータセンター電源向けMLCCソリューション | トップページ | 「硝子の塔の殺人」(知念実希人さん)を読んだ。いやー、これはミステリ好きでたくさん読んでいてよかった、と思う作品だった。帯の錚々たる作家さんたちのコメントも納得。雪の硝子の塔で閉じ込められたゲストが次々殺されるという王道ものだが最後のどんでん返しに超驚く。 »
「パソコン・インターネット」カテゴリの記事
「学問・資格」カテゴリの記事
「日記・コラム・つぶやき」カテゴリの記事
« 高周波・RFニュース 2025年12月26日 IEEE antennas and propagation magazineでレーザー誘起グラフェンアンテナ紹介、Journal of Microwavesで機械学習によるマイクロ波回路比較、Ooklaの2026年ワイヤレス業界予測、TDKのデータセンター電源向けMLCCソリューション | トップページ | 「硝子の塔の殺人」(知念実希人さん)を読んだ。いやー、これはミステリ好きでたくさん読んでいてよかった、と思う作品だった。帯の錚々たる作家さんたちのコメントも納得。雪の硝子の塔で閉じ込められたゲストが次々殺されるという王道ものだが最後のどんでん返しに超驚く。 »


コメント