ぐっちゃんのチェックポイント

身近なことからキワドイとこまで、幅広い領域を担当しています

Pythonで連立方程式を解く方法

あいさつ

こんにちは、pLotsです。
このブログを知り合いに見せた際、

「エンジニアブログみたいなの想像してたわ笑笑」

って来た。


そういえば私、エンジニア(仮)だったね(忘れてた)
というわけで今回はエンジニアっぽい記事を作ろう!

でもプログラミングよりも3DCADでモノを設計する方が得意な私に
できることなんてあるのか???

そこで、学生時代になにかエンジニアっぽいプログラムを
作ってなかったかぁとPC内を調べたら、丁度これが出てきた。

みんなが誰しも1度は習った、「「連立方程式」」



それでは、今回は学校の数学で習ったとこのプログラム化、
その中でも、中学生で習う「連立方程式」をPythonで解いてみます。

連立方程式といっても基本的な二元一次方程式ですが()


実行環境についてですが、
Googleアカウントさえあれば誰でもできる Colaboratoryにて実行しました

プログラム

コードを以下に示します。

#連立方程式
import sympy as sym

#変数x, yの設定
x = sym.Symbol("x")
y = sym.Symbol("y")

#式の表示
print("Ax + By = C")
print("Dx + Ey = F")

#a,b,c,d,e,fに任意の数を代入する
name_a = input("Aに代入する数値を入力してください → ")
name_b = input("Bに代入する数値を入力してください → ")
name_c = input("Cに代入する数値を入力してください → ")
name_d = input("Dに代入する数値を入力してください → ")
name_e = input("Eに代入する数値を入力してください → ")
name_f = input("Fに代入する数値を入力してください → ")

#解く
sol = sym.solve([int(name_a)*x + int(name_b)*y - int(name_c),
                 int(name_d)*x + int(name_e)*y - int(name_f)],x,y)


###解くだけならこの処理はいらない
#name_a,name_b,name_d,name_eに代入した数が"1"の場合空白にする
v_no = 4       #係数の数

for i in range(v_no):      
  if name_a == str(1):
    name_a = ' '
  elif name_b == str(1):
    name_b = ' '
  elif name_d == str(1):
    name_d = ' '
  elif name_e == str(1):
    name_e = ' '

###

#任意の数を代入した式を表示する
print(name_a + "x +" + name_b + "y =" + name_c)
print(name_d + "x +" + name_e + "y =" + name_f)

#回答結果を表示する
print("--------計算結果-------")
print(sol)

機能

①input()で任意の数値を入力できる
②解いたx,yの数が割り切れない場合、分数で表示する
③表示する際、掛ける数が1の場合空欄にして表示する

解説

①について

半角数字で入力します。
もちろん英字や全角文字はダメです。
(try-exceptとかでエラー内容出力できるのかな?)

②について

計算結果が割り切れない時って、分数で表示しない?
float型だと小数で出力されるんじゃね.....って思ったのでint型にしました。
故に分数表示なのです。



③について

ただ解くだけなら" ### " で囲まれた部分はいらないです。
私の趣味です。

for文の中は、input関数で1が入力された場合
そこの係数を空欄にする処理が記載されています。


今回は文字の係数が name_a, name_b, name_d, name_e の4つなので、
4回繰り返さなければなりません。

この繰り返しがないと、例えばname_a~fに、[ 3, 1, 6, 1, 4, 3]を代入したら
 3x + y = 6
 1x + 4y = 3
と表示されてしまいます。

気付いた点

・input関数で入力されたデータはstr型になること

苦労した点

・1が入力されたら空欄表示するプログラムの作成
まじでこれです。だってさ、1xとかって出力されるの気持ち悪いじゃん???
そんなわけからprint()で表示する際は1を空欄にして違和感のないようにしました。

でもいざやってみると大変だった。
頭の中で考えていたコードをフローチャートを以下に示す。

↑swich文でこんな風にしたかったのだけど、


pythonにはないっぽかったので実際に作ったプログラムは

こんなんだった。
多分岐処理は苦手なんよ私。

見直し

入力された値が全角数字や数字以外が入力された際、発生するエラー文をtry-exceptとかで出力したり、係数に0が入力されたら式の表示でその部分と文字を空欄にしたりすれば式が見やすくなるんじゃないかなぁ

あとがき

実はこのプログラム、連立方程式をいちいち解くのがダルくなって作ったんです。
私が中学生相手の塾講師やってた時にPC持ち込んで解いてました笑

普段はjavaを勉強していてめちゃくちゃ久々にPython触れたら結構忘れてた...
Pythonってswich文がないとか、try-catchじゃなくてtry-exceptだったり、なんでも普段の癖でifの後に{}を付けたり処理に;をつけちゃったり。
もうガバガバ。

仕舞にはinput関数で入力したデータ、アレさ、
int型だと思ってたのがtype()で出力したら実はstr型だったなんて。

今回、初めてLatexに触れてみました。MSwordの数式を挿入する感覚で、
しかもwordよりも使いやすい(行列の表現とか)
今後も数式使う時はTex使っていこうかな。

おしまい