1. 程式人生 > >python 利用虛數解一元方程組

python 利用虛數解一元方程組

最近在寫一個產生資料的指令碼,該指令碼可以設定表字段間的邏輯關係。比如: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

沒有賦值,無法計算。倘若此時給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

你可能還不熟悉 realimag 分別是什麼含義。它們其實分別表示某個數的實部與虛部。

>>>c = 10
>>>c.real
10
>>>c.imag
0

至此,一元方程組已經解決了。可能還是有人不懂,為什麼最後一步,-c.real/c.imag

就是方程的解呢? 虛數a+bj的實部a對應平面座標的橫軸,虛部b對應平面座標的縱軸。a+bj可與平面內(a, b)這個點相對應。

可以這麼理解:
當我們設定未知變數為虛數1j的時候,那麼這個點肯定在平面內的某個點上,即 a+bj。在處理等式的第一步,我們就已經把等式右邊處理成0了,那麼:a+bj=0是必定成立的。若要等式成立,當初設定的虛數j應該等於多少呢?

j = -a/b

a 是實部,b是虛部,與上面一致。第一個想出這個方法的人,不得不膜拜!!