Benjamin Chien

「創新」不是等人家告訴你,他需要什麼,而是你自已去發覺他需要什麼! 汽車大王亨利‧福特曾說過:“如果我當年去問顧客他們想要什麼,他們肯定會告訴我‘一匹更快的馬’”

關於我

我的相片
人生沒有什麼大道理!過就對了!

分類

Archives

顯示具有 Maxima 標籤的文章。 顯示所有文章

前面我們使用到一些人家已經寫好程式的函數,如solve(),diff()等等,我們在使用這些函數的時後,只需要輸入函數要求的數據,就可以得到相應的結果,然而有時我們也許會有需要,自訂自已的函數,舉例來說,今天我們希望能有一個函數,能夠將使用者輸入的數值乘以100倍,也就是說,當我們輸入函數名(5) ,結果會得到500。在這裡請不要在意這個函數有多麼無聊,因為這不是重點,這裡主要要說明的是如果編寫一個簡單的Maxima函數。

編寫函數前,第一件事就是要決定函數名稱,函數名稱有些規則,第一:只能使用英文和數字含底線符號等字元組成的函數名,第二:開頭的第一個字必須是英字字元,第三:函數名稱有區分大小寫,以下幾個名稱包含了正確和錯誤的命名:

  1. program1 -----------正確
  2. PROGRAM_1 -----正確
  3. 程式1 ----------------錯誤
  4. 1program -----------錯誤

因為這是本站第一個函數的教學,筆者就將它取名為first。編寫這個程式真的很簡單,但我們先不管這個函數要怎麼寫,我們先從first函數應該要怎麼運作開始思考,當我們輸入first(5),按下輸入後,maxima應該要輸出結果500,下面這行短短的幾個字,就可以完成我們需要的操作:

first(x):=block([n:x],n*100);

將上面的代碼輸入到maxima內,然後再輸入first(5),看看結果是不是會得到500。

函數詳解

接著就來說明那段程序的意義。上面那段程序就是標準的maxima函數,我們要把它分成兩部分來看,第一部分就是first(x),這一部份表示函數的輸入方式,函數名稱first,帶一個變數x。而第二部分就是block([n:x],n*100),這部分負責函數的實際運算方式,開頭的block是規定寫法, 如果沒有加上block,程序不會出錯,但會產生某些問題,有時這會嚴重影響計算的正確性,後面會說明。

同樣的在block括號內的程式,也要分成兩部分來看,第一部分是[n:x],,這邊先注意一點,因為函數不只有一段程式,所以彼此之間必須以「,(逗號)」做分隔,如果是最後一段程序,則不能加上逗號,這點要注意。再回到[n:x],這段的意思是「將x的值指定給n」,以這個函數而言,這一段實在是有點多此一舉,讀者可以試著把第一段刪掉(記得連逗號也要刪掉),再將原本的n*100改成x*100,一樣可以得到相同的結果,目前讀者還不了解這段的意義,因為後面的章節會再說明,所以當前你就照打就對了。最後一段就是把n乘上100,maxima會自動將最後一行的結果輸出到螢幕上,所以如果你輸入first(2),maxima就會輸出200。

接著再回到[n:x],這邊請讀者將原本的方括號去掉,變成n:x,完畢後記得按enter或shift+enter,再執行first(2)一次,相信結果一樣是200,那麼方括號的用處是什麼,請讀者直接輸入n,執行,maxima應該會輸入2,也就是說現在n已經被賦予2這個值,但是有時我們並不希望這種情況發生,我們在函數使用的變數,我們希望在函數結束後,變數也會自動銷毀,要達到這個結果就是使用方括號,程式結束後,maxima會自動幫我們銷毀方括號內的變數,現在讀者手動銷毀n變數,還記得是哪個函數嗎?

kill(n):使用這個函數。

然後把原本刪除的方括號加回去,再重新執行一次,再執行first(2),然後再執行n,執行n的時後,maxima會直接輸出n,而不是2,這表示n沒有被賦值。

前面提到方括號內的變數都會在程式結束後被銷毀,那麼x是不是也會被銷毀,答案是不會,因為x一開始就是全域變數,是無法被銷毀的。

