Benjamin Chien

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

關於我

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

分類

Archives

在SW中,有時我們會需要檔案的路徑名稱,可以使用下面的程式來取得。

Dim swApp As Object
Sub main()
'Auther : Benjamin Chien
'Date : 2013/1/1

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc '取得當前文件
sPathName = swModel.GetPathName '取得檔案全路徑名稱
'如果是新檔案未儲存,那麼名稱為空白
If spatehname = "" Then
MsgBox "請先儲存檔案"
End
End If

MsgBox sPathName '輸出名稱至訊息框

End Sub

在程式中已說明,如果當前的檔案是新檔案,且未儲存,此時檔案名稱為空白,可以使用if判斷式,來提醒使用者做相應的動作。

 

剪貼板指的就是,選取一段文字後,按下Ctrl +C,這時這段文字會烤貝並放置到系統的一個區域,當你在適當的檔案或位置中按下Ctrl + V,複製的文字就會跑出。這就是剪貼版

剪貼板可以應用在,當你需要把檔案的相關訊息,例如名稱、屬性…,輸出到其他軟體中(例如excel),如果數量不多的話,這時剪貼板是一個簡單且快速的方式,因為大部分的軟體都支援剪貼的程序,就是上述說的Ctrl +C、V,如果數量多且雜,本程式就不是很適用。

程式中DataObject需要引用Microsoft Forms 2.0 Object Library,然而直接引用,是找不到這個庫,需要新建一個表單(Form),專案會自動引用Microsoft Forms 2.0 Object Library,後面可以將表單移除,已引用的Microsoft Forms 2.0 Object Library不會消失。

Option Explicit

Dim swApp As Object
Sub main()
'Auther : Benjmain Chien
'Date : 2013/1/1

Set swApp = Application.SldWorks

Dim myDataObj As New DataObject
Dim myStr As String
myStr = "人生本無常,大腸包小腸"
myDataObj.SetText (myStr)
myDataObj.PutInClipboard


End Sub

按下F5執行,現在你可以新增或開啟一個文字文件,或其他支援剪貼的程式(例如office所有的程式),按下Ctrl + V,應該會跑出程式中myStr內的字串。

如果把字串改為檔案的相關屬性,那些你需要的屬性,這時貼到所要用的軟體上,就很方便。

前面我們使用到一些人家已經寫好程式的函數,如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來解微積分題目,而題目大多來自課本(當然,大家用的課本不儘相同),利用這種方式,來加深同學學習的意願。這也是本站與其它maxima教學文章的最大不同,它們大多在基礎中提及大量的maxima函數,由於大多是單獨使用該函數,造成很難從中了解,該實際運用是在何處,也造成同學們的誤解,誤以為要將maxima學習到很深的境界,才有辦法運用在課程上,事實上,只要了解本站前面介紹的幾個基本maxima函數,你就可以進行微積分的解題了,而一些前面沒介紹,後面會用到的maxima函數,也會在第一次出現時,進行說明,所以同學現在應該清楚,本站採取的是step by step 的教學方式。

不過,我並不是說,了解那些函數沒有意義,事實上,有些函數在某些地方是不可或缺的,所以同學在後面遇到新的maxima函數,也要深入了解其用處及意義。

最後說明,maxima可以解出答案,但不會有所謂的「解題過程」 ,想偷雞的同學要失望了,我還是那句老話,不要只用maxima來學微積分,應該是讓maxima輔助你,在學習過程中更加順利。所以已經把書丟到垃圾桶的同學,趕快撿回來吧!

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

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%)

Recent Posts

Recent Comments

訪客