1. 程式人生 > >用Python做數學計算之基礎計算

用Python做數學計算之基礎計算

摘要(Abstract)

本文介紹使用Python來做數學計算,在學習和工作中,經常會遇到一些數學計算的問題。一般人會使用計算器軟體,不得不說,計算器太難用了。專業人士可能會使用更強大的工具,如Matlab,但這種重量級工具有時可能並不適用。本文打算使用一個輕量級的工具Python來做計算。準確來說Python並不是一個數學工具,而是一種程式語言。Python提供了很多數學庫,利用Python和這些庫可以做很多數學計算。

本文不是程式語言的教程,更像是一個工具的使用教程,閱讀本文不需要有程式設計基礎,當然,需要一點數學基礎(比如加減乘除)。本文適合任何想找一個計算工具的人學習和參考。

本文將以例項講解各種用法。

安裝Python(Installation)

Python官方網站提供下載,完全免費使用。Python目前有Python 2和Python 3兩個版本,兩個版本有一些語法差別,對於本文來說,幾乎沒有區別,推薦使用Python 3。在Download介面找到系統對應的版本下載(我的版本是Mac OS X 64-bit/32-bit installer),雙擊直接安裝。安裝好後,找到程式IDLE,啟動IDLE就可開始寫Python程式了。

Python Shell

  • 提示1:Mac OS和大部分版本Linux系統自帶Python執行環境,可以不用安裝。當然,也可升級成最新版本。Windows需要自行安裝。
  • 提示2:也可以安裝Sublime Text編輯器,再安裝Sublime REPL外掛。本人現在使用這種方案,寫Python程式非常方便。
    REPL

  • 提示3:搜狗輸入法使用者注意,搜狗輸入法在IDLE下有點小問題(不能退格),切換到英文輸入法即可。

Python 2 和Python 3的注意事項

  • print的語法。python 3的用法為print("hello world!"),python 2的用法為print "hello world!"或者print("hello world!")

基本運算

加法

>>> 1 +  2      //直接輸入,回車直接輸出結果
3
>>> sum = 1 + 2 //計算結果儲存在sum中 >>> print(sum) //輸出sum 3 >>> a = 1 //變數 >>> b = 2 >>> sum = a + b //變數相加 >>> print(sum) 3

減法

>>> a = 1
>>> b = 2
>>> 2 - 1
1
>>> a - b
-1
>>> b - a
1

乘法

>>> 1 * 2
2
>>> 1.5 * 3
4.5
>>> a * b
2
>>> 

除法

傳統的除法。有程式設計經驗的人一定知道,整型除法的結果也是整型(地板除,捨棄小數部分)。如果有一個數是浮點型,則結果是浮點型(真正的除法,保留小數)。

>>> 1 / 3           //整型除法,商為0,捨棄小數部分
0   
>>> 5 / 2
2   
>>> 1.0 / 3         //浮點數除法,保留小數
0.3333333333333333
>>> 5.0 / 2.0
2.5

真正的除法。在未來的Python版本中,不管是整型還是浮點型除法,結果總是真實地商(保留小數部分),現階段可以通過執行from __future__ import division指令做到這一點。

>>> from __future__ import division
>>> 1 / 3
0.3333333333333333
>>> 5 / 2
2.5
>>> 1.0 / 3
0.3333333333333333
>>> 5.0 / 2.0
2.5

地板除。Python 2.2新加了一個操作符////除法不管運算元為何種數值型別,總是捨棄小數部分。

>>> 1 // 3
0
>>> 5 // 2
2
>>> 1.0 // 3
0.0
>>> 5.0 // 2.0
2.0

取餘數

>>> 1 % 3
1
>>> 5 % 2
1
>>> 5.0 % 2.0
1.0

冪運算

Python有冪運算子**

>>> 2 ** 3
8
>>> 2.5 ** 5
97.65625
>>> 4 ** -1
0.25

程式碼中分別計算23、2.55、4-1

複數

複數的表示。複數的表示如下:

>>> aComplex = 1 + 2j       //申明一個複數
>>> aComplex
(1+2j)
>>> aComplex.real           //複數實部
1.0
>>> aComplex.imag           //複數虛部
2.0
>>> aComplex.conjugate()        //共軛複數
(1-2j)
>>> 

複數的運算。複數的運算與實數一致。

>>> c = 1 + 2j
>>> d = 2 - 1j
>>> c + d
(3+1j)
>>> c - d
(-1+3j)
>>> c * d
(4+3j)
>>> c / d
1j
>>> c / 2
(0.5+1j)
>>> c * 2
(2+4j)
>>> c ** 2
(-3+4j)