在數學領域中,圖形佔有很重要的地位,很多公式都是由圖形推導出來的。一般公式看起來艱澀難懂,如果能夠轉化成圖形,常能幫助理解,這是我學習數學以來的深刻體會。

maxima提供plot2d(2D繪圖)和plot3d(3D繪圖),兩種繪圖函數,另外,在最近的版本中,還新增了draw繪圖套件(一樣是draw2d和draw3d),不管是plot還是draw,通通都是採用Gnuplot當做繪圖程式,簡單來說,plot和draw是負責maxima和Gnuplot之間的溝通工作,真正負責繪圖的Gnuplot。Gnuplot在自由軟體界非常有名,本身就是可單獨運作的數學繪圖軟體,也有許多需要使用到函數繪圖功能的軟體,選用Gnuplot當做它的繪圖程式。

但是這種兩個不同設計的軟體,彼此間是很難做到很完美的搭配,Gnuplot是相當強大的繪圖程式,但以使用plot等方式,很難完全發揮它的功能,這一點同學要有所了解,plot不是負責繪圖的,它是負責把Maxima的數據轉換成Gnuplot看的懂的數據,然後Gnuplot再將它畫出來。

Gnuplot不用再另外安裝,因為在安裝Maxima的時後,就已經包含了Gnuplot,如果要單獨開啟Gnuplot,請到 (安裝目錄)\Maxima-版本號\bin\ 底下開啟 wgnuplot.exe。不過gnuplot的操作不是我們的重點,現在我們就來看看使用maxima操作gnuplot的方式:

  1. plot2d (expr, x_range, ..., options, ...)
  2. plot2d ([expr_1, ..., expr_n], ..., options, ...)
  3. plot2d ([expr_1, ..., expr_n], x_range,..., options, ...)

plot2d (expr, x_range, ..., options, ...) 

提醒一點,如果要回到Maxima繼續你的操作,請記得要將gnuplot視窗關閉,因為maxima會等到gnuplot關閉了才會執行動作,可是問題是,沒有關閉,一樣可以進行輸入,所以筆者常常忘了這一點,在maxima打的很開心,按了Shift + Enter,卻沒反應,這時才想到忘了關gnuplot了。關閉的方法很簡單,有沒有看到右上角的「紅色打叉」按鈕,給它按下去就對了。

說明:

plot2d(sin(x),[x,-5,5],[nticks,100])$

第一個參數是要繪製函數,本例是繪製sin()正弦波形,第二個參數是x軸的顯示寬度,如果覺得x軸太小或太大,無法完整表現圖形的重點,可以視需要更改,要注意的是指定的數值是由小到大,以本例來說,你不可以寫成 [x,5,-5] 。函數的第1個跟第2個參數都是必須的。其它的參數是可選的,例如你也可以設定y軸的高度,如果不設定,則由系統決定適當的值,還有本例中的[nticks,100]:ntics是函數的取樣值,簡單來說,就是控制圖形的精細度,數值愈大,取樣愈多,圖形也就更精細,預設值是30,但是如果設的太多,運算時間也就愈長,這點同學要注意。

plot2d ([expr_1, ..., expr_n], ..., options, ...) 

你也可以一次繪製多個函數,函數用[ ](中括弧)括起來,函數之間用, (逗號)區隔開。

maxima會自動為不同的函數配上不同的顏色。

此外,plot還提供許多選項設定,如nticks就是其中之一,不過不是每個選項都是需要在程式中指定。在Gnuplot視窗中左上角的圖案,點選它,出現功能表,如下圖所示:

 

你可以在「Options」中,設定Background(背景色)、Choose Font(字型)、Line Style(線型),雖然不多,但有需要的話,還是很方便。

另外,使用功能列上的「Plot」也是方便的操作方式,點選「Plot」—>「Plot 2d ...」:

接著跳出Plot 2D 設定視窗:

這種設定方式,讀者應該會比較喜歡吧,在功能列上的大部分指令,都搭配了這種視窗來讓用戶輸入。從這張圖中,同學自已從前面的教學,找出對應的選項出來。

