
「ほんと地味」、などとディスったバナナ関数(Rosenbrock関数)の最適化デモ、前回は最適化プロセスを可視化、やれば出来るんじゃんと持ち上げました。しかしまさかの地味な結果のデモ再び。 バナナ関数、本当にしつこいデス。しかしその地味なデモの裏側では「大きな一歩」が記されていたと。 知らんけど。
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※Windows11上の Scilab2024.0.0を使用させていただいております。(Scilabについては御本家 Scilab 様へ)
optim_withderivative.sce
今回「鑑賞」させていただくScilabのデモは、optim_withderivative.sceです。以下のデモ選択画面から起動できます。
ほんと地味、などとディスってしまった過去回がデジャヴのように蘇ります。折角、前回グラフをプロットしたりして見栄えが良くなったのにこれかい? それにあいも変わらずバナナ関数です。 しかしその裏では大きな進歩があったのだ。
optim関数
ここしばらくやっている「最適化」の単元?では optim関数が活躍してます。ぶっちゃけ、コスト関数をoptim関数に与えて、適切な初期値を与えれば最適解をみつけてくれるっと。しかしね、コスト関数、ちょいクセ者です。関数の値だけでなく、勾配も返す必要があります。地味だった過去回のバナナ関数(Rosenbrock関数)の定義を御覧じろ。
点xにおける、関数値 f を返す計算以外に、勾配(x(1)方向とx(2)方向あり)を求める g の計算が含まれてます。
過去回では何も言わなかったですが、多分「中の人」が解析的に(微分して)f から g を求めてくれたと。数学不得意老人は、微分もまともに計算できる気がしないので、いつもお世話になっておりますMaxima様に御すがりしてしまいました。こんな感じ。
上記をみると、赤のg(1)と緑のg(2)相当の計算が分かります(そんくらい自分で計算しろよ。。。)
つまり、微分できないお惚け老人などはだれかに御すがりしなければ、関数 f を最適化することなどできんと? いやそこで登場するのが、
numderivative関数
ぶっちゃけ、数値微分の関数です。
https://help.scilab.org/docs/2026.0.0/ja_JP/numderivative.html
numderivative関数に関数 f をお渡しすれば、数値的に微分し、上記のg相当の値が求まってしまうっと。その際のrosenbrock関数とそのコスト関数の定義が以下に。
なんだ、解析的に微分しなくても大丈夫じゃん。そしてその結果の「地味な」結果にいたると。

