In [1]:
# git による管理
# http://ni66ling.hatenadiary.jp/entry/2018/01/02/022905

from sympy import *
from sympy.plotting import plot
from IPython.display import display
init_printing(use_latex='mathjax')




X = Matrix([
    [Rational(3,1),0,0],
    [0,Rational(3,1),0],
    [0,0,Rational(3,1)]
])
Y = Matrix([
    [0,Rational(1,1),Rational(2,1)],
    [Rational(1,1),0,Rational(1,1)],
    [Rational(2,1),Rational(2,1),0]
])
print("供給行列")
display(X)
print("需要行列")
display(Y)



A=X-Y

p1, p2, p3 = symbols('p1, p2, p3')
p = Matrix([[p1],[p2],[p3]])
eqivprice = solve(A*p,p)
ep = [eqivprice[p1]/p3,eqivprice[p2]/p3,p3/p3]
print("各自の収入=支出となるような価格ベクトル =")
display((ep))
print("交換比率は、価格の逆数。\nリンネル{} <=> 上衣{} <=> 茶{},つまり...".format(1/ep[0],1/ep[1],1/ep[2]))
display((1,ep[0]/ep[1],ep[0]/ep[2]))

man = ['A','B','C']
ware = ['リンネル','上衣','茶']

def exchange(w1,i,j,l,m):# (i,j)が(l,m)と j財をw1だけ交換する 
    xrate = ep[j]/ep[m]
    w2 = w1*xrate
    X[i,j] += -w1 #w1--w2
    X[i,m] += w2
    X[l,m] += -w2 #w2--w1
    X[l,j] += w1
    print("{}{}:{}単位が、{}{}:{}単位と、1:{}の比率で交換される".format(man[i],ware[j],w1,man[l],ware[m],w2,xrate))
    display(X)

print("\n<<交換開始>>")
print("アプローチ①:商品ベースで(列ごとに)需給調整を考える")
#AリンネルとB上衣の交
w1 = Y[1,0] #交換されるリンネルの量
exchange(w1,0,0,1,1)


#AリンネルとC茶の交換
w1 = Y[2,0] #交換されるリンネルの量
exchange(w1,0,0,2,2)

#A上衣とC茶の交換
w1 = X[0,1]-Y[0,1] # 交換される上衣の量
exchange(w1,0,1,2,2)


#B上衣とC茶の交換
w1 = X[1,1] # 交換される上衣
exchange(w1,1,1,2,2)


print("<①完了>")

#reset matrix 
X = Matrix([
    [Rational(3,1),0,0],
    [0,Rational(3,1),0],
    [0,0,Rational(3,1)]
])
Y = Matrix([
    [0,Rational(1,1),Rational(2,1)],
    [Rational(1,1),0,Rational(1,1)],
    [Rational(2,1),Rational(2,1),0]
])

print("アプローチ②:主体ベースで(行ごとに)需給調整を考える")
#Aがリンネルで上衣を手に入れる
w1 = Y[0,1] - X[0,1]
exchange(w1,1,1,0,0)
#Aがリンネルで茶を手に入れる
w1 = Y[0,2] - X[0,2]
exchange(w1,2,2,0,0)
#Bが上衣で、Cからリンネルを手に入れる
w1 = Y[1,0] - X[1,0]
exchange(w1,2,0,1,1)
#Bが砂糖を、Cから手に入れる
w1 = Y[1,2]-X[1,2]
exchange(w1,2,2, 1,1)

print("<②完了>")
供給行列
$$\left[\begin{matrix}3 & 0 & 0\\0 & 3 & 0\\0 & 0 & 3\end{matrix}\right]$$
需要行列
$$\left[\begin{matrix}0 & 1 & 2\\1 & 0 & 1\\2 & 2 & 0\end{matrix}\right]$$
各自の収入=支出となるような価格ベクトル =
$$\left [ \frac{7}{8}, \quad \frac{5}{8}, \quad 1\right ]$$
交換比率は、価格の逆数。
リンネル8/7 <=> 上衣8/5 <=> 茶1,つまり...
$$\left ( 1, \quad \frac{7}{5}, \quad \frac{7}{8}\right )$$
<<交換開始>>
アプローチ①:商品ベースで(列ごとに)需給調整を考える
Aのリンネル:1単位が、Bの上衣:7/5単位と、1:7/5の比率で交換される
$$\left[\begin{matrix}2 & \frac{7}{5} & 0\\1 & \frac{8}{5} & 0\\0 & 0 & 3\end{matrix}\right]$$
Aのリンネル:2単位が、Cの茶:7/4単位と、1:7/8の比率で交換される
$$\left[\begin{matrix}0 & \frac{7}{5} & \frac{7}{4}\\1 & \frac{8}{5} & 0\\2 & 0 & \frac{5}{4}\end{matrix}\right]$$
Aの上衣:2/5単位が、Cの茶:1/4単位と、1:5/8の比率で交換される
$$\left[\begin{matrix}0 & 1 & 2\\1 & \frac{8}{5} & 0\\2 & \frac{2}{5} & 1\end{matrix}\right]$$
Bの上衣:8/5単位が、Cの茶:1単位と、1:5/8の比率で交換される
$$\left[\begin{matrix}0 & 1 & 2\\1 & 0 & 1\\2 & 2 & 0\end{matrix}\right]$$
<①完了>
アプローチ②:主体ベースで(行ごとに)需給調整を考える
Bの上衣:1単位が、Aのリンネル:5/7単位と、1:5/7の比率で交換される
$$\left[\begin{matrix}\frac{16}{7} & 1 & 0\\\frac{5}{7} & 2 & 0\\0 & 0 & 3\end{matrix}\right]$$
Cの茶:2単位が、Aのリンネル:16/7単位と、1:8/7の比率で交換される
$$\left[\begin{matrix}0 & 1 & 2\\\frac{5}{7} & 2 & 0\\\frac{16}{7} & 0 & 1\end{matrix}\right]$$
Cのリンネル:2/7単位が、Bの上衣:2/5単位と、1:7/5の比率で交換される
$$\left[\begin{matrix}0 & 1 & 2\\1 & \frac{8}{5} & 0\\2 & \frac{2}{5} & 1\end{matrix}\right]$$
Cの茶:1単位が、Bの上衣:8/5単位と、1:8/5の比率で交換される
$$\left[\begin{matrix}0 & 1 & 2\\1 & 0 & 1\\2 & 2 & 0\end{matrix}\right]$$
<②完了>