繪圖預設上,都是跳出gnuplot來顯示函數,但也可以選擇,在工作區上顯示,在「Format」:的下拉功能表中,選取「inline」:如下圖所示。

按下「OK」。現在不再跳出gnuplot視窗,而是直接在工作區上顯示圖形,如下圖所示:

另外,在「Options」也有許多選項可供設定,讀者可以自行去測試(後面的作業會考)。

最後是「File」選項,你可以將繪製的函數圖儲存為eps圖片檔,可惜並沒有辦法選擇一般的jpg,gif檔。注意一點,如果你有設定輸入,那麼就不會在工作區上顯示圖形。

總結:

本章介紹的都是2D繪圖的方法,3D部分,筆者要留到後面,有搭配需要3D圖形的函數時,再來介紹。同學目前有需要可以試著參照Help的說明來操作3D。另外,本章沒有討論到draw,是因為它和plot大致上是相同的,差別在於程式書寫的方式不同,同學一樣參照help中的說明,來區分不同之處。

作業:

  1. 。繪製左圖四個函數圖形,使用inline方式。(40%)
  2. (☆)求出x 趨近於無限大時的極限值,再將函數繪製成下圖,圖形顯示需與下圖相近,如果差別很大,同學必須調整,下圖中的x,y座標值,因為跟答案有關,所以我塗掉了,解答中必須出現x,y座標值:(60%)

 

提示:本題有點困難,首先同學要知道,函數圖形要表達的是什麼。本題函數圖形,要表達的是,當x 趨近於無限大時的,函數值會趨近於某個值,用圖形來說明的話,就是說當「青色線(x值)」一直往右跑時(愈來愈大),線段會接近於「紅色線(函數值)」,但不會重合,只會愈來感接近。本題就是希望你表達出這種感覺。

在本題會用到沒教到的plot函數(畫紅色線段用的), [discrete,x,y] ,為了不為難同學,提示再清楚一點,本題中應該是輸入成這樣: [discrete,[x1,x2],[y1,y2]]

題目不想弄的太困難,但是同學,如果可以加上更多效果,來突顯要表達的意義(如線段加粗、文字說明...等),會獲得加分。相關函數,自行到help尋找,但是不要偏離要表達的意義。

  1. limit (expr, x, val)
  2. limit (expr, x, val, dir)
  3. limit (expr)

limit (expr, x, val):

這裡解釋(%i2)的意義,還記得開頭加上一個「'(分號)」代表什麼嗎?開頭加上分號,後面的運算式將不會進行運算,直到遇到「=(等號)」,分號才失去作用,等號後的算式,如果沒有分號,則就會按正常進行運算,根據這樣的特性,我們可以製作出更接近手寫格式的顯示。如下圖所示:

眼尖的同學,會發現某一節的作業,有一題的解答,就是要求這樣,如果當時不會做,現在看起來,是不是很簡單啊!

limit (expr, x, val,dir): 

在極限,常常探討的是「趨近於0」或「無窮大」的結果。「趨近於0」,val 就是就是0,「無窮大」是「 inf(正無窮大) 」或「 minf(負無窮大) 」,第四個參數 dir 是指定要從正或負方向趨近(plusmInus),下圖是一些範例:

總結:

極限在微積分中是很重要的理論,雖然在微積分你會很少看到它,但的確是很重要,同學們對極限也應該要有所認識。

作業:

  1. 。計算左圖4道題目。 (50%)
  2. 。計算左圖四道題目。(50%)

雖然Maxima的基本函數還沒講完,但還是先介紹兩個微積分的函數,免得同學們跑光光。我知道很多人想學Maxima,是聽說Maxima可以解微積分,雖然筆者不認為光使用Maxima就可以學懂微積分,但用這來展現Maxima的強大威力,倒是不錯的切入點。

diff(expr,x)-微分

例題:求 的導函數。

解:

(圖1)

diff(arg1,arg2):使用方法很簡單第一個參數是欲微分的函數,第二個參數是微分的變數,這一部分聽不懂的話,請一定要回頭去看書,而不要執著於Maxima上。

有時後,我們不希望直接跑出計算結果,這時我們可以在開頭加上'(單引號):

