如何把數學實時應用到編程上?
「實踐應用是最好的興趣(激)觸發師!」怎樣通過編程體現數學樂趣?比如說:學習了這個數學知識,如何把今天所學到的方法技巧運用到生活上?運用到編程上呢?而且通過編程的方式,能檢驗體現到底有沒有真正學會。
解決了這道問題後,我可以把解題思路方法,通過編程的形式怎樣體驗出來?〔通過有趣的編程體驗數學的好處樂趣從而促進學習興趣,避免枯燥乏味的學習方式〕。同樣的,如果一個人對這個有興趣,自然而然就能體現,品質質量、體現效率。而且得到實踐運用後,能加深理解消化。怎樣把學到的東西,實時運用到編程上呢?
謝邀。少年,見你骨骼驚奇,必定是萬中無一的練武奇才。這本「武林秘籍」就送給你了:
- 演算法導論(原書第3版) (豆瓣)
MIT課程、筆記、PPT:Introduction to Algorithms (SMA 5503)
希望你能好好利用。不如去做一下 ACM 的題目。
有趣是一個很主觀的概念,枯燥也不一定是壞事。我個人認為,編程並不比學數學更有趣。
人一般都會有這種體驗:當你剛開始接觸一個領域的知識時,你會感到很新奇、很有趣,但是越深入地學習,趣味就會逐漸減少,或者說變得枯燥,這是很正常的。對於學生來說,"枯燥"並不是一件壞事情,他們應該學會忍受枯燥,因為在以後的職業生涯里,枯燥可能是主流、有趣可能只是偶然現象。如果學習時一感到枯燥就無法繼續,必須停下來尋求某種更加形象、有趣(同時也必然是更加低效、耗時)的學習方式,那麼這個人有可能不能走得更遠。
想想看,為什麼高等數學書對初學者來說比較抽象?編寫者大可以給每個例子配上精美的插圖,每個定理都舉一反三,每個有廣泛應用的推論都附上程序實現和進一步解釋。他們之所以沒有這麼做,是因為這樣一來,300頁的書就會變成3000頁,而學習者就要花3年時間來讀完而不是3個月,後續課程就要用30000頁紙才能滿足這些大腦沒有適應抽象思維的讀者的需要。精簡的代價只是——它很枯燥。然而忍受了這枯燥,學習者就會鍛鍊出更多的耐心,從而為未來學習更加抽象、有用的知識打下基礎。
用操作系統來做個類比:Windows系統可以打開很多窗口,用滑鼠操作,讓普通用戶感到方便、友好,視覺飽滿;很多基於Linux的操作系統只有命令行,操作者要記住大量命令。對於普通用戶,後者很枯燥,但是對於專業程序員,視窗、滑鼠點擊反而是非常低效的操作,在命令行里輸命令才是最高效、快捷的工作方式。
總而言之,形象、生動、有趣地授課,對於提高非專業學生的興趣很有幫助,但是一旦他們打算真正入門,這些要求會使學習變得低效。我個人也並不提倡教師通過耗費學生的大量時間,試圖把本身並不那麼有趣的知識用有趣的方式教授給他們,因為這事實上是一種誤導。教師不會永遠去教這個學生,他總有一天要自主地去學習,在那之前,他最好能憑藉自己的判斷,來決定一門課有沒有趣,適不適合自己。還是那句話:
有趣是一個很主觀的概念,枯燥自有它的好處。我相信很多成年人寧願自己小時候能夠忍受更多枯燥,從而掌握更多技能,使自己能夠在長大以後掙更多的錢,自由自在地花錢去構買有趣的享受。
這個難說,個人覺得主要是要多看和多研究數學領域的paper和與數學有關的書籍,然後不斷通過訓練來加強自己的論文編程實現能力。我一些書籍可以推薦一下。
此外,推薦一個訓練平台。https://projecteuler.net/上面有很多都是數學題,並且無論使用什麼語言,編程計算出正確答案即可。每周都會出一道新題。當然,也還有其他,不如題主先去征服完Project Euler再找其他題來訓練。
最後,正如所說,興趣才是最好的老師。人生苦短我用python
numpy 高效率的數組運算庫(矩陣)scipy 常用數學工具庫(線性代數 微積分 最優化 擬合 統計 傅里葉 信號處理 常微分方程)sympy 和scipy差不多,但是支持符號運算matplotlib 畫圖工具,另外matplotlib需要安裝ipython 要不顯示不了圖像,雖然不是庫但是安裝方法同下推薦一本書 python科學計算 張若愚計算機系慎入,我已經把c++全忘啦學習路線:
先在官網下python安好下pycharm以後就可以用pycharm來編程了
看 a byte of python重點理解面向對象編程(學過c java的同學需要注意 python是解釋型語言 所以可以像matlib那樣用 需要在pycharm的工具欄打開python console)學習庫 網站http://scipy-lectures.cn/#(注 快速入門 更深入見官方文檔)庫的安裝在cmd命令控制符里 cd 接 空格 接python安裝路徑Scripts加回車然後敲 easy_install 接 空格 接你要安裝的庫名比如 &>cd c:Python27Scripts 回車&>easy_install sympy 回車覺得高票答案選的書有點太計算機了,人家是學數學的,演算法的話我實際應用常接觸的是樹那一章和網路那一章,然後再就是最優化問題。個人看法,要看演算法也別看那個大書,我學校用的就不錯叫 演算法設計與技巧分析 一沙特人寫的,學數學的必定是高手,演算法這種東西一看就明白了。一次與其他團隊的合作,把要解決的問題抽象為整數優化問題,用PuLP求解之。
問題大致是:現有M條數據(每條數據含有多個元素),在滿足各元素出現次數不小於n的條件下選擇最少數量的數據
抽象為整數優化問題:是否選擇數據使用變數 表示,
目標函數是 ,
約束條件是 數據含有元素個數的向量矩陣 * &>= n 。
想要把新學的數學知識用起來?
可以嘗試Mathematica和matlab這兩個數學軟體Experiments with MATLAB騷年,快來學範疇論吧,Haskell裡面就一大堆範疇(哭)
也許你需要《數值分析》(工科本科叫《計算方法》),題主,加油
====================二次更新,我是負責的分割線===============================
不知道題主目前在讀大學還是高中,認真看了一下題主的提問,大意是希望通過編程提高對數學的興趣,我覺得上面的我的回答就有些不對題了,這麼看來,應該是這個網站比較適合題主:About - Project Euler這個網站的首頁說的很清楚,我把它貼在下面,希望能幫到題主:之前,我在coursera上學Matlab時,那個課程的老師布置的作業里很多都是用Matlab編程解決數學問題,上面很多題目老師都標註了收到這個網站上題目的啟發,題目都是一個個有趣的數學問題,需要用計算機解決,當時我做完上面的題目後真的感覺數學和計算機結合起來了,挺有意思的,希望能幫到題主。比如說:這個題目:形式化軟體開發滿足你的要求,比如haskell,prolog,原汁原味的lisp等。不過個人感覺吧,這些語言還不是很完美,存在諸如函數式編程對狀態一刀切和邏輯編程運行效率太低等問題。畢竟形式化軟體開發這個領域不溫不火的。。。基本沒多少人去研究。
就數學來說,現代數學和編程的思維方式並無太大的區別,都是在研究邏輯結構。只不過數學建模的過程非常嚴謹而大多數軟體工作者都是憑著直覺去寫代碼...如果你在寫代碼時思維能從如何解決這個問題轉變為這個問題的基本性質是什麼時,那你就是在使用數學的思維方式去編寫程序了。而且使用這種思維方式寫出來的程序不但邏輯結構清晰而且不容易出bug。
比如一個基本的輸入兩個數輸出它們的和的程序。
一般人的思維方式是:先處理第一個數的輸入,再處理第二個數的輸入,然後相加,輸出結果。而數學的思維方式是:存在兩個輸入ab和一個輸出c,c=f(a, b)=a+b。再比如實現一個gui框架,很多計算機剛入門的人都不知道該怎麼寫。
而有些人的思維是:gui就是在桌面上畫圖的程序,首先需要一個畫列表的程序,然後要一個畫按鈕的程序,然後要一個畫文本框的程序....。而數學的思維方式是:存在一個畫圖空間IMAGE作為輸出,存在一系列的畫圖程序a,b,c,d... ∈ GUI組件 可在這個空間上作畫IMAGE(t+1)=a(IMAGE(t)) + b(IMAGE(t)) + c(IMAGE(t)) + ... 此處加法一般自己定義,自己定義的代數的運算規則最好符合抽象代數中的定義,這樣你能方便的將這個新代數與數學中一些已經非常成熟的領域聯繫起來,當然也能使得新代數的研究更加方便。此時gui抽象化的大體框架就搞定了,然後再進行具象化,gui組件可分為按鈕,文本,容器等多種類型的組件,重點思考一下容器組件c ∈ GUI組件 (註:容器組件就是一個能包含其他組件的組件,比如內部窗口,布局管理器等都是容器組件)。存在一個子畫圖空間CIMAGE ? IMAGE作為輸出,其c包含了組件ca,cb,cc,cd... ∈ GUI組件 可再這個空間上作畫CIMAGE(t+1) = ca(CIMAGE(t)) + cb(CIMAGE(t)) + cc(CIMAGE(t)) + ... ,此處還可以發現如果加法的定義一樣,那CIMAGE的演化方程和IMAGE的一模一樣,而CIMAGE是IMAGE的子空間,所以還能推出在IMAGE上容器組件構成一個樹形結構blablabla....,逐漸逐漸的整個gui框架就成型了,邏輯嚴謹,簡單抽象。數學的思維方式:研究問題的性質和關係(哲學,物理,應用數學,....),通過關係列出方程(系統,建模,應用數學),解方程的過程就是在解決問題(純粹數學,數學工具)。
而且現代數學本身就像編程一樣,比如一個公理系統,公理就是介面,無論什麼東西只要滿足某個領域或系統的公理,那麼這個東西必然存在那個領域或系統中由公理推出的結論。比如線性代數的八條公理,無論你的數據載體是向量,還是函數,還是數組,還是其他亂七八糟的東西(你甚至可以自己瞎jb定義一個),只要滿足這八條公理,那麼你就能用這個數據建立一個標準的向量空間,並且向量空間中的所有結論都在你的這個空間上成立。
通過公理就是介面這個概念,可以在不同的數學結構(不同的數學領域)建立聯繫,這就是為啥你看這個數學領域的書時,這個書會引出和使用那個數學領域的結論成果,明明它們倆看似毫不相干。通過數學的這個性質,在編寫程序時自己如果能建立一套完整的數學系統,說不定也能和數學中已經存在的某個系統建立聯繫然後用那個系統中的結論來解決你現在的問題呢。上面所建議的自己創建的代數最好符合抽象代數的定義(實現抽象代數的介面)也就是這個意思。
不過數學系統也有局限性,那就是數學建模的對象必須有一種潛在的規律,數學沒辦法研究毫無規律的對象,當然理論物理和系統論現在有一些成果,比如突變論,協調論,耗散結構論和數學中的新興學科模糊數學可以研究一些"不太有規律"的對象。而分形,混沌等可以近似研究複雜的對象。反正還是那句話,如果你能以數學的方式寫程序,以數學的方式對程序進行建模,那麼大多數的問題都能以數學的方式得到解決。
至於演算法,計算機演算法主要涉及到數值分析,數論,運籌學,比較強調計算。而數學思維遠遠不只是計算...它是一種思維方式,計算只不過是對象潛在規律的一種表現而已。現代數學都是以結構為主。比如抽代,拓撲,泛函,範疇論等,聽說代數幾何也是結構性非常強的數學學科,然而入門門檻太高....目前我也還在學習中不敢妄言。如果題主說的「編程」是計算機的話,那麼我做出以下回答。計算機科學與技術只是數學的一個小小的分支。線性代數,高等數學,概率論這三門本科的基礎數學在計算機領域的應用就很多。談談我在工作學習中接觸到的吧。如搜索引擎、推薦系統和計算機圖形學都會用到線性代數。一些經典的機器學習演算法如隱語意模型等也會用到線性代數。高等數學在神經網路中有所應用。概率論更不用說了輸入法的聯想功能我們每天都在用。就我個人而言本科大一大二階段覺得學的數學實用不好的原因可能是眼界不夠,同時編程能力還不夠熟練。當然如果學校安排計算機系的老師帶著應用的例子教這些數學知識可能會少走些彎路。最近在重撿線性代數,水知乎看到了這個問題就簡單回答一下。
最簡單的情況:我在Unity中寫剛體移動邏輯時用到了三角函數來把力分解到X,Y軸
我有時候看論文看到一些小結論,一下子想不出怎麼證,會快速地用R編個程序出來,先實證地說服自己結論為真,然後再試著證明。
來搞計算機圖形學。
我在做ios應用的那段時間運用數學的東西並不多。但是從踏入遊戲圈之後,才會發現數學運用的地方多了去,矩陣,線代,向量都只是基本功
我只聽說過 math for computer science,沒聽說過computer science for math ......
我知道的,數學在編程上的應用大概是:
1,各種結構,集合,關係,圖 ......
設計各種數據結構就是為了能高效的表示和使用這些數學結構,來表示各種事物。
2,induction
設計演算法背後的直覺
3,概率論
聽說有很多隨機化的演算法和數據結構。
另外還有函數式編程那一套理論,背後有一整套程序語言設計原理,表達力非常強。
我對數學和編程都是一知半解,就不繼續扯下去了。
參考
https://www.youtube.com/watch?v=L3LMbpZIKhQlist=PLB7540DEDD482705B
Randomized Algorithms
喜歡這個問題但是更關注初高中甚至小學數學的應用
編程有辦法不用數學??
不想當碼農,就要有很深數學功底。
計算機說到底還是只會計算,
只有01兩種變數 只會有限的邏輯運算、移位運算所以你覺得,編程中怎麼可能少得了數學?去做底層,去研究演算法吧。不如先刷完ProjectEuler?
推薦閱讀:
※從哲學的角度去看待數學是屬於唯物主義還是唯心主義?
※所有質數都能表示成 2 和 3 的整數次冪之和或之差嗎?
※怎樣直觀的理解有限覆蓋定理?
※數學中有哪些條件看似很弱卻能推出很強的定理的例子?
※數學專業的學生抄書有幫助嗎?