math標準庫

Python有一個標準庫math專門用來做數學運算的。詳細介紹可參考Python的官方文件。要使用math庫,先要import這個庫。

>>> import math

一下的例子假設已經執行了import math

兩個常數

>>> math.pi             //圓周率pi
3.141592653589793
>>> math.e
2.718281828459045       //自然常數e

數值計算

  • math.ceil(x)。向上取整,返回最小的大於或等於x的整數。
>>> math.ceil(2)
2.0
>>> math.ceil(2.2)
3.0
>>> math.ceil(2.9)
3.0
>>> math.ceil(3.0)
3.0
  • math.floor(x)。向下取整,返回最大的小於或等於x的整數。
>>> math.floor(2)
2.0
>>> math.floor(2.2)
2.0
>>> math.floor(2.9)
2.0
>>> math.floor(3.0)
3.0
  • math.fabs(x)。取x得絕對值。
>>> math.fabs(1.0)
1.0
>>> math.fabs(-1.0)
1.0
  • math.factorial(x)。求x的階乘,x必須為整數,否則出現錯誤。
>>> math.factorial(5)
120
>>> math.factorial(4)
24
>>> math.factorial(2.1)     //執行錯誤
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: factorial() only accepts integral values
>>> 

冪和對數函式(Power and logarithmic functions)

  • math.exp(x)。返回e ** x
>>> math.exp(2)
7.38905609893065
>>> math.e ** 2
7.3890560989306495  //請忽略後面的不一致,計算機浮點數本身的問題
  • math.log(x [,base])。求以base為底的對數。
>>> math.log(math.e)        //值傳一個引數,預設以math.e為底
1.0
>>> math.log(math.e ** 2)
2.0
>>> math.log(8, 2)      //兩個引數,2為底
3.0
>>> math.log(100, 10)   //兩個引數,10為底s
2.0
  • math.pow(x, y)。冪運算,計算xy,相當於x ** y
>>> math.pow(2, 3)
8.0
>>> 2 ** 3
8
  • math.sqrt(x)**。求x的平方根。
>>> math.sqrt(4)
2.0
>>> math.sqrt(9.0)
3.0
  • 開根號。Python的math庫中只有開平方根,沒有立方根和n次方根,不過可以利用math.pow或者**,只需把根號變成分數。
>>> math.pow(4, 1.0 / 2)        //平方根,相當於math.sqrt(4)
2.0
>>> 4 ** (1.0 / 2)          //平方根,相當於math.sqrt(4)
2.0
>>> 8 ** (1.0 / 3)          //立方根
2.0
>>> 1024 ** (1.0 / 10)          //10次方根
2.0

三角函式(Trigonometric functions)

math庫中的三角函式使用的弧度(radians)計算,所以用角度(angle)計算前先要轉換成弧度。math也提供了角度和弧度的轉換函式。

方法名 實現功能
math.degrees(x) 把弧度x轉換成角度
math.radians(x) 把角度x轉換成弧度
>>> math.degrees(math.pi)
180.0
>>> math.radians(180.0)
3.141592653589793
  • math.cos(x)。不解釋。
  • math.sin(x)。不解釋。
  • math.tan(x)。不解釋。
  • math.acos(x)。反餘弦函式。
  • math.asin(x)。反正弦函式。
  • math.atan(x)。反正切函式。
  • math.hypot(x,y)。歐式範數(Euclidean norm)。相當sqrt(x*x + y*y)
>>> math.cos(math.pi)
-1.0
>>> math.sin(math.pi / 2)
1.0
>>> math.tan(math.pi / 4)
0.9999999999999999      //結果為1,計算機浮點數固有缺陷
>>> math.tan(math.pi / 4)
0.9999999999999999
>>> math.acos(-1.0)
3.141592653589793
>>> math.asin(1.0)
1.5707963267948966
>>> math.atan(1)
0.7853981633974483
>>> math.pi / 4
0.7853981633974483
>>> math.hypot(3, 4)
5.0

雙曲函式(Hyperbolic functions)

雙曲函式和三角函式類似。

  • math.cosh(x)。求x的雙曲餘弦函式。
  • math.sinh(x)。求x的雙曲正弦函式。
  • math.tanh(x)。求x的雙曲正切函式。
  • math.acosh(x)。求x的反雙曲餘弦。
  • math.asinh(x)。求x的反雙曲正弦。
  • math.atanh(x)。求x的反雙曲正切。