再回到(圖1),如果我們希望把%o2指定給變數,例如g1,這部分沒有問題,但如果是指定給一個函數,例如g1(x),照之前教的來指定就會出現問題,如下圖所示:

不只微分是如此,只要函數指定的右邊,是屬於Maxima函數運算過後的結果,你就必須用兩個單引號和一對小括弧將它括起來,例如:

''(diff(f(x),x))

''(solve(f(x),x))

這樣運算結果才能正確指定給函數。

integrate(expr,x)-不定積分

有微分函數,當然少不了積分函數,用法與diff()相同。

當然integrate也可以計算定積分:

integrate(expr,x,a,b)-定積分

總結:

有關微積分函數,在後面會有更完整的介紹,目前同學只需要了解,基本操作方式即可。

作業:

(圖2)

  1. ☆請用文字說明(圖2)中 (%i1) 的意義。(10%)
  2. ☆請計算(圖2)中 x=5 時的值。(10%)
  3.  (圖3) 。(圖3)是微分基本定理,請用Maxima做出(圖3)的結果。提示: 會使用到兩個diff()。(20%)
  4. 。求出 y 對 t 的導函數。並計算 t=5 時導函數的值。(30%)
  5.  (圖4)  ,用Maxima展現方程式,如(圖4)所示。(20%)
  6. 對(圖4)進行定積分。(10%)

有些教學最後會有「家庭作業」,你可以做也可以不做,我並不強迫,但是因為筆者,有開放給同學發問問題,也會針對問題下去做教學,但是筆者不喜歡那一種,什麼都不看,就只知道說「我不會,救救我」的人,因此,有沒有繳交作業,就成了日後是否擁有這項權益的標準。

作業的難度,真的不高,只是驗收你學習的成效而已,大部分的解答,會在該教學文章得到解答,如果答案不是在文章,筆者會加註☆號,表示這一題,必須要看過之前的文章,可能才會解。

因為本站是教導Maxima,所以題目就是要你操作Maxima計算,不要手工求解,再掃描給我。

另外,筆者喜歡考申論題,沒錯,數學的題目考申論題,通常就是要你,用文字解釋為什麼要這麼做?這一段代表什麼意思?諸如此類的題目,請同學不要害羞,儘量回答,有時後是送分的,筆者只是想知道同學的看法而已,這可以做為筆者教學的參考,申論題不用寫太多,並且必須用Maxima寫,寫在註解Cell。

作業繳交格式:兩種檔案,Maxima檔案(*.wxm)是必須的,另外同學最好再附上圖片檔(Gif、Jpg…),方便筆者整理,大小要適中,如果解答有多張圖,請自行加上流水號(1,2,3…),有附上圖片檔的同學,有加分。

考卷格式:不用抄題目,但需註明為第幾題,如遇不會作答的題目,也一樣要註明第幾題。

Picture-47

E-Mail:請將解答寄到designforest@yahoo.com.tw,通常大概要等一個禮拜,筆者才會通知成績,請耐心等候

評分標準:各項分數,在題目後都會註明,此外,你真的不用太擔心,分數並不是唯一。

solve是Maxima最基本的求解函數,舉凡求多項次的解,解聯立方程式,都可以使用solve來求解。簡單的東西不用說的太複雜,現在我們就用幾個實例來說明solve的使用時機。

1:解二元一次方程式

本例中,只有一個變數x,使用solve可以不指定第二個參數solve(%,x),但習慣上還是建議加上去,沒必要省這種工夫。

2:解多變數方程式,求x

本例有兩個變數x和y,所以一定要指定第二個參數。

3.解聯立方程式

Solve:

說明:

第一行的看起來好像只有(%i1),事實上第一行包含兩個Input(%i1和%i2),還記得前面說過,每一行的輸入是以; (分號)做為結束嗎,所以(%i1)只到 為止,而下一段的 則是屬於(%i2),所以(%i2)是存在的,同學可以試著輸入%i2,看看結果。

此外,還要再說明一點,每個Input一定會對應一個Output,以%i1來說,它對應的就是%o1,所以你也可以從Output得知有幾個Input。

