範例和常用函數

前言

我們在 98 學年度寒假集合了一批學生協助建立題庫,在這裡將碰到過的一些問題以範例題目的方式寫下來。除此之外,我們也說明了幾個在這個過程中常用的 Maple 函數。

我們在此感謝這幾位學生所提供的經驗。他們都是中央大學數學系四年級或碩士班的學生,分別是:林政佚、李姿慧、吳佩玲、呂明叡、林赭脗、李育誠、周艷伶、應灝。


範例

底下五個題目範例,已經匯出成文字檔:

這兩個題庫存檔內的題目是一樣的,目前的 Maple T.A. 必須用 ANSI 版的題庫,否則中文字會變成亂碼。但或許未來的 Maple T.A. 改變這個狀況,所我們還是將 UTF8 版也放上來。請讀者下載 ANSI 版並匯入 Maple T.A.。這五個範例要講解的內容很難用文字敘述說明清楚,因此我們做成五個範例,並將註解直接寫在範例當中。讀者可以一邊觀看題目,一邊用編輯題目的方式了解題目設計,必要時也可以修改部分內容做為測試。

為了讓讀者能快速找到需要的內容,我們列出每一題題目標題和重點。

標題重點
範例一:用 Maple-graded 判斷多項式是否相等
  • 在 Maple-graded 中,變數 $ANSWER 並不重要,重要的是判斷對錯的程式碼。
  • 要確定兩個多項式是否相同並不是相減等於 0 就好,還要用 simplify 簡化相減後的結果
範例二:亂數多項式
  • Maple 提供更多更強大的亂數產生器。
  • 呼叫 Maple 的亂數產生器時,記得先呼叫 randomize()。
  • 在 maple() 函數中如果要執行多個指令或程式,可以用分號或冒號隔開指令。
  • 呼叫 maple() 傳回的是最後一個輸出在螢幕上的結果,而不是最後一個執行結果。
  • 演算法生成的變數不但能用在題目敘述中,也能用在註解或答案欄。
範例三:畫圖
  • 要呼叫 Maple 畫圖指令,不能用 maple(),而是用 plotmaple()。
  • 圖片有兩種輸出類型,jpeg 和 gif。靜態圖片用 jpeg,動態圖片用 gif。
  • 輸出的圖片可以藉由改變參數 height 和 width 來調整大小。
  • 圖片會儲存在變數中,所以可以擺在任何地方,包括選擇題的選項。
範例四:Maple T.A. 的亂數函數
  • 簡單的情況下,用 Maple T.A. 的亂數函數會比較方便。
  • 利用 switch() 可以產生更多樣化的亂數題目。
  • 變數可以儲存中文字串,但是變數後不能直接跟著不是標點符號的中文字,這種情況下用大括號包住變數就可以解決了。
範例五:負數和括號
  • 在運算時,用括號包住變數會比較安全。

常用 Maple 函數

在編寫題目時,善用 Maple 功能會有很大的幫助。雖然 Maple 並不在本教材所能涵蓋的範圍當中,但我們還是根據經驗,將幾個常用的 Maple 函數列出來,並簡述其用途,詳細的說明請讀者自行參考說明文件。對 Maple 有興趣的讀者,也可以看一下計概十六講的 Maple 教材

微分

函數 diff(f,x) 會計算函數 f 對 x 變數的導函數。因此:

diff(sin(y),x);
結果是 0。

在說明文件中有提到,diff(f,x$2) 會計算 f 對 x 變數的二次導函數,但是請不要在 Maple T.A. 中用到這個功能,因為 $ 是 Maple T.A. 的保留字。要求二次導函數,請呼叫兩次 diff():

diff(diff(x5,x),x);

Diff() 也是 Maple 函數,但它不求導函數,只是印出微分的符號。雖然對計算沒有幫助,但在描述題目時是很有用的。

積分

底下這個指令

int(x^2,x=a..b);
會計算函數 x2 在 [a,b] 區間的積分值 (對 x)。而
int(x^2,x);
會計算 x2 的反導函數。

如果用 int() 計算反導函數時出現了其他 Maple 函數,有可能是因為輸入的函數沒有辦法寫出簡單形式的反導函數,所以用 Maple 定義的函數 (代表某個積分式) 表示。

同樣的問題也可能在計算積分時發生,但是 (定) 積分一定是某個實數,所以在碰到這種情況,可以用 evalf():

evalf(int(f,x));
Maple 會印出最接近精確值的浮點數。

和 Diff() 類似,Int() 並不計算積分或反導函數,而是印出積分或不定積分的樣子。

分片函數

有時候我們會想要定義分片函數:

f:=piecewise(x<-2,x,x>=-2 and x<2,sin(x),x>=2,1/x^2);
在此 f 在 x 小於 -2 時定義為 x,在 [-2,2) 區間定義為 sin(x),大於或等於 2 時定義為 1/x2

問題

最後我們列出一些曾經碰過且已經解決的問題,底下列出的這些問題多半是在建立亂數題目時才會碰到的,固定題目不需要擔心這些問題。

印出 3+5

在之前的範例中,我們習慣呼叫 Maple 中的 MathML[ExportPresentation]() 函數將輸出的數學式轉變成 MathML 格式 (比較美觀易讀)。但是 Maple 畢竟是計算用的數學軟體,而非排版軟體,所以我們沒辦法完全控制 Maple 照我們的想法輸出數學式,比如說:

MathML[ExportPresentation]("3+5")
Maple 印出來的是 8,我們找不到辦法控制 Maple 不去計算答案。

如果只是單純要印出 3+5,我們可以不透過 Maple,直接用 Mape T.A. 的 mathml() 函數:

$express=mathml(3+5);
但是 mathml() 函數無法顯示較複雜的符號,如積分。所以如果真的沒辦法,就只能選擇使用 Equation Edit。

印出括號

要印出括號也是我們常碰到的問題,因為 Maple 會吃掉大部分的括號。例如向量

(1,2,3,4,5)
中兩邊的小括號會被 Maple 吃掉。所以我們得在打字時自行加上括號:
($vector)
不過這樣會比較醜,所以如果要包住的是簡單的式子,可以用
$vec=mathml("($vector)");
會好看一點。

拿掉 (方) 括號

有些時候,Maple 函數產生的結果是包含在方括號中的向量,這時候我們得想辦法拿掉方括號。舉個例子,我們如果要對數列 8 2 5 9 做排序,可以用排序函數:

sort([8,2,5,9]);
得到的答案是
[2,5,8,9]
要拿掉括號,我們可以先將結果存起來:
v:=sort([8,2,5,9]);
再將每個元素拿出來
v[1]=2, v[2]=5, v[3]=8, v[4]=9
但是這個方法只有在事先知道向量長度時才有辦法使用。

如果不知道向量長度,那就比較麻煩了,底下就是我們找到的解決方案 (Maple 程式碼):

v:=sort([8,2,5,9]): v:=Array(v): vv:=v[1]: for i from 2 to ArrayNumElems(v) do vv:=vv,v[i]: end do: vv;

細節請讀者自行研究。

上一個主題:演算法

首頁