>>> math.cosh(1)
1.5430806348152437
>>> math.sinh(1)
1.1752011936438014
>>> math.tanh(1)
0.7615941559557649
>>> math.acosh(1.5430806348152437)
1.0
>>> math.asinh(1.1752011936438014)
1.0
>>> math.atanh(0.7615941559557649)
0.9999999999999999          //結果為1,計算機浮點數固有缺陷

一個複雜的例子

舉一個複雜的例子,計算下面的公式:
複雜公式

>>> - (4 ** (1.0 / 3)) / 4 * math.log(2 ** (1.0 / 3) - 1) - (math.sqrt(3) * (4 ** (1.0 / 3))) / 6 * math.atan(math.sqrt(3) / (1 + 2 * (2 * (1.0 / 3))))
0.24209140862733897

在前面的例子可能已經注意到了,計算機表示浮點數是不準確的,比如1.0成了0.9999999999999999。這是計算機浮點數表示法的固有缺陷。比如會出現如下結果:

>>> 0.05 + 0.01
0.060000000000000005
>>> 1.0 - 0.12
0.88
>>> 1.0 - 0.32
0.6799999999999999
>>> 1.0 - 0.42
0.5800000000000001
>>> 4.015 * 100
401.49999999999994
>>> 123.3 / 100
1.2329999999999999

浮點數的缺陷不僅僅在Python在存在,在任何語言都存在,它是浮點數表示法本身的缺陷。對於不是非常嚴格的計算,這種缺陷是可以接受的,而對於過於嚴格的計算,那麼應該用整型數計算(整型計算是精確的)。比如在保留兩位小數的計算中,可以把原始數乘以100取整數再計算,約定最後兩位為小數即可。

結語

本文介紹了Python標準庫的數學計算方法,通過使用Python標準數學庫,可以應付一些日常的基本計算(比如我就很少使用計算器了,一般的計算都用Python解決)。當然,數學是如此的豐富,僅有標準庫是遠遠不夠的。將來如果有需要的話,我會研究下使用其它的數學庫來進行更復雜的計算以及數學影象的繪製。比如NumPySciPyMatplotlibSymPy等。

相關推薦

Python數學計算基礎計算

摘要(Abstract) 本文介紹使用Python來做數學計算,在學習和工作中,經常會遇到一些數學計算的問題。一般人會使用計算器軟體,不得不說,計算器太難用了。專業人士可能會使用更強大的工具,如Matlab,但這種重量級工具有時可能並不適用。本文打算使用一

Python資料分析Numpy(二)

基礎索引和切片 numpy陣列索引是一個豐富的主題,有時候給你一個數組,可能你只想對其中一部分或者個別元素進行操作,這個時候就該索引出場了。 一維陣列十分簡單,表面上與Python list是一樣的。如下: In [60]: arr = np.arange(10) In [61]: ar

Python科學計算》——Traits為Python新增型別定義

Python作為一種動態程式語言,它沒有變數型別,這種靈活性給快速開發帶來了很多便利,不過它也有缺點。Traits庫的一個很重要的目的就是為了解決這些缺點所帶來的問題。 對Traits作用的理解 當函式,類或者一些封裝的通用演算法中的某些部分會因為資料型別不同而

python實現LBP特征點計算