另外我們再複習一下變數的指定,的意思是說,我們把賦給了f1變數,同學可以輸入f1看看會有什麼結果,而f2也是一樣,這樣做的好處,是方便我們後面使用,畢竟用鍵盤輸入數學式,不是一件很容易的事,如果每次我們要用到就重打一遍,既不方便也不聰明。筆者建議同學們,要養成將算式指定給變數的好習慣。

接著來到%i3,本例是解聯立方程式,所以第一個參數會是一個以上的方程式,要注意是以[](方框號)把方程式括起來,而方程式之間是以「」(逗號)做區隔,而第二個參數,我們要求兩個不同變數的解,也是要用[](方框號)括起來,「」(逗號)做區隔。接著直接看%o3,我們得到

在%i3和%o3之間的一堆 'rat' replaced xxxxxxx,是因為浮點數轉換產生的訊息,不影響計算,但如果想關閉的話,你可以使用ratprint函數(預設是true),將它改為false。如下圖所示:

現在那些訊息不會出現了。

總結:

有關solve()函數,就是這三種用法,當然你可以計算的更複雜,例如計算3個方程的聯立,或是更多,隨你高興。

另外在例3提供一些概念,讀者要注意,反覆思考,這一些對你在往後的Maxima操作都會有所幫助。

作業:

.小明身上恰有23枚硬幣,共180元;其中5元硬幣有x枚,10元硬幣有y枚。

  1. 列出聯立方程式,並將其指定給var1和var2。(30%)
  2. 請想像,原先指定var1和var2變數的Input不見了,我們只知道這兩個變數確實存在,但不知道各自代表什麼,請問在Maxima,你會怎麼做,來知道var1和var2代表的意義?(20%)
  3. 求出5元硬幣有幾枚,10元硬幣又有幾枚?(20%)
  4. ☆請將先前指定的var1和var2變數刪除,並證明刪除成功。(30%)


在MAXIMA我們可以用 「 : 」來定義一個變數,上圖表示我們將 3y 定義給 x, 在%i2 我們直接呼叫x,maxima 跑出 3y,因為我們前面已經定義了 x=3y, 要清除變數我們可以使用 kill():


要清除所有變數,可以輸入 kill(all)。

要查詢設定了哪些變數,可以使用 values:

前面是定義變數,接著我們要定義一個「函數」;


跟定義「變數」不同,使用的是「:= 」。

我們也可以定義一個函數有兩個變數


要清除函數,一樣是使用 kill( )。

變數和函數的名稱,是區分大小寫的,在使用的時後要注意。

在做數學運算的時後,常會用一些數學符號,例如在計算圓的半徑,我們就會用到 π , π  為3.14....這個大家都知道,可是每次都要打一次就太不方便了,maxima就內建了π 的函數,當我們需要用到的時後,只需要輸入 「%pi」,maxima就會知道我們現在要的是「3.14159............」,而且maxima不會出現數值解,而是會出現「符號解」就是「π」這個符號,見下圖操作。

另外要注意一點,MAXIMA是有分大小寫的,預設數字大多是小寫,「%pi」 跟 「%PI」是不一樣的變數,大小寫要注意,建議要自定變數時,儘量以小寫為主,其次以筆者目前用的介面(wxmaxima)為例,預設是沒有開啟「希臘字型」,以上圖為例,如果沒開啟「希臘字型」就會出現下圖的顯示:

wxmaxima還是認的出「 %pi 」,只是顯示是以純文字來顯示,如果覺得這樣不美觀的話,可以去開啟「希臘字型」,開啟的方法:

「Edit」—>「Configure」

完畢後就可以見到「%pi」變成「π」,不過目前筆者「 %e」(指數)一直沒辦法正確顯示「 e 」,不過操作不成問題。

下面列出部分特殊符號對照語法:

一般數學常用的x,y,z,只需要就是輸入x,y,z即可,不用再加%。

此外,再提供一個希臘文字符號表:

使用方式,只需在符號的讀音前加上%,首字母大寫代表大寫的符號,小寫代碼小寫符號,以Ψ為例:

Recent Posts

Recent Comments

訪客