python 利用虛數解一元方程組
阿新 • • 發佈:2018-11-30
最近在寫一個產生資料的指令碼,該指令碼可以設定表字段間的邏輯關係。比如:Table1.col1 + Table2.col2 = Table3.col3。如果設定了這種邏輯關係,那麼勢必會遇到知道其中兩個欄位的值,需要計算第三個欄位值的情況。
一開始,沒有往深入想,覺得不會很難,就傻乎乎的在寫了。越寫越覺得不好寫,越寫越覺得難處理。雖然最終寫出一個能解四則運算的方法來,但是覺得心力交瘁。邏輯上上下下,亂糟糟的,根本不是我想要的。
在這個時候,突然看到可以用python內建的eval
方法可以解決上述問題,而且只要幾行程式碼,就ok了(當然,知道這個結果的時候,我的內心是奔潰的,畢竟折磨了我好幾個晚上)。
比如要解這麼一個方程:
"(a + b) * c - d = e * f"
首先,把等式右邊都移到等式左邊來,使等式右邊為0
expression = "(a + b) * c - d = e * f"
expression = expression.replace("=", "-(") + ")"
上述方程處理後expression的值為(a + b) * c - d -( e * f)
。
若此時知道方程組內的各個值,僅f
的值未知:
比如各個值如下:
{"a": 10, "b": 11, "c": 112, "d": 223, "e": 9930}
若此時你用eval方法執行,會報錯,因為表示式中f
1j
(虛數),那麼表示式可以執行並算出這個算式的結果。 如下:
c = eval(expression, {"f": 1j, "a": 10, "b": 11, "c": 112, "d": 223, "e": 9930})
得到c = (2129-9930j)
接下去最關鍵的一步來了:
f = -c.real/c.imag
你可能還不熟悉 real
與 imag
分別是什麼含義。它們其實分別表示某個數的實部與虛部。
>>>c = 10
>>>c.real
10
>>>c.imag
0
至此,一元方程組已經解決了。可能還是有人不懂,為什麼最後一步,-c.real/c.imag
可以這麼理解:
當我們設定未知變數為虛數1j
的時候,那麼這個點肯定在平面內的某個點上,即 a+bj。在處理等式的第一步,我們就已經把等式右邊處理成0了,那麼:a+bj=0
是必定成立的。若要等式成立,當初設定的虛數j
應該等於多少呢?
j = -a/b
a 是實部,b是虛部,與上面一致。第一個想出這個方法的人,不得不膜拜!!