広告/統計/アニメ/映画 等に関するブログ

広告/統計/アニメ/映画 等に関するブログ

【備忘録】Pyhtonで数式計算

昨日、Rを使って単純な数値計算のやり方をメモしたのですが、

yyhhyy.hatenablog.com

そもそも、Pythonを使ったら普通に数式計算できるんじゃないの??という疑問が湧いて来まして、
確認したらその通りでした、、、
ということでそのメモです。

方法

pythonのsympyパッケージを使うと、数値計算ではなく数式計算をしてくれます。
前回の最適化の問題は、19インチと21インチのTVの販売利益を最大化する為に総利益を最大化するポイントを見つけることでしたので、極値を求める作業となります。

ついては、

x1について微分して"=0"とおく、x2について微分して"=0"とおく、その両方を満たすx1,x2を探す

という作業になります。

今回のコード

#sympyをインポート
from sympy import *
#変数として使用する文字を定義
x1,x2,y = symbols("x1 x2 y")
#数式の作成
y = (339 -x1/100 - 3*x2/1000)*x1 + (399 -4*x1/1000 - x2/100)*x2 - (400000 + 195*x1 + 225*x2)
print(y)
#x1について微分した式を作成
dydx1 = diff(y,x1)
print(dydx1)
#同様にx2について微分した式
dydx2=diff(y,x2)
print(dydx2)
#上記2つの式を方程式として定義
s=symbols("s")
eq1=Eq(dydx1,0)
eq2=Eq(dydx2,0)
#方程式の解を求める
s = solve ( ( eq1,eq2),(x1,x2))
print(s)
#解を最初の式に代入した時の結果の値を計算
ans = y.subs(s)
print(ans)
print(ans.evalf())

結果

x1*(-x1/100 - 3*x2/1000 + 339) - 195*x1 + x2*(-x1/250 - x2/100 + 399) - 225*x2 - 400000
-x1/50 - 7*x2/1000 + 144
-7*x1/1000 - x2/50 + 174
{x1: 554000/117, x2: 824000/117}
21592000/39
553641.025641026

感動的なほどに簡単ですね!!

グラフで確認することも

from sympy.plotting import plot3d
plot3d(y,(x1,0,10000),(x2,0,10000))

sympyには3Dプロットもあります

f:id:yyhhyy:20160503161103p:plain

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

参考にしたサイト

tokeigaku.blog.jp

taromaru-kun.hatenablog.com

プロットを利用する — 読書ノート v1.4.0dev

Plotting Module — SymPy 0.7.7.dev documentation