實現一個【僞】四則運算封閉的符號運算和求解

最後的效果:python

if __name__ == '__main__':
    import doctest
    doctest.testmod()
    x = Symbols("x")
    print(x * 2 + 1 == 8.0 * x + 6).solution

打印:
{'x': -0.8333333333333334}
這裏用了8.0是由於衆所周知的Python2.7+,對於整數除法用的是整除,3/2=1什麼的,Python3後來有用//這個操做符的,這裏不是重點,不用管git

昨天快下班的時候事情作完了,因而開始划水,看到sympy是個符號運算的庫,我就在想要是讓我實現該有多難呢。。感受真是很是適合新手/高中生的一個題目呢~github

好吧,那麼咱們從四則運算封閉的符號系統作起~單元測試

下班後先寫了一點,而後吃飯的時候構思了一下,寫完啦。今天又補了一點求解一元一次方程。。。測試

學到的是3d

  1. 數學方面,符號對四則運算封閉的話,須要額外的兩個參數:一、係數,二、次數。例如係數是2,次數是3。發現這個問題以後,果斷摒棄了次數。最後實現的符號運算,符號與實數對四則運算封閉,符號與符號對加減封閉(多麼偷懶啊哈哈哈哈~原諒我沒文化)code

  2. Python上,知道了doctest的經過單元測試要實現__repr__方法。
    否則在寫文檔測試時:文檔

"""
>>> Symbols("x",2) / 4.0
Symbols("x",0.5)
"""

會報以下錯誤get

Failed example:
 Symbols("x",2) / 4.0
Expected:
 Symbols("x",0.5)
Got:
 <__main__.Symbols object at 0x10d5718d0>

丟一個不知道能不能讓爬蟲爬到。關鍵詞:doctest class test數學

  1. 還有知道了a+1重載__add__方法,而1+a並不須要重載Int,直接重載a的__radd__就好了。。

多元一次方程的話。。想了想感受仍是挺囉嗦的,就算了。。。
加上次數,感受要涉及高數了。。。作起來好囉嗦。。
積分。。。阿西BUG,高數忘光了。若是我真的能有機會作的話

代碼:https://gist.github.com/zjjott/0eb6ff1947cd213dd70a

相關文章
相關標籤/搜索