精華區beta MATLAB 關於我們 聯絡資訊
因為有版友私下寫信給我.對於合併程式m-file的方法 做個解說. 私以為將自己的心得.作為拋磚引玉. 首先.為什麼小弟總是喜歡用副程式來撰寫程式呢? 小弟是讀化工的.研讀部分屬於化工中很特別的一種 程序控制與模擬.而我負責的部份為反應性蒸餾系統. 當我進行蒸餾塔模擬的時候.會有很恐怖的情形. 單板:微分方程式的數目與成分數同外.還得進行溫度對氣體蒸氣壓的影響 若果成分數達到4個.板數達到35個板.那麼方程式數目為 35*4 = 140 條微分方程式 = 變數的數目 三條微方+一條總組成 = DAE (微分代數方程式) 用 ode15s 解題器來解 (若果兩者不相同.那麼解出來就不會是唯一解.在此不討論多重穩態) 還不包含能量平衡方程式(有化學反應還得加入反應熱) 這樣大的程式是很恐怖的.有人說合併挺麻煩.太多看不清. 不過要是一個式子一個式子修改.反而是合併較為容易 而且還得計算熱力學模組(NRTL,WILSON,UNIQUAC,UNIFAC等等). 又得增加一個疊代迴路...那在修改時就很恐怖了.... 因為要把數據拿出來畫圖.常用到 " global " (全域變數宣告) 變的很不好改變程式碼 那麼我就想.將程式合併出來不就很好嗎?不過一開始都弄不起來 (那時候很菜.看到 MATHWORK 的檔案交換中心的人寫的東西.都覺得他們是怪物 不知道是怎麼併的.還有人寫成GUI.真是神 @@a.不過現在還是沒改變對他們的 崇拜就是了) 後來成功了.有兩點挺重要的.我就直接進入主題吧 1.使用 % ---------------------- 將副程式分出來 2.使用函數握把 @ .才可以順利求解 範例:function pptex2 握把--> [T,X]=ode45(@test2,[0 10],[0;0]) D=5.2; m=61; a0=346.05; L=10.6; Po2=8; Po1=1; N=(1-0.2.*X(:,2)./a0).^(7) M=(L-X(:,1)./L).^(-1.4) xlswrite('T',T,'T') xlswrite('X',X,'X') xlswrite('M',M,'M') xlswrite('N',N,'N') 分隔--> % ------------------------------------------------------------------ function dx=test2(t,x) D=5.2; m=61; a0=346.05; L=10.6; Po2=8; Po1=1; dx=zeros(2,1); dx(1)=x(2); N=(1-0.2*x(2)/a0)^7; M=(L-x(1)/L)^-1.4; dx(2)=(pi*D^2/(4*m)*0.1)*((Po2*N)-(Po1*M)); 一般利用MATLAB內建的函數使用時.大部分我們在使用的方式是如此的 (這邊指使用數值解方面的解題器.非解析解的) [OUTPUT,...]=FUNCTIONNAME( ' FILENAME ' ,CONDITION,FACTOR1,...) ^^^ ^^^ 在MATLAB中有一個使用指令與上面標記起來的用法類似.但是卻於使用副程式時 為必須條件.我個人使用時是發現.不使用函數握把時.無法使用副程式 (剛開始覺得自己很菜的原因竟然是不會打小老鼠 囧>) 所以請要使用的同好.使用函數握把吧.並且要將程式與程式之間隔開就是了. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.118.160.163
zhewei:我的方法是一個副程式一個m-file用久了,覺得管理很方便 09/16 22:48
zhewei:像未來如果這個function會被其他支程式call的話! 09/16 22:48
zhewei:我就會把他放在同一個資料夾內!!(主要是我會到處demo) 09/16 22:49
zhewei:這樣也不用考慮path的問題!! 09/16 22:49
leslielion:順便問1F一個問題 09/16 23:18
leslielion:我也是把副程式寫成一個m檔..然後在主程式call出來 09/16 23:18
leslielion:但我的副程式m檔是會自動建立.. 09/16 23:19
leslielion:但每次call的時候MATLAB會說找不到m檔 09/16 23:20
leslielion:請問你有遇過這種情況嗎? 09/16 23:20
leslielion:7108篇有我之前問的問題 09/16 23:21
zhewei:會不會是你的path沒有設對? 09/16 23:54
leslielion:path沒問題..執行第一次會出現找不到的錯誤訊息 09/16 23:56
leslielion:執行第二次就可以成功...很怪...=.= 09/16 23:57