涂小琴
(云南師范大學(xué)文理學(xué)院,昆明 650222)
近年來數(shù)學(xué)建模競賽越來越受到學(xué)校與學(xué)生的重視,數(shù)學(xué)建模競賽在提高學(xué)生運用計算機(jī)能力來解決實際問題上起到了積極的作用。現(xiàn)在很多非數(shù)學(xué)學(xué)生都參與了數(shù)學(xué)建模競賽,有的是計算機(jī)相關(guān)的專業(yè),有的是物理相關(guān)的專業(yè),有的是數(shù)學(xué)相關(guān)的專業(yè),還有自動化相關(guān)的專業(yè)等,在現(xiàn)在大學(xué)的課程當(dāng)中,有很多的理科專業(yè)都會學(xué)一門基礎(chǔ)的計算機(jī)語言類課程,那就是C語言。對于一些從來沒有學(xué)過MATLAB的學(xué)生來講,在數(shù)學(xué)建模中應(yīng)用C語言來解決問題遇到的問題,無疑就是首選了。
C語言是一種面向過程的語言,用戶創(chuàng)建過程或函數(shù)來執(zhí)行他們的任務(wù)。面向過程的語言是很容易學(xué),因為它遵循的算法來執(zhí)行你的語句。要使用面向過程的語言開發(fā)程序,你需要畫/編寫算法,然后開始轉(zhuǎn)換成程序或功能。另外,C語言執(zhí)行速度較快,也提供了大量的函數(shù),程序員還可以根據(jù)需要自行編寫函數(shù),用戶自定義的函數(shù)還可以進(jìn)行擴(kuò)展,同時,C語言還是一種結(jié)構(gòu)化的程序設(shè)計語言。
C語言中有很多的數(shù)學(xué)函數(shù),這些數(shù)學(xué)函數(shù)可以幫助用戶在計算中解決問題,有三角函數(shù)、反三角函數(shù)、對曲三角函數(shù)、指數(shù)與對數(shù)函數(shù)、取整函數(shù)等,這些函數(shù)可以幫忙解決一些數(shù)學(xué)中的計算問題。當(dāng)然,能解決計算問題的還不只是這些函數(shù),還可以運用數(shù)學(xué)中的算法來編寫程序解決問題,例如,想要得到已知數(shù)中的質(zhì)數(shù),或想要知道多項式的值:

當(dāng)x=5時,f(x)的值是多少?
此時,可以運行程序編程來解決此問題,對多項式進(jìn)行分析

通過以上運算我們知道,求多項式f(x)的值,首先求多項式最內(nèi)括號中的值。
即求:
然后逐步向外層計算:


觀察發(fā)現(xiàn),求多值式f(x)的值,即可以轉(zhuǎn)化為以下:

至此,多項式f(x)的運算就能變成C語言中的循環(huán)運算。
運算結(jié)果如圖1所示。

圖1 運行結(jié)果圖
在數(shù)學(xué)建模競賽中,建立模型之后,需要有相應(yīng)的工具來進(jìn)行求解,雖然在數(shù)值計算上C語言沒法和MATLAB相提并論,但C語言也有自己的優(yōu)勢,就拿近幾年的全國大學(xué)生數(shù)學(xué)建模競賽的題目“碎紙片的拼接復(fù)原”來講,在復(fù)原時,建好模型后,采用的算法就可以用C語言來進(jìn)行。
在不經(jīng)過處理的情況下,圖片與圖片之間是無法進(jìn)行二進(jìn)制的匹配的。但是,數(shù)據(jù)化后,在制定的匹配原則下,便可以相似度基準(zhǔn)進(jìn)行匹配。
將題目所給的紙片圖片轉(zhuǎn)化成0-1矩陣[1]。將白色像素點轉(zhuǎn)化為數(shù)字“1”,黑色像素點轉(zhuǎn)化為數(shù)字“0”(用二進(jìn)制數(shù)組“1”和“0”分別表示黑、白像素點),然后,我們可以將生成的矩陣導(dǎo)入Excel電子表格中,以實現(xiàn)了圖片數(shù)據(jù)化。
如圖2所示。
由于圖像像素化后,已經(jīng)形成了微觀的細(xì)小的像素點(而且像素點只有黑色和白色兩種顏色),嚴(yán)格意義上,任何文字、圖像、半個文字、半個圖像等都能形成二進(jìn)制代碼(計算機(jī)語言就是二進(jìn)制),而且像素越高,則越精確。所以,我們制定以下匹配思想:先通過算法進(jìn)行紙條間的匹配,匹配后再通過匹配度來進(jìn)行人工干預(yù)。首先人為確定出最左側(cè)的首張紙條,根據(jù)其右側(cè)的邊緣上留下的墨跡,與其他的紙片左側(cè)邊緣進(jìn)行比較,選擇出相似度最高的一片,便能夠匹配在一起。

圖2 像素化圖

表1 匹配原則表
若設(shè)α表示匹配原則下匹配的結(jié)果(二進(jìn)制0、1值),β表示相似度的百分比,則可以得到以下公式:

在對紙條進(jìn)行匹配時,可利用C語言進(jìn)行編程來實現(xiàn),將數(shù)據(jù)進(jìn)行處理,轉(zhuǎn)換成.txt文件,并將紙片的數(shù)據(jù)存儲為數(shù)組文件,將數(shù)組的第一列數(shù)據(jù),與另一個數(shù)組的最后一列數(shù)據(jù)進(jìn)行匹配,若相同,則結(jié)果為1,若相異,則結(jié)果為0。
關(guān)鍵代碼如下:

當(dāng)數(shù)據(jù)很大時,需要借助程序來幫我們解決問題。運用C語言進(jìn)行編程對相似度的最大值與序號對應(yīng)關(guān)系進(jìn)行處理,優(yōu)化了算法,減少了大量的人工對比的運算步驟。
C語言的運算速度比較快,當(dāng)建模過程中,遇到了數(shù)據(jù)量較大的情況,第一種想法應(yīng)該是借助程序來解決問題,若有規(guī)律可循,則可以運用C語言中的循環(huán),或者是直接寫一個解決此類問題的函數(shù),在需要的時候進(jìn)行調(diào)用。這對于不熟悉MATLAB的學(xué)生來講,也是一種處理大量數(shù)據(jù)的方法。