[PR]当サイトはアフィリエイト広告を利用しています。
はじめに
今回はまたソルバーネタ。
LibreOfficeのCalcにもソルバーがあるので、これがどのくらいの性能なのか検証してみようという回。
Calcは最近のアップデートでDEPSOなどの拡張機能でのソルバーがなくなってしまって、線形ソルバーと群知能非線形ソルバーの二つしか選べなくなりました。
線形ソルバーはまあいいとして、非線形ソルバーが試験的機能の群知能しかなくなってしまったので、これがどのくらいの性能なのか気になります。
非線形ソルバーで手軽なやつってあんまりないんですよね。
Excel持ってれば済む話なんですけど、持ってないならどうするかってね。
GoogleのOR-Toolsは非線形ソルバーないですし。
Calcでどこまでできるか、興味がある人はいるはず。
そう思って書いてます。
問題
次のような問題を解きます。
酢酸6.0molとエタノール3.0mol、触媒として硫酸を少量混合し、25℃に保って振った。
平衡状態に達したとき、混合溶液中の酢酸エチルの物質量は何molか。
25℃におけるこの反応の平衡定数はK=4.0とし、反応中に液体の体積は変化しないものとする。
解:
この反応は次のように書ける。(入試レベルの完璧な書き方ではなく、概要をわかるように書いているだけですので注意)
CH3COOH + C2H5OH ⇄ CH3COOC2H5 + H2O
反応前はそれぞれ、
6.0, 3.0, 0, 0 [mol]
平衡時はそれぞれ
6.0-x, 3.0-x, x, x [mol]
混合溶液中の酢酸エチルの物質量をx[mol]とする。
混合溶液の体積をVとすると、
K=([CH3COOC2H5][H2O])/([CH3COOH][ C2H5OH])
=(x/V)2/(((6.0-x)/V)((3.0-x)/V))
=4.0
この式から
x≒9.5, 2.5 x<3より、x=2.5[mol]
Calcのソルバーで求める
次のように入力。
ソルバーの設定。
解決方法は群知能を選択。
結果。
オール0。
ありゃりゃ。
ちなみに群知能のオプションで差分進化でも粒子群でも結果はうまくいかず。
でもあきらめない。
中身は何らかの最小化を実施していると考えて、目標値を目的関数にするときの常套手段、絶対値に直して最小化に切り替える。
ソルバーの設定も最小化に切り替える。
結果。
2.53589827537089
が出ました!
複数変数でやってみる
以前GAをやった時と同じ問題を使ってみる。
次の問題の、-5<=x1,x2,x3<=5のときの最小値とそのときの変数の値を求めよ。
y=x1×x1+x2×x2+x3×x3
この最適解(最小の値を取るときの変数の値)は
x1,x2,x3=0 y=0 となる。
単純な放物線が三次元になっただけの問題。
シートに初期値を入力して
ソルバーの設定をして
おお!ちゃんと答えが出た。
もうちょっと負荷をかけてみる。
(x1-1.1)(x1-1.1)
としてみた。
これでも群知能の差分進化なら答えが出る。
残念ながら粒子群では答えは出なかった。
さらにこれを整数制約にしてみる。
するとx1=1が最適解になるはずだが、さあどうか。
結果は
うーん。
まだあきらめない。
オプションの非負数にチェックを入れる。
結果。
やった!答えになった。
まとめ
今回はLibreOfficeのCalcのソルバーでどこまでできるのかというのを簡単な問題で確認しました。
Calc唯一の非線形ソルバーである群知能ソルバーは
「目標値」のオプションはあまり使えないようだけど、目標値と関数値の差の絶対値という常套手段で解決できそう。
また差分進化のオプションのほうがうまくいきやすいみたい。
また整数制約は非負数ならなんとかいくかなーといったところ。
案外機能しているような。
Excel無いってときは、簡単な問題ならテクニックで乗り切れることも多いかもしれない。
ただしクセはある。
以上。
当ブログ(シルルスのコードおきば)ではエクセルソルバー関係の記事を他にも執筆しています。参考になりましたら幸いです。
●エクセルソルバーで複数解を求める方法【初期値を変えるしかないです】
●エクセルソルバーと組み合わせ最適化問題【解法例と基礎知識】
●Support Vector Regressionをエクセルのソルバーで作ってみた