# 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("<②完了>")