Matplotlib で3直線で囲まれた範囲を塗りつぶしをしてみます。
まず、x の範囲を適当に設定し、3直線を定義します。
実際の塗りつぶしは、fill_between() 機能を利用します。
ですが、fill_between() は3式以上には対応していないため、2つのデータに落とし込む必要があります。
numpy の maximum(), minimum() で2式の最大値または最小値を取得します。
まず y1 y2 のグラフのような条件下でデータ y4 を設定します。
今度は y3, y4 を fill_between() と where パラメータで塗りつぶします。
グラフでもわかるように y4(y1, y2 条件のデータ) <= y3 となります。
第1引数は、x軸の値、第2,3引数は2式のデータ、オプションとして where など設定します
もし、3式の交点がわあかっていれば、fill() を使って交点指定で塗りつぶしても良いかと思います。
1次式のみで定義できる式から、ある条件(制約)をもとに問題の最適解を見つけることです。
2次以上の式や、離散的な変数(連続でない)に関しての問題は対象外となります。
問題を解決するには、目的関数(求めたい解の定義式)と、問題の制約(条件)を定義します。
問題定義の関数は、 最小化と最大化の2種類あります。
例えば、生産するための最大利益、乗り換え案内などの最短経路を求めたりする問題です。
上記は3つの制約で、ある目的関数から最適解を求めたグラフ化です。
制約は(不等式)の不等号の向きで範囲が異なります。
PuLP は COIN-OR プロジェクトで開発された線形最適化問題を解くための Pythonライブラリです。
視覚的に確認するために、Jupyter Notebook をインストールします。
個人的には、Anaconda は入れたくないので pip3 でインストールします。
変数作成変数は、 LpVariable() で定義します。
「インスタンス名」で必須です。
目的関数を LpProblem() でインスタンスを作成し、制約を追加してきます。
作成したインスタンスに、目的関数、制約の式を追加します。
定義した問題定義を実際に解くには、 solve() を利用しますが、戻り値は実際の解ではなく、成功フラグになります。
実行結果のステータスを確認するのに、 LpStatus() を利用します。
目的関数の最適解は、 value(モデル.objective) で取得します。
最適解を求めたら、解を取得します。
定義した決定変数を variables() 、それぞれの解を value(オブジェクト) で取得します。
Python単体 と Anaconda は比較的衝突しやすいので、Anacondaを削除してみる
<
h2 class="h2">anaconda 本体の削除 環境によってパスが異なるが、which anaconda などでパスを確認して削除
<
h2 class="h2">.bash_profile から環境変数の削除 ~/.bash_profile に環境変数が追加されていた場合はこれを削除
ターミナルを再起動すると anaconda は動作しない
Axes3D を利用して、曲面を3Dグラフ化する 曲面の関数 z=axn+byn+c
描画はワイヤーフレーム plot_wireframe() を利用した。
<
div>
5次以上のn次方程式(非線形方程式)の一般式は困難 xn+an−1xn−1+⋯+a1x+a0=0
scipy.optimize.fsolve, sympy.optimize.fsolve などを利用して近似的に解を求める
参考:非線形方程式の根
ここでは、3次関数をグラフ化してみる。
y*定数は任意に入力
a=0.1, b=0.1, c=-20, d=-30
x = [-20, 20]
Symbol() で方程式の変数を作成し、solve() で方程式の解を計算する
解が実数解でも虚数部(誤差)がでるため、matplotlib の座標として扱えない。
as_coeff_Add() で配列から実数部分だけ抜き出す(解の誤差を無視) ※as_coeff_Add() は、SymPy Modules Reference参照
式を取得して、subs() で xに値を代入する
ちなみに、3次方程式で solve() の一般解は以下の通り
matplotlib の plot() はデータをプロットするが、Sympy の plot() を利用すると一般式をグラフ化できる。 数式を手っ取り早く視覚化するには使える
Sympy の plot() の第1引数に数式、第2引数にX軸の情報を入れる
ちなみに、以下でxの最大最小から、yの最大最小を求めている。
2次関数の解はSympy.solve, scipy.optimize.fsolve を使っても求められるが、ここでは非効率だが2次関数の一般式を作成、解を求めてグラフ化してみる。
*Python3 の記述
解がない(虚数)だと、プロットできないので判別式の関数を作成
最大値、最小値、X軸プロット間隔を設定
*最終的に最大値、最小値は、解によって動的に変化させる
二次方程式を記述
Debian の最新バージョンは python3 が Universe Repository に含まれている。
.bashrc に環境変数追加
pyenv 動作確認
*デフォルト /tmp にインストールされるようなので容量には注意 ソースインストールの場合 Download Anaconda Distribution からダウンロードしてインストール
これで、python コマンドでも python3が利用できる。
pip でなく Anaconda でライブラリをインストールする
psycopg2 を利用して PostgreSQL に接続する
chainer/chainerからサンプルをダウンロード
機械学習のHello-World「train_mnist.py 」を動かしてみる。 *初回時は画像素材をダウンロード *デフォルト設定だと20回学習
運よくNVIDIA製のグラボを積んだマシンを持っていたらGPUモードで計算させられます。 (自分は持ってない・・・) NVIDIAからCUDAダウンロード