見出し画像

【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の場合に「無限多解または矛盾」と表示し、ユーザーに別の数値を入力するよう促す。また、不正な数値形式への対応も必要なのだが、今回は簡易的な処理でエラーが出ないようにした。

最後に、関数名で入出力部分と計算部分を分離してコードの構造を整理して、可読性と保守性を考えてみた。


いいなと思ったら応援しよう!