【Python】インポートなしで連立方程式を解くプログラムを作ってみた
こんにちは。
お久しぶりです、protです。
最近はPythonで中学数学をやってみようと挑戦中です。
そこで今回は連立方程式を解くプログラムを作ってみました!
.……………………とネットで調べてみると「Numpyで作ってみた!」
というように何かしらインポートして使っている模様。。。
となるとまっっっったく面白くはないため、
今回はインポート禁止縛りで連立方程式を解くプログラムを作ってみました。
基本原理
一般的には、ax + by = c とdx + ey = f のような形を解く。
イキナリ大学数学の話になりますが、
行列の計算を使って解を求める方法を考る。
連立解の解法としてガウスの消去法や行列式を使う方法があるが、ここでは
行列式を使ったCramerの規則を使用する方が簡単かな。。。
けど、行列式がゼロの場合には無限多解または矛盾があるので、その場合はエラーを出すよう設計する。
行列式の計算式は以下のような形になる:
Δ = ae - bd
Δx = ce - bf
Δy = af - cd
それぞれの行列式を算出して、Δが0でない場合にΔx/ΔとΔy/Δを解として出力する。もしΔが0なら、係数行列が正方行列ではなく、連立方程式が不変(または矛盾している)である可能性がある。
プログラムの要件
ユーザーからa, b, c, d, e, fを入力してもらう。
行列式Δを計算。
Δが0でないかチェック。ゼロならエラー処理。
ΔxとΔyを計算し、解として出力。
コード<solve.py>
def solve_system(a, b, c, d, e, f):
# 行列式Δを計算
delta = a * e - b * d
if delta == 0:
return None # 無限多解または矛盾
# ΔxとΔyを計算
delta_x = c * e - b * f
delta_y = a * f - c * d
x = delta_x / delta
y = delta_y / delta
return (x, y)
def main():
print("二元一次方程式の解を求めるプログラム")
print("形式: ax + by = c dx + ey = f")
# 係数入力を受け取る
try:
a = float(input("aの値を入力してください: "))
b = float(input("bの値を入力してください: "))
c = float(input("cの値を入力してください: "))
d = float(input("dの値を入力してください: "))
e = float(input("eの値を入力してください: "))
f = float(input("fの値を入力してください: "))
except ValueError:
print("有効な数値を入力してください")
return
solution = solve_system(a, b, c, d, e, f)
if solution is None:
print("この方程式は無限多解または矛盾しています。")
else:
x, y = solution
print(f"解: x = {x:.2f}, y = {y:.2f}")
if __name__ == "__main__":
main()
コードの内容
ざっくりになりますが、基本原理にのっとった内容です。
エラーハンドリングでは、Δが0の場合に「無限多解または矛盾」と表示し、ユーザーに別の数値を入力するよう促す。また、不正な数値形式への対応も必要なのだが、今回は簡易的な処理でエラーが出ないようにした。
最後に、関数名で入出力部分と計算部分を分離してコードの構造を整理して、可読性と保守性を考えてみた。