i+1 [0 code read cvt lena 實現 ims numpy 1 import cv2 2 import numpy as np 3 4 5 def olbp(src): 6 dst = np.zeros(src.shape,dty

懶人動手,python一個基礎翻譯重新命名器(破解百度翻譯反爬手段)

想法: 在做開發的時候,經常需要命名各種變數,方法/函式,類,包,庫等。 走一遍流程就是:想好要起的名字,比如“非常帥氣”; 然後上翻譯網站,比如百度翻譯,有道翻譯; 將中文輸入並讓其翻譯成英文,此時就得出一個“very handsome”的單詞; 根據駝峰命名法,我們最後需要得

小明很喜歡數學,有一天他在數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。現在把問題交給你,你能不能也很快的找出所有和為S的連續正數序列? Good Luck!

/* 思路1: 1)由於我們要找的是和為S的連續正數序列,因此這個序列是個公差為1的等差數列,而這個序列的中間值代表了平均值的大小。 假設序列長度為n,那麼這個序列的中間值可以通過(S / n)得到,知道序列的中間值和長度,也就不難求出這段序列了。 2)滿足條件的n分兩種情況: n為奇數時,

JS基礎計算現在到2018年11.11日的同步倒計時

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Document</title> <sty

python量化投資系列比特幣---盤口高頻策略

使用方法:把上一篇的配置基礎,寫到一個python檔案中,檔名儲存為 OkcoinSpotAPI,然後把下面的程式碼,     寫到一個新的檔案中,儲存好,就可以直接運行了 原理:根據盤口買賣量,深度行情掛單量,進行買賣決策。屬於高頻策略。 注:該策略做過實盤,有回

Python進行有進度條的π計算

clas mil print 結合 spa sca rom math -i 1.tqdm是一個強大的終端進度條工具,我利用pip獲取tqdm函數庫。 2編寫代碼 2.1進行π的計算 from random import random from math imp

繞過010Editor網絡驗證(python一個仿真http server真容易,就幾行代碼)

headers redirect 如果 table 本地 align cnn 破解版 resp 010Editor是一款非常強大的十六進制編輯器,尤其是它的模板功能在分析文件格式時相當好用!網上現在也有不少010Editor的破解版,如果沒錢或者舍不得花錢買授權的話,去官方

Python數據分析 | 啟航

Python以前做數據分析,很多是用Oracle或者MySQL,通過SQL來完成查詢和統計數據分析,但是隨著數據量的增大,數據庫也跟隨著發展為NoSQL數據庫,由於數據庫及其底層技術架構的變化,數據分析算法也隨著變得復雜,而Python則實現這一任務適用的語言和工具。比如: In [36]: for i in

Python全棧開發基礎語法

deepcopy 分配 有符號 數字 桌面應用 存儲 tex 算術運算符 多行 No1. Python語言介紹 詳情見百度百科。。。 No.2 Python是一門怎麽樣的語言 詳情在百度百科。。。 No3. Python能做什麽 網絡應用、桌面應用、系統運維、機器學習、科學

Python影象處理

用Python做影象處理   用Python做影象處理        最近在做一件比較 evil 的事情——驗證碼識別,以此來學習一些新的技能。因為我是初學,對影象處理方面就不太瞭解了,欲要利吾事,必先利吾器

小哥Python兼職月入過萬,Python專案有多賺錢?

  加python程式語言學習QQ群 515267276即可自動獲取大量Python視訊教程以及各類PDF! 今天給大家分享一下2位前輩業餘接兼職做的一些Python專案。號主在這裡想說,無論你是自學還是進培訓班,只要把Python學好,錢自然而來。   問

python驗證碼

引用PIL模組 效果圖展示: from PIL import ImageDraw,ImageFont from PIL import Image import random from io import BytesIO#在記憶體中建立 def get_random_color()

python推薦系統(二)

一、簡介 繼上一篇基於使用者的推薦演算法,這一篇是要基於商品的,基於使用者的好處是可以根據使用者的評價記錄找出跟他興趣相似的使用者,再推薦這些使用者也喜歡的電影,但是萬一這個使用者是新使用者呢?或是他還沒有對任何電影做評價,那我們要怎麼去推薦他可能會有興趣的東西呢?這邊就是要介紹基於商品的相似度,我們開啟豆

Python量化】手把手教你python股票分析入門

內容來自:微信公眾號:python金融量化 關注可瞭解更多的金融與Python乾貨。 目前,獲取股票資料的渠道有很多,而且基本上是免費的,比如,行情軟體有同花順、東方財富等,入口網站有新浪財經、騰訊財經、和訊網等。Python也有不少免費的開源api可以獲取交易行情資料,如pandas自

室友玩個掃雷通關了還跟我炫耀!於是Python了個十秒鐘通關的自動掃雷程式,讓他受到了驚嚇!

起因是這樣的,室友和我一起玩掃雷高難度,今天他來告訴我他的通關了! 各種炫耀,如下圖! 於是,我用就用Python開發了個自動掃雷程式!跟他裝了逼,瞬間喊我哥,要我教他 好了,不廢話了!本文用於娛樂,歡迎大佬們指點! 進入正題 再說一句廢話,加v❤k

[Python] python一個遊戲輔助指令碼,完整思路

一、說明   簡述:本文將以4399小遊戲《寵物連連看經典版2》作為測試案例,通過識別小圖示,模擬滑鼠點選,快速完成配對。對於有興趣學習遊戲指令碼的同學有一定的幫助。   執行環境:Win10/Python3.5。   主要模組:win32gui(識別視窗、視窗置頂等操作)、PIL(螢幕截圖)、nump

Python了六百萬字的歌詞分析,告訴你中國Rapper都在唱些啥

《中國有嘻哈》火了,作為一名對中國HipHop毫無瞭解的吃瓜群眾,我開始好奇以下三個問題: HipHop到底在唱些什麼? 進群:943752371可以獲取數十套PDF文件! 各個國家和地區的 Rapper 們想要說的唱的都有哪些特色? 如果想當一個Rapper,我應該怎樣寫詞才能緊跟