線性市場
直線
需求或供給曲線以反函數形式表示為直線:
其中 \(a\) 為價格截距,\(b\) 為斜率(需求 \(b < 0\),供給 \(b > 0\))。價格一律在縱軸、數量在橫軸,沿用 Marshall (1890) 的畫法。離散的逐單位表(詳見離散市場)與由個人曲線加總而成的分段線性市場曲線(詳見由個人加總市場曲線)不是單一直線。
Line.from_inverse(float, float)
Line.from_standard(
float,
float,
float
)
數量 \(q\) 時的價格。
價格 \(p\) 時的數量。
\(Q = 0\) 時的價格(需求曲線的阻絕價格)。
\(p = 0\) 時的數量。
\(\mathrm{d} p / \mathrm{d} Q\)。
\(p = a + b Q\) 的 (a, b)。
將截距與斜率分別加上 delta_intercept(\(\Delta a\))與 delta_slope(\(\Delta b\))後的新直線。
價格—數量平面上的直線,內部儲存為 \(A p + B Q + C = 0\),因此也能表示水平線與垂直線。from_inverse(a, b) 建立 \(p = a + b Q\);from_standard(A, B, C) 建立 \(A p + B Q + C = 0\)。套件根目錄另以 line_from_inverse() 與 line_from_standard() 提供這兩個建構函式。
from principle_viz import line_from_inverse, line_from_standard
demand = line_from_inverse(10.0, -1.0)
# 6.0 7.0
print(demand.q_at(4), demand.p_at(3))
# 10.0 10.0
print(demand.p_intercept(), demand.q_intercept())
# (10.0, -1.0)
print(line_from_standard(1, 1, -10).to_inverse())
\((A, B, C) = (1, 1, -10)\) 與 \(p = 10 - Q\) 等價。
水平線沒有 \(Q(p)\),垂直線沒有 \(p(Q)\);呼叫對應的方法會拋出 NonInvertibleLineError。
均衡
solve_equilibrium(demand, supply)
兩條直線的交點,回傳 EquilibriumResult(詳見快速開始)。兩線平行時拋出 ParallelLinesError,重合時拋出 CoincidentLinesError。
from principle_viz import solve_equilibrium
eq = solve_equilibrium(demand, line_from_inverse(2.0, 1.0))
print(eq)
# EquilibriumResult(q_star=4.0, p_star=6.0,
# is_valid_market=True, notes=())
由 \(10 - Q = 2 + Q\) 得均衡數量 4、均衡價格 6,is_valid_market 為 True,notes 為空。
比較靜態
ShiftSpec(delta_intercept=0.0, delta_slope=0.0)
ShiftScenario(demand_shift=None, supply_shift=None)
以反函數形式描述一條曲線的移動:delta_intercept 為正時向上平移、為負時向下,delta_slope 旋轉曲線。情境可同時移動需求、供給或兩者。兩者都位於 principle_viz.core.shifts。
需求增加使需求截距上升;供給增加則使供給截距下降,因為賣方在每個數量下都願意接受較低的價格。
comparative_statics(
demand,
supply,
scenario
)
移動前的 EquilibriumResult。
移動後的 EquilibriumResult。
移動前後的直線(baseline_demand、shifted_demand 等)。
數量的變動。
價格的變動。
數量的變動方向:"left" 或 "right"(未變動時為 "none")。
價格的變動方向:"up" 或 "down"(未變動時為 "none")。
求解移動前後的市場,結果包含下列欄位:
from principle_viz import comparative_statics
from principle_viz.core.shifts import ShiftScenario, ShiftSpec
up = ShiftScenario(demand_shift=ShiftSpec(delta_intercept=3.0))
result = comparative_statics(demand, supply, up)
new = result.shifted_equilibrium
# 5.5 7.5
print(new.q_star, new.p_star)
# right up
print(result.direction_q, result.direction_p)
MarketFigure.add_comparative_statics(
result,
q_max,
*,
demand_label="$D_1$",
supply_label="$S_1$"
)
畫出移動的曲線、兩個均衡點,以及由舊均衡指向新均衡的虛線箭頭。在 add_curves() 中將原曲線命名為 \(D_0\) 與 \(S_0\)。需求增加的結果如需求增加。,供給減少的結果如供給減少。。
fig = MarketFigure(
x_max=12, y_max=14, title="Increase in Demand"
)
fig.add_curves(
demand,
supply,
q_max=10,
demand_label="$D_0$",
supply_label="$S_0$",
)
fig.add_comparative_statics(result, q_max=10)
fig.finalize()
例外
套件拋出的所有例外都繼承自 principle_viz.exceptions 中的 PrincipleVizError,捕捉它即可一併處理。0.10.0 版以前的名稱 PrincipleEconError 是同一個類別。各例外的拋出時機如例外類別。
無法建立或轉換直線
對水平線求 \(Q(p)\),或對垂直線求 \(p(Q)\)
需求與供給沒有交點
需求與供給是同一條直線
租稅、補貼、價格管制或貿易情境無效
離散逐單位表無效(詳見離散市場)
個人曲線無法加總,或價格超出分段曲線範圍(詳見由個人加總市場曲線)
生產可能曲線無效(詳見生產可能曲線)