49
電子工程系四技部 使用 MATLAB 解微分方程 學生: 歐仕賢 王世宏 郭盛翔 王證凱 指導教授: 葉蘭英老師

電子工程系四技部 - ir.lib.ksu.edu.twir.lib.ksu.edu.tw/bitstream/987654321/2155/1/專題報告.pdf · 電子工程系四技部 ... (一) matlab內建ode解題器的種類 表(二)

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

  • 崑 山 科 技 大 學

    電子工程系四技部

    專 題 研 究 報 告

    使用 MATLAB 解微分方程

    中 華 民 國 九 十 五 年 五 月

    學生: 歐仕賢

    王世宏

    郭盛翔

    王證凱

    指導教授: 葉蘭英老師

  • I

    目 錄

    表 目 錄 … … … … … … … … … … … … … … … II

    圖 目 錄 … … … … … … … … … … … … … … … III

    第 1 章 序論 … … … … … … … … … … … … … 1

    第 2 章 研究動機 … … … … … … … … … … … … 8

    第 3 章 系統架構 … … … … … … … … … … … … 10

    3.1 數值積分與微分 … … … … … … … … … 10

    3.2 差分表示法 … … … … … … … … … … 13

    3.3 用 MATLAB 架構一個 ODE 的解題器 … … … … 16

    第 4 章 公式引導 … … … … … … … … … … … … 18

    4.1 一階常微分方程式 … … … … … … … … 18

    4.2 高階線性 O.D.E … … … … … … … … 28

    第 5 章 例題演算 … … … … … … … … … … … … 31

    第 6 章 介面測試 … … … … … … … … … … … … 34

    第 7 章 結果討論 … … … … … … … … … … … … 38

    參考資料 … … … … … … … … … … … … … … … 39

    附錄 A (MATLAB GUI 的程式) … … … … … … … … … 40

  • II

    表 目 錄

    表(一) MATLAB 內建 ODE 解題器的種類

    表(二) MATLAB 內建的 ODE45 解題器和真實計算值例題一的比較

    表(三) MATLAB 內建的 ODE45 解題器和真實計算值例題二的比較

  • III

    圖 目 錄

    圖(一) MATLAB GUI 的設計圖

    圖(二) 執行 GUI 的介面

    圖(三) 套入算式並畫出圖形

    圖(四) 取步階 X=0.1 比較 ODE45 和真實值例題一的圖

    圖(五) 取步階 X=0.1 比較 ODE45 和真實值例題二的圖

  • 1

    第 1 章 序論

    若不先知道一些關於微分方程式跟解決它們的方法,那麼要去

    欣賞這數學裡面重要的分支將會很困難.此外,微分方程式的進

    展是緊密的和數學的一般進步交織在一起而且是無法分離的.話

    雖如此,為了提供一些歷史上的展望,我們在這裡指出一些在這

    個學科裡主流的趨勢,並確認一些早期著名的貢獻者.另外一些

    歷史的資訊則被包含在散佈於這本書中的註腳或是各章節最後所

    陳列的參考中.微分方程式這一門學科起源於艾薩克.牛頓(1

    642-1727)和萊布尼茲(1646-1716)在十七

    世紀對於微積分的研究.牛頓在英國的鄉間長大,先後在 Trinity

    College,Cambridge 接受教育,並且於1669年在那裡成為數

    學的教授.他對於微積分和關於力學基本定理的劃時代的發現始

    自於1665年.這些知識廣泛的流傳於他的朋友之間,但是牛

    頓對於評論特別敏感,而且開始不公開他的研究成果直到168

    7他出版了他最聞名的書籍"Philosophiae Naturalis

    Principia Mathematica.".當牛頓像這樣做與微分方程小部分

    相關的工作時,他對於微積分的發展還有力學基本定理的發展提

    供了這些十七世紀的應用一個基礎,最特別的是尤拉.牛頓根據

  • 2

    dy / dx = f(x),dy / dx = f(y),dy / dx = f(x,y)來分類一

    次微分方程式.對於後期的微分方程式他發展了一個利用無窮級

    數解決的方法當 f(x,y)是一個含 x , y 項的多項式時.牛頓對於

    數學的積極探索結束於1960年代早期除了有時互相質問問題

    的解答和較早取得的成果的修定和公開.他被任命為英國鑄幣廠

    的看守人並且於幾年後辭去他的教授職位.他於1705年受封

    為爵士直到逝世,葬於 Westminster Abbey.萊布尼茲生於 Leipzig

    並且再他20歲時於 Altdorf 大學完成他的博士學位.他的一生

    從事於數種不同領域的學者工作.他主要在數學方面自學,因為

    他二十歲時對於數學的興趣與日俱增.萊布尼茲獨自地得到微積

    分的基本結果,即使略晚於牛頓,但仍是在1684年最早建立

    它們的.萊布尼茲非常清楚優良的數學符號的力量,而且我們對

    於微分的符號,dy / dx,還有積分的符號都得歸功於他.他在1

    691年發明了分離變數的方法,同構方程式的分離換算於19

    64年.他花費他的一生被任命為數個德國皇室家族的使節跟顧

    問,而這些皇室則提供他廣泛的遊歷和從事和其他數學加多方面

    的通信往來,尤其是伯努利兄弟.在通信的過程中許多微分方程

    式的問題就這樣的在十七世紀的信件中被解答.伯努利兄弟對發

    展解決微分方程的方法有很大的貢獻並拓展它們應用的範圍.

  • 3

    Jakob(1654-1705)於1687在 Basel 成為數學教授,而且

    Johann 被任命為相同的職位直到他的哥哥於1705年逝世後.

    他們兩個都很愛吵架,好猜疑,而且經常的捲入一堆爭論裡,特

    別是彼此互相爭論.除此之外,他們兩個也都建立起數種數學領

    域的重要貢獻.藉著微積分的幫助他們以將微分方程式化為公式

    的方式解決了大量的數學問題.一個由他們親手建立的,而且也

    導致他們之間許多衝突的問題,就是"捷線問題".捷線問題最

    後也是由萊布尼茲和牛頓再加上伯努利兄弟所解決.傳言,也許

    是假的,牛頓在勞累的一天的傍晚於鑄造場裡聽到這個問題,並

    且解出答案在晚餐後的晚上.他不具名的公佈了答案,但是 Johann

    一看到答案就說,"喔,我知道這是誰." Daniel

    Bernoulli(1700-1782),Johann 的兒子,當他還是個小孩的時候

    遷居到 St. Petersburg,並就學於新設立的 St. Petersburg 中等

    學校,但是又以植物學教授的身分於1733回到 Basel,晚些更

    成為物理學教授.他的興趣主要是偏微分方程式和它的應用.比

    方說,他的名字很容易被聯想到流體力學中的伯努利方程式.他

    也是第一個遭遇到一個世紀後成為貝賽爾函數的函數的人.十八

    世紀最偉大的數學家,尤拉(1707-1783),在 Basel 附

    近長大而且是 Johann Bernoulli 的學生.他於 1727 追隨他的朋

  • 4

    友 Daniel Bernoulli 到 St.Prtersburg.他的餘生到了 St.

    Prtersburg中等學校(1727-1741和 1766-1783)和 Berlin中等學

    校(1741-1766).尤拉是有史以來研究成果最豐富的數學家;他的

    研究成果聚集起來超過70冊.他的興趣涵蓋所有跟數學有關的

    範圍和許多領域的應用.即使在他生命最後的17年他瞎掉了,

    他的研究仍然持續沒有減少直到他生命中的最後一天.他主要的

    興趣是將力學問題用數學語言化成公式的敘述和他解決這些數學

    問題的方法的發展.用尤拉所研究的數學語言來說,"科學趨勢

    裡面最首先最偉大的工作就是應用於此的分析."在其他成就之

    間,尤拉於 1734-35 確認了一階微分方程式的準確性,在同一篇

    論文裡發展了積分子的定理,並且在 1743 年用常數係數給定了同

    構線性方程式的通解.他於 1750-1751 拓展了關於非同構方程式

    更新的結果.1750 的年初,尤拉開始頻繁的使用冪級數來解決微

    分方程式.他在 1768-69 也計畫一個數值的程序.建立了在偏微

    分方程式中重要的貢獻,並且給定了第一個關於微積分變數有系

    統的處理.拉格朗日(1736-1813)19歲時在他的故鄉 Turin 成為

    數學教授.他繼任了尤拉 1766 在 Berlin 中等學校數學主席的位

    置,並且在 1787 繼續前往巴黎中等學校.他最著名的就是他的不

    朽的成就"Mecanique analytique",建立於 1788 年,一個上等

  • 5

    且廣泛的有關於牛頓力學的論文.關於初等的微分方程式,拉格

    朗日在 1762-65 發表一個n階方程式的通解.晚些,在 1774-75,

    他給定了一個有關於助變數變化方法的完整發展.拉格朗日對於

    偏微分方程式和微積分變數的基本研究也是為人所熟知.拉普拉

    斯(1749-1827)還是孩子的時候居住於諾曼第但是於 1786 年搬到

    巴黎而且很快的在科學界裡出名,在 1768 當選了 Academie des

    Sciences.他在天文力學方面表現傑出,"Traite de mecanique

    celeste"被發表在 1799 到 1825 的五本書中.拉普拉斯方程式是

    數學物理許多分支的基礎,而且拉普拉斯廣泛的研究它與重力影

    響的關聯.拉普拉斯轉換也是以他為命名,雖然它之前被認為在

    解決微分方程式方面是沒有作用的因為無法被辨認,直到好一陣

    子以後才被接受. 到了十八世紀末期許多解決常微分方程式的基

    本方法都已經被發明出來.到了十九世紀大家的興趣開始較多轉

    向理論性問題的存在性跟獨特性的研究並且較少發展一些基本方

    法例如那些根據羃集合擴張的方法.這些方法在複數平面裡找到

    了自然的設定.因此,它們助益,並某些程度或多或少的鼓勵了

    複數分析函數定理的發展.偏微分方程式也開始被集中的研究,

    因為它們在數學物理方面的重要定理變的清楚.在這些函數關係

    的連結中,產生了確認常微分方程的解,重複的發生並且用盡一

  • 6

    切的去研究.在許多為人所共同熟知的高階抽象函數裡,許多都

    被聯想到數學家的名字,包括 Bessel , Legendre , Hermite ,

    Chebyshev , 還有 Hankel,還有很多其他人也是.許多藉由分析

    平均數來求得答案的微分方程式促成了數值近似值方法的研究,

    1900 年代發明了一些精確而有效率的數值積分方法,但是要去實

    際推行它們卻部分的遭受到了在實行時被用手或用較原始的計算

    設備的需要給限制住了.在最近的五十年裡功能強大而且多方面

    的電子計算機的發展已經廣泛的增大了那些被數值方法有效率研

    究的問題的範圍.在同一個時期也有很大的改善而且那些費力的

    數值積分因子也發展的可供讀取.專門給個人電腦的敘述也將解

    決許多重要的問題的能力提供給個體的學生.其他在二十世紀有

    關於微分方程的特性還有幾何或拓僕方法的建立,特別是非線性

    方程式.目標是至少要了解一個幾何上或是分析上對於一個解的

    性質行為的觀點.如果需要詳述更多的資訊,甚至可以包含使用

    數值近似值.經由過去的這幾年出現了兩個同時的趨勢.電子計

    算機,還有特別是電腦圖形,已經給予了關於非線性微分方程式

    的研究新的動力.非預期的現象,例如奇異吸引子,渾沌,和碎

    形,已經被發明並專注的研究,並且投入到各種新境界的應用裡.

    雖然被大家較為了解的,這是一門舊學科,但微分方程仍然是二

  • 7

    十世紀初許多吸引人而又重要但尚未被解決的問題的豐富來源。

  • 8

    第 2 章 研究動機

    數學一直是大家頭痛的科目,工程數學也不例外,再工程數學

    中 ODE(微分方程)是最基本也是最重要的。我們的這次的專題是利

    用 MATLAB 作輔助加上實際計算來了解 ODE(微分方程)。利用實際

    計算的精確值和 MATLAB 輔助的估計值,來交替的計算及逼近正確

    的答案並解初值問題,在其應用也可以拓展到電路學的 RC、RL 電

    路(一階ODE)和 RLC電路(二階或高階ODE)的元件充放電其計算時

    間常數(τ)…等。所得到的實際數值和估計數值,會以表格的方

    式呈現,可以一目瞭然,比較其誤差,也希望利用這個方式,可

    以對 ODE 有所了解。我們主要是要用 MATLAB 做出一個介面用數值

    去分析微分方程,因為 MATLAB 裡面有內建的解題器可以使用,在

    來我們會用一階微分跟二階微分公式計算出近似解跟精確解,在

    用我們用 MATLAB 跑出來的數值來互相比較誤差點到底差多少。

    使用 MATLAB 內建的解題器常微分方程式(ODE)應用很廣,也是一

    種很好的解題工具,MATLAB 有解題器(Solver)來解這種 ODE 的問

    題的解。

    MATLAB 的解題器分為五種,每個應用都不一樣。

    ode45 應用 Ringe-Kutta 解法的中階解法,解決非難問題,應用較廣。

  • 9

    ode23

    應用 Ringe-Kutta 解法的低階解法,解決非難問題。在容忍 誤差高的情況下,比 ode45 效率快。

    ode113

    應用 Adams-Bashforth-Moulton 解法的變階解法,解決非難 問題。在容忍誤差低的情況下,比 ode45 有效率。

    ode15s

    應用 Gear’s 數值差分方法,解決艱難問題。解決 ode45,oed 113 無法解決的問題。

    ode23s

    應用 Rosenbrock 修正的解法的二階解法,解決 ode15s 無法解決的問題,在容忍誤差高的情況下,比 ode15s 有效率。

    表(一) MATLAB 內建 ODE 解題器的種類

  • 10

    第 3 章 系統架構

    3.1 數值積分與微分

    積分與微分是解許多工程和科學問題的很重要的慨念,雖然有許

    多積/微分問題,可以用解析 (analytical) 的方式找到答案,但

    是有更多的積/微分式是無解析解存在,而必須以數質方法求解。

    在這裡我們將告訴大家,以 MATLAB 提供的函數解積/微分式是極

    其容易的。

    3.1-1 數值積分

    先考慮一個積分式的數學式如下:

    ∫=b

    adxxfK )(

    其中 a, b 分別為這個積分式的上限及下限,f(x) 則為要積分的

    函數。要求解上述的積分式,必須設定 a, b 和 f(x)。以 MATLAB

    的積分函數求解的過程亦同,也要定義 f(x) 及設定 a, b,還須

    設定在區間 [a, b] 之間離散點(discretized points) 數目,剩

    下的工作就是選擇精度不同的積分法來求解了。

    3.1-2 梯形法

    MATLAB 提供最簡單的積分函數是梯形法 trapz,我們先說明梯形

  • 11

    法語法 trapz(x,y),其中 x, y 分別代表數目相同的陣列或矩陣,

    而 y 與 x 的關係可以由是一函數型態(如 y=sin(x))或是不以函

    數描述的離散型態(像第八章介紹的 x 與 y 皆為離散點)。

    我們看一簡單積分式

    ∫ =−==−π π

    0 02)cos()sin( xdxxk

    以下為 MATLAB 的程式

    >> x=0:pi/100:pi; >> y=sin(x); >> k=trapz(x,y) k = 1.9998

    3.1-3 二次函數法

    MATLAB 另外提供二種積分函數,它們分別是辛普森法 quad 和牛

    頓-康茲法 quad8。三種方法的精確度由低而高,分別為 trapz,

    quad, quad8。由於這二種方法依據的積分法不同於梯形法,因此

    它們的語法就和 trapz 不同;其語法為 quad('function',a,b)

    (quad8 語法相同),其中 function 是一已定義函數的名稱(如

    sin, cos, sqrt, log 等),而 a, b 是積分的下限和上限。和 trapz

    比較,quad, quad8 不同之處在於這二者類似解析式的積分式,只

    須設定上下限及定義要積分的函數;而 trapz 則是針對離散點型

    態的數據做積分。

  • 12

    我們看一簡單積分式

    )(32 2/32/3 abdxxk

    b

    a−== ∫

    以下為 MATLAB 的程式

    >> a=0; b=0.5; >> kq=quad('sqrt',a,b) kq = 0.2357 >> kq8=quad8('sqrt',a,b) kq8 = 0.2357

    再來看一個較複雜的積分式

    >> x=-1:0.17:2; >> y=humps(x); >> area=trapz(x,y) area = 25.9174 >> x=-1:0.07:2; >> y=humps(x); >> area=trapz(x,y) area = 26.6243 >> area=quad('hump',-1,2) area = 26.3450 >> area=quad8('hump',-1,2) area = 26.3450

    3.1-4 數值微分

    若有一函數 f(x) 在 x=a 的微分可表示為

    axdxxdfaf

    =

    =)()(

  • 13

    上述微分項在幾何上的意義為在 x=a 點的切線斜率,這個觀念會

    應用在下面介紹的差分表示式,而數值差分即是用來求數值微分

    的方法。

    3.2 差分表示法

    我們知道一微分項的計算,可以在二相鄰點 x+h 和 x 間函數取

    下列極限求得

    xhx

    xfhxfdx

    xdfxf h −+−+

    == → )()()(lim)()( 0

    若 將 原 連 續 的 空 間 以 多 個 離 散 點 取 代 , 即 是

    KK ,,,,,, 1110 +− kkk xxxxx 。則上述的極限以離散點的方式計算,即是以

    下的差分式 (difference equation)

    kk

    kkk xx

    xfxfxf−−

    =+

    +

    1

    1 )()()(

    其中 kk xxh −= +1 ,而上式被稱為前向差分,因為是以 kx 為參考點,

    另一點 1+kx 在它之前。上式的幾何意義是以二點函數值 )(),( 1 kk xfxf +

    計算在 kx 的斜率。事實上,除了上式可計算在 kx 的微分值 )( kxf 外,

    也可以下列二式計算

    11

    11

    1

    1

    )()()(

    )()()(

    −+

    −+

    −−

    =′

    −−

    =′

    kk

    kkk

    kk

    kkk

    xxxfxfxf

    xxxfxfxf

    中央差分

    後向差分

    而高階微分項可以利用低階微分項來計算,舉例來說一個二階微

    分式可以表示為dx

    xfdxf )()(′

    =′′

  • 14

    所以對應的差分式有

    11

    11

    1

    1

    1

    1

    )()()(

    )()()(

    )()()(

    −+

    −+

    +

    +

    −′−′

    =′′

    −′−′

    =′′

    −′−′

    =′′

    kk

    kkk

    kk

    kkk

    kk

    kkk

    xxxfxfxf

    xxxfxfxf

    xxxfxfxf

    中央差分

    後向差分

    前向差分

    3.2-1 差分函數

    上述提及的後向差分式 nkxx kk ,,1,1 K=− − ,在 MATLAB 有對應的

    diff 函數來計算二相臨點的差值,它的語法為 diff(x),其中 x

    代表一組離散點 nkxk ,,1, K= 。假設有 x, y(x)的數據為 x=[1 3 5

    7 9],y=[1 4 9 16 25]則 diff(x)=[2 2 2 2], diff(y)=[3 5 7 9],

    注意二者皆以後向差分計算且數據點只剩 4 個而不是 5 個。而

    dxxdy )(的數值微分則為 dy=diff(y)./diff(x)。因此要計算下列多

    項式在 [-4, 5] 區間的微分 241027113)( 2345 −++−−= xxxxxxf

    可依以下方式求解

    >> x=linspace(-4,5); % 產生 100 個 x 的離散點 >> p=[1 -3 -11 27 10 -24]; >> f=polyval(p,x); >> plot(x,f) % 將多項式函數繪圖 >> title('Fifth-deg. equation') >> dfb=diff(f)./diff(x); % 注意要分別計算 diff(f)和 diff(x) >> xd=x(2:length(x)); % 注意只有 99 個 df 值,而且是對應x2,x3,...,x100 的點 >> plot(xd,dfb ) % 將多項式的微分項繪圖 >> title('Derivative of fifth-deg. equation')

    假設我們要找出上述多項式的局部極值 (local critical

  • 15

    value),可以利用局部極值所在點的微分為零,所以在這個點的

    左側及右側的二點微分值一定是一正一負,因此這二點的微分值

    相乘為負值,可針對此性質找出局部極值所在點。以原多項式的

    數據示範如下:

    >> product=dfb(1:length(dfb)-1).*dfb(2:length(dfb)); % 注意二相臨點值相乘的寫法 >> crit=xd(find(product> num=f(3:length(f))-f(1:length(f)-2); % 注意中央差分是 f(k+1)-f(k-1) >> deno=x(3:length(f))-x(1:length(f)-2); % 注意中央差分是 x(k+1)-x(k-1) >> df_c=num./deno; >> xd=x(2:length(x)-1); % xd 的點數只有 98 個 >> plot(xd,df_c) >> title('Derivative of fifth-deg. polynomial')

    以下的例子是針對數據組為離散型態,要注意的是原數據所代表

    的函數分佈並無明顯的折角,但是它的一階微分經數值微分計算

    後的微分函數分佈卻有極大的曲折變化。

    >> x=0:0.1:1; >> y=[-.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2]; >> plot(x,y,'o',x,y) >> title('y(x) data plot') >> ylabel('y(x)'), xlabel('x') >> dy=diff(y)./diff(x); >> xd=x(1:length(x)-1); >> plot(xd,dy) >> title('Approximate derivative using diff') >> ylabel('dy/dx'), xlabel('x')

  • 16

    3.3 用 MATLAB 架構一個 ODE 的解題器

    圖(一)MATLAB GUI 的設計圖

    圖(二)執行 GUI 的介面

  • 17

    圖(三)套入算式並畫出圖形

  • 18

    第 4 章 公式引導

    4.1 一階常微分方程式

    4.1-1 分離變數型微分方程式

    1.直接分離變數型

    類型 I :若方程式為 )()(' 21 yfxfy = 則可分離成

    ∫ ∫ += cdxxfyfdy )(

    )( 12

    類型 II :若方程式為 0)()()()( 2121 =+ dyyNxNdxyMxM

    則可分離 ∫ ∫ =+ cdyyMyNdx

    xNxM

    )()(

    )()(

    2

    2

    1

    1

    1. 可化簡成變數分離型

    (1) 齊次方程式型

    (i)齊次函數

    定義:設 f(x,y)為雙變數函數,λ為任意參數,若 f(λ

    x,λy)= λkf(x,y)則 f(x,y)稱為 k次齊次函數。

    定理:若 f(x1,x2,....,xn)為 k 次齊次函數,則下列偏

    導數nx

    fxf

    xf

    ∂∂

    ∂∂

    ∂∂ .....

    21

    ,, 皆為(k-1)次齊次函數。

    定理:(Euler 定理)若 f(x1,x2,....,xn)為 k 次齊次函

  • 19

    數,則 ),...,,( ..... 212

    21

    1 nn

    n xxxkfxfx

    xfx

    xfx =

    ∂∂

    +∂∂

    +∂∂

    (ii)齊次方程式

    (a) 若一階一次常微分方程式 ),(' yxfy = ,其中 ),( yxf 為

    一零次齊次函數,則稱此常微分方程式,為一階齊

    次常微分方程式。

    (b) 若一階一次常微分方程式

    M(x,y)dx+N(x,y)dy=0,其中 M(x,y)與 N(x,y)同為 m

    次齊次函數,則稱此常微分方程式,為一階齊次常

    微分方程式。

    (iii)齊次方程式之求解:

    令 vxy= (或 v

    yx= ), xvy =⇒ ,dy = xdv + vdx 代回即

    可求解。

    (2) 0)()( 222111 =+++++ dycybxadxcybxa 型

    類型 I:若2

    1

    2

    1

    bb

    aa

    ≠ 時,其解題步驟為:

    (i)求出0cybxa

    0cybxa

    222

    111

    =++=++

    之交點 ),( βα 。

    (ii)令βα

    +=+=

    vyux

    則dvdydudx

    ==

    將這些變換代入原即可求

    解。

  • 20

    類型 II:若2

    1

    2

    1

    2

    1

    ccm

    bb

    aa

    ≠== 時,其解題步驟為令 tybxa =+ 22

    代回求解。

    (3) )(' cbyaxfy ++= 型

    令 cbyaxt ++= 則badxdtdy −= ,代回求解。

    (4)齊權方程式(Isobaric Equation)型

    (i)定義:

    設一階常微分方程式為 0)',,( =yyxf ,若存在一常數 m,能

    使得

    )',,()',,( 1 yyxfyyxf rmm λλλλ =− 則稱此O.D.E 0)',,( =yyxf 為一階

    齊權之齊權 O.D.E。

    (ii)一般在判斷一階 O.D.E 是否為齊權時,除了使用

    基本定義外,亦可令 x 之權數為 1,y 之權數為 m, 'y 之

    權數為(m-1),而 γβα )'(yyx 之權數為 )1(1 −+⋅+⋅ mm γβα 用

    這些既權方式,將給定的 O.D.E 每項之權數算出。若存

    在一個 m 值使的每項之權數均為 r 時,則此 O.D.E 即為

    齊 r 權之齊權 O.D.E。

    (iii)若存在一個 m 使得 O.D.E 為齊權 O.D.E,則求解

  • 21

    方法一般是令 mxyu = 代入 O.D.E 中做為變數變換。

    (iv) O.D.E 為 0)()( =+ xdyxyhydxxyg 則必存在一個常數

    m = -1 ,使得 O.D.E 為齊權 O.D.E,故求解方法為令 xyu =

    代入 O.D.E 中做變數變換。

    4.1-2 正合型(Exact)

    1.正合 O.D.E

    (1)判別式:設 0),(),( =+ dyyxNdxyxM 為正合方程式,則

    xyxN

    yyxM

    ∂∂

    =∂

    ∂ ),(),(。

    (2)解題方法:若已知方程式 0),(),( =+ dyyxNdxyxM 為正合時,

    若其解為 cyx =),(φ ,則滿足

    ⎪⎪⎩

    ⎪⎪⎨

    =∂∂

    =∂∂

    ),(

    ),(

    yxNy

    yxMxφ

    φ

    ⎪⎪

    ⎪⎪

    +=

    +=

    ∫x

    x

    xgdyyxNyx

    yfdxyxMyx

    )(),(),(

    )(),(),(

    φ

    φ

    比較由積分所求出的兩式,即可求得 f(y)及 g(x),則原

    O.D.E 之解為 cyx =),(φ 。

    2.積分因子(Integrating factor)

    (1)設 0),(),( =+ dyyxNdxyxM 為非正合一階 O.D.E 之,若存在一

  • 22

    函數 ),( yxI 能使得 0),(),(),(),( =+ dyyxNyxIdxyxMyxI 變為

    正合,則 ),( yxI 稱為積分因子。

    (2)積分因子 ),( yxI 之求法:

    檢驗條件 積分因子

    1. )(xfN

    xN

    yM

    =∂∂

    −∂∂

    ∫= })(exp{)( dxxfxI

    2. )(yfM

    xN

    yM

    =−

    ∂∂

    −∂∂

    ∫= })(exp{)( dyyfyI

    3. )( yxfMN

    xN

    yM

    +=−

    ∂∂

    −∂∂

    ∫ ++=+ )}()(exp{)( yxdyxfyxI

    4. )(xyfxMyN

    xN

    yM

    =−

    ∂∂

    −∂∂

    ∫= )}()(exp{)( xydxyfxyI

    表(三)檢驗正合 ODE 的積分因子

    4.1-3 線性型

    1.一階線性 O.D.E.

    (1) 變形的一階線性 O.D.E.

    (і) 設(a(x)y – b(x)) dx + c(x) dy = 0,則此式可經整理

    )()(

    )()(

    xcxby

    xcxa

    dxdy

    =+

    故上式為一階線性 O.D.E.

  • 23

    (іі) 設 c(y)dx + (a(y)x – b(y))dy = 0,則此式可經整理得

    )()(

    )()(

    ycybx

    ycya

    dydx

    =+

    故上式 y 為自變數為因變數之一階線性 O.D.E.

    (ііі) 設 y' =)()(

    )(ybxya

    yc+

    ,則此式可經整理後得

    )()(

    )()(

    )()()(

    ycybx

    ycyb

    dydx

    ycybxya

    dydx

    =−⇒+

    =

    (2)一階線性 O.D.E. y' + p(x)y = Q(x) 求解的步驟:

    (і) 求積分因子 I(x) = exp[∫ p(x)dx]

    (іі) 通解為 I(x)y = ∫ Q(x)I(x)dx + c

    可線性化之一階一次 O.D.E.

    類型 I: Bernoulli Equation

    (1) Bernoulli Equation 之標準式為

    y' + p(x)y = Q(x)yn

    (2) 求解 Bernoulli Equation 的步驟為

    (a) 將 Bernoulli Equation 化為 y-ny' + p(x) y

    1-n = Q(x)

    (b) 令 t = y1-n

    則得dxdt = (1-n)y

    -n y'

    (c) 代入原式即可得一階線性 O.D.E

    類型 II:(dydv

    ) y' + p(x)v(y) = Q(x)

    其求解的方法為令 u(x) = v(y(x)),則 'ydydv

    dxdu

    =

    代入原式整理得dxdu

    + p(x)u = Q(x) 上式即為一階線性 O.D.E

  • 24

    Riccati 方程式

    (1) 標準式:y' = p(x)y2 + q(x)y + r(x)

    (2) 求解的方法:

    法一:(a)先找到 O.D.E 的一個特解 yp(x)

    (b)在令 y = yp(x) +)(

    1xu代入原式,即可得 u(x)函數的一

    階線性 O.D.E

    法二:令 y =)()(

    )('xuxp

    xu− 代回原 O.D.E 可得 u(x)函數的二階變係數

    線性 O.D.E 為 u'' – (q(x) + ')()(' u

    xpxp

    + r(x)p(x)u = 0

    4.1-4 配方法

    1.常見的全微分公式

    類型 I =± dydx

    ⎪⎪⎩

    ⎪⎪⎨

    ±±±±

    ±

    ))(ln()()()(

    )(

    1

    yxdyxyxmyxd

    yxd

    m

    m

    類型 II =± ydyxdx

    ⎪⎪⎪

    ⎪⎪⎪

    ±±

    ±±

    ±

    ))(ln()(21

    )()(

    21

    )(21

    2222

    122

    22

    22

    yxdyx

    yxmyxd

    yxd

    m

    m

  • 25

    類型 III =+ xdyydx

    ⎪⎪⎩

    ⎪⎪⎨

    ))(ln()()()(

    )(

    1

    xydxyxymxyd

    xyd

    m

    m

    類型 IV =− xdyydx

    ⎪⎪⎪⎪⎪

    ⎪⎪⎪⎪⎪

    +

    − )(tan)(

    )(ln)(

    )(

    )(

    122

    2

    2

    yxdyx

    yxdxy

    xydx

    yxdy

    2.求解的步驟:

    (1)將 O.D.E 化成 0),(),( =+ dyyxNdxyxM ,然後合併式中 ),( yxM 與

    ),( yxN 相

    同次或相同類型的函數的項。

    (2)提出合併項的公因式。

    (3)與類型 I~V 的全微分公式比較,即可求出積分因子。並且可

    順便積出 O.D.E

    的通解。

    NOTE :本法對 O.D.E 中 ),( yxM 與 ),( yxN 為多項式和分式時,尤為

    有用。

    4.1-5 Picard Method 近似解

  • 26

    定理 1: 存在定理(充分非必要)

    設一階 O.D.E 為 ),(' yxfy = ,且滿足初始值條件為 00 )( yxy = ,

    若 ),( yxf 在 byyaxx ≤−≤− 00 、 之長方形區域 R 內之所有點

    ),( yx 均為連續,及對 R內所有點 ),( yx 恆有 Kyxf ≤),( (K 為

    某常數),則該 O.D.E 之初值問題,至少存在一解 )(xyy = ,

    在 axx ≤− 0 內(其中 ),min( kba=α )。

    定理 2: 唯一定理(充分非必要)

    設一階 O.D.E 為 ),(' yxfy = ,且滿足初始值條件為 00 )( yxy = ,

    若 ),( yxf 與y

    yxf∂

    ∂ ),(在 byyaxx ≤−≤− 00 、 之長方形區域 R 內

    之所有點 ),( yx 均為連續,及對 R 內所有點 ),( yx 恆有

    Kyxf ≤),( ,且 Myf≤

    ∂∂

    (K,M,為常數),則該 O.D.E 之初值

    問題,在 axx ≤− 0 內,僅有唯一解 )(xyy = 。

    Picard Method 設 ),(' yxfy = 且 00 )( yxy = dtytfyyx

    xnn ∫ −+=⇒

    0

    ),( 10

    4.1-6 一階高次常微分方程式

    一階 n 次常微分方程式,其標準式為

    0),(),(),(),( 011

    1 =++⋅⋅⋅++−

    − yxapyxapyxapyxan

    nn

    n

    ( 'yp = )

    一階 n 次 O.D.E 其求解方法,一般可分為四種。

  • 27

    1. 分解因式法

    設 n 次 O.D.E 可因式分解成

    0)),(()),())(,(( 21 =−⋅⋅⋅−− yxfpyxfpyxfp n

    ( 'yp = )

    可得 ),(),,(),,( 21 yxfpyxfpyxfp n=⋅⋅⋅==

    設其解為 cyxcyxcyx n =⋅⋅⋅== ),(,),(,),( 21 φφφ

    故原式通解為 0)),(()),()(),(( 21 =−⋅⋅⋅−− cyxcyxcyx nφφφ

    2. ),( pxfy = 型(其中 py =' )的求解步驟

    (1) 對原式兩端取 x 之微分

    dxdp

    pf

    xfp

    dxdy

    ∂∂

    +∂∂

    ==

    則上式為以 x 為自變數,p 為因變數之一階一次 O.D.E。

    (2) 求解(1)中之 O.D.E 可得 cpx =),(φ

    聯立⎩⎨⎧

    =

    =

    ),(

    ),(

    pxfy

    cpxφ 去掉 p可得原式 O.D.E 的解為 0),,( =cyxϕ

    3. ),( pyfx = 型(其中 py =' )的求解步驟

    (3) 對原式兩端取 y 之微分

    dydp

    pf

    yfp

    dydx

    ∂∂

    +∂∂

    ==

    則上式為以 y 為自變數,p 為因變數之一階一次 O.D.E。

    (4) 求解(1)中之 O.D.E 可得 cpy =),(φ

  • 28

    聯立⎩⎨⎧

    =

    =

    ),(

    ),(

    pyfx

    cpyφ 去掉 p可得原式 O.D.E的解為 0),,( =cyxϕ

    4. Clairaut's 方程式

    Clairaut's 方程式其標準式為 )( pfxpy +=

    其解為 )(cfcxy += , c 為任意數

    4.2 高階線性 O.D.E

    4.2-1 函數之線性相依與線性獨立

    定義:設 )( )( )( 21 xuxuxu nL、、 為定義於 [ ]bax ,∈ 中至少可微分 1−n 次之

    n 個函數,則 Wronskian 行列式定義成

    )1()1(2

    2

    2

    )1(1

    1

    1

    21

    '''),,,(

    −−−

    =

    nn

    n

    n

    nn

    n

    u

    uu

    u

    uu

    u

    uu

    uuuWM

    L

    L

    L

    MML

    定理:設 )( )( )( 21 xuxuxu nL、、 的線性組合方程式為

    0)( )( )( 2211 =++ xucxucxuc nnL [ ]bax ,∈∀

    (1) 若 021 ==== nccc L ,則 )( )( )( 21 xuxuxu nL、、 為線性獨

    立。

    (2) 若 021 不全為、、、 nccc L ,則 )( )( )( 21 xuxuxu nL、、 為線性相

    依。

    定理:若對所有 [ ]bax ,∈

    (1) 若 nuuu L、、 21 為線性相依,則 Wronskain 行列式

  • 29

    W( nuuu L、、 21 )=0。

    (2) Wronskain 行列式 W( nuuu L、、 21 )≠ 0,則函數 nuuu L、、 21

    為線性獨立。

    NOTE: 逆定理不恒真。即 W=0 不一定線性相依。

    4.2-2 二階變係數線性 O.D.E

    1.二階正合 O.D.E

    設 O.D.E 為 )()()()()( 0'

    1)1(

    1)( xRyxayxayxayxa nn

    nn =++++

    −− L

    則為正合得條件為 0)()1()(")(')( )(210 =−+++− xaxaxaxan

    nnL

    2.因變數變換法

    (1)設 O.D.E 為 0)(')(" =++ yxQyxpy ,若 )(xu 為其一解,則 O.D.E

    另一線性獨

    立的解為 dxxu

    exuxvdxxp

    ∫∫

    =−

    )()()( 2

    )(

    故 O.D.E 的通解為 )()( 21 xvcxucy +=

    (2)設 O.D.E 為 )()(')(" xRyxQyxpy =++ 令 )()( xvxuy = ,代入變換

    (a)若已知 )(xu 為 O.D.E 的齊性解,則可得 )(')'2(" xRvupuuv =+ 。

    (b)若 ∫=− dxp

    eu 2 且

    (i)若 AppQ =−− '21

    41 2 (常數)時,則可得

    uRAvv =+" 。

    (ii)若 22

    41

    21

    xAppQ =−− (A 為常數)時,則可得

    uRv

    xAv =+ 2" 。

  • 30

    (c)由(a)(b)可求出 )(xv ,故可得 O.D.E 的解 )()( xvxuy = 。

    3.自變數變換法

    設二階線性 O.D.E 為 )()(')(" xRyxQyxPy =++ ,令 )(xzz = 帶入原

    O.D.E 中,

    可得 22222

    )'()'()'('"

    zRy

    zQ

    dzdy

    zPzz

    dzd y

    =++

    若 AzQ

    =2)'((常數)且 2)'(

    '"z

    Pzz +(常數), 則原式變成常係數線性

    O.D.E。

    4.因式分解法

    若二階線性 O.D.E 為 )()(')(")( 012 xRyxayxayxa =++

    可因式分解 )()()()()( 2211 xRyxcdxdxbxc

    dxdxb =⎥⎦

    ⎤⎢⎣⎡ +⎥⎦⎤

    ⎢⎣⎡ +

    (注意:若不同時為常係數或等維因子時,因子得排列會有順序)

    先令 yxcdxdyxbxz )()()( 22 += 代回上式,可得 )()()( 11 xRzxcdx

    dzxb =+

    為一階線性 O.D.E,可求出 z。再將 z 帶回 yxcdxdyxbxz )()()( 22 += 中,

    即可求得 )(xy 。

  • 31

    第 5 章 例題演算

    1. ;3' 2xyxy −= 5)1( =y

    將微分方程寫成線性形式

    231' xyx

    y =+

    若 0>x ,積分因子為 xee xdx

    x ==∫ ln1

    ,以 x乘以微分方程式,得

    33' xyxy =+

    33)'( xxy =

    積分

    cxxy += 443

    xcxxy += 3

    43)(

    其中 0>x 由初值條件,知

    cy +==435)1(

    故4

    17=c ,初值問題之解為

    x

    xxy417

    43)( 3 +=

    2. 0sin'3cos32'2 =−++ yxyyxyy ,2

    y(0) D=

  • 32

    原式可寫成

    0)cos3(2)(2

    =++ yxdxdx

    dxyd

    cyxdxdxyd =++ ∫∫∫ )cos3(2)( 2

    cyxxy =++ cos322

    由2

    )0( D=y ,可得 c=2)2

    (D ,即4

    2D=c ,故原式 O.D.E 之解為

    4cos3

    222 D=++ yxxy

    3. 1)0(,2sintan' ==+ yxxyy

    [解]:

    積分因子為 }{ }{x

    xdxxxIcos

    1coslnexptanexp)( =−== ∫

    cxxdxxdxx

    Iy +−==== ∫∫ cos22sin2sincos1

    因此 O.D.E 的通解為

    xcxxy coscos2)( 2 +−=

    由初始條件 1)0( =y ,可得 3=c ,故 O.D.E 的解為

    xxxy cos3cos2)( 2 +−=

  • 33

    4. 4x2ey'-y = y(0)=-3 x--1dx

    ee =∫

    [解]:

    3x-x-x 2eyy'-ee =

    ∫ ∫ +=== ce32dxe2dx2eye 3x3x3xx-

    x4x cee32y' +=

    y(0)=3 帶入

    C=311-

    x4x e3

    11-e32y =

    5. 3xy2-x

    1y' =+ y(3)=4

    [解]:

    2)-3x(xy2)y)'-((x =+

    ∫ +== c3x-x6xdx-3x2)y-(x 232

    2-xc3x-xy'

    23 += y(3)=4 帶入

    2-x-x2-x

    c3x-xy 223

    =+

    =

  • 34

    第 6 章 介面測試

    例題一. 3)0(,2'4 −==− yeyy x 真實解.

    xx eey3

    1132 4 −=

    x y(ode45) y(true) E

    0.00 -3.000000 -3.000000 0.000000

    0.10 -3.057744 -3.057744 0.000000

    0.20 -2.994783 -2.994783 0.000000

    0.30 -2.736071 -2.736071 0.000000

    0.40 -2.168002 -2.168002 0.000001

    0.50 -1.119274 -1.119274 0.000004

    0.60 0.667682 0.667682 0.000010

    0.70 3.579338 3.579338 0.000003

    0.80 8.194704 8.194703 0.000002

    0.90 15.380278 15.380278 0.000002

    1.00 26.431734 26.431733 0.000002

    表(二) MATLAB 內建的 ODE45 解題器和真實計算值例題一的比較

    圖(四) 取步階 X=0.1 比較 ODE45 和真實值例題一的圖

  • 35

    程式

    [yd.m]

    function f=yd(x,y);

    f=2*exp(4*x)+y;

    [test1.m]

    t0=0; tf=1; step=0.1;

    steps=floor((tf-t0)/step+1);

    [x,y]=ode45('yd',[t0:step:tf],-3);

    y2=2/3*exp(4*x)-11/3*exp(x);

    disp('x y(ode45) y(true)

    E');

    for i=1:steps

    fprintf('%4.2f%20f%20f%20f\n',x(i),y(i),y2(i),abs((y2(i)-y(i))/y2(

    i))*100);

    end

    x1=t0:(tf-t0)/300:tf;

    y1=2/3*exp(4*x1)-11/3*exp(x1);

    plot(x,y,'+-',x1,y1,'-');

    t0:區間起始值

    tf:區間終止值

    step:區間步階

    x:x 的值

    y(ode45):ode45 的值

    y(ture):ode 的實際值

    E :誤差|(ode45 的值- ode 的實際值)/ ode 的實際值|*100

  • 36

    例題二. 1)0(,2sintan' ==+ yxxyy 真實解.

    xxxy cos3cos2)( 2 +−= x y(ode45) y(true) E

    0.00 1.000000 1.000000 0.000000

    0.10 1.004946 1.004946 0.000000

    0.20 1.019139 1.019139 0.000000

    0.30 1.040674 1.040674 0.000000

    0.40 1.066476 1.066476 0.000000

    0.50 1.092445 1.092445 0.000000

    0.60 1.113649 1.113649 0.000000

    0.70 1.124559 1.124559 0.000000

    0.80 1.119320 1.119320 0.000000

    0.90 1.092032 1.092032 0.000001

    1.00 1.037054 1.037054 0.000002

    表(三) MATLAB 內建的 ODE45 解題器和真實計算值例題二的比較

    圖(五) 取步階 X=0.1 比較 ODE45 和真實值例題二的圖

  • 37

    程式

    [yd1.m]

    function f=yd1(x,y);

    f=sin(2*x)-y*tan(x);

    [test2.m]

    t0=0; tf=1; step=0.1;

    steps=floor((tf-t0)/step+1);

    [x,y]=ode45('yd1',[t0:step:tf],1);

    y2=-2*cos(x).^2+3*cos(x);

    disp('x y(ode45) y(true)

    E');

    for i=1:steps

    fprintf('%4.2f%20f%20f%20f\n',x(i),y(i),y2(i),abs((y2(i)-y(i))/y2(

    i))*100);

    end

    x1=t0:(tf-t0)/300:tf;

    y1=-2*cos(x1).^2+3*cos(x1);

    plot(x,y,'+-',x1,y1,'-');

    t0:區間起始值

    tf:區間終止值

    step:區間步階

    x:x 的值

    y(ode45):ode45 的值

    y(ture):ode 的實際值

    E :誤差|(ode45 的值- ode 的實際值)/ ode 的實際值|*100

  • 38

    第 7 章 結果討論

    由於之前我們學過 MATLAB 發現裡面有可以解 O.D.E 的解題

    器,所以從一開始的架構引導到微分積分的微分方程都有比較熟

    悉了,當然,我們中間也遇到了一些難題,像我們從一開始建立

    介面的時候只能輸入固定的函數,到現在我們架構出一個比較完

    整的 MATLAB 介面,中間我們克服了一些程式方面的問題和設計介

    面的問題,其中我們會選擇用 O.D.E45 來設計的原因是,它是可

    以解中階的題目,而且誤差也比較低,比較適合我們能設計出來

    的範圍,所以我們就利用 O.D.E45 來設計,現在已經可以完整的

    輸入一階到二階的函數,在設計完成後就可以利用計算能力強大

    的 MATLAB 來實際的演算例題,並利用內建的解題器和實際的手算

    來比較其數值,結果雖然沒有差很多,但是對初步接觸工程數學

    的學生來說幫助很大,而且有一些比較不好算的高階線性 O.D.E,

    用 MATLAB 可以輕鬆幫我們計算出結果,這樣有助於我們學習比較

    困難的題目,MATLAB 的語法使用簡單比起一些高階語言來的容易

    上手,且對於將來的一些工程上專業的問題都可以迎刃而解,除

    了一開始所說的理論以外還要實際來操作這就是我們這組專題最

    主要的目的。

  • 39

    參考資料

    1、黃孟康、蘇金佳 譯,2003,「高等工程數學」,東華書局。

    2、DUANE HANSELMAN、BRUCE LITTLEFIELD,2001,

    「Mastering MATLAB 6」,Prentice Hall。

    3、簡聰海,2000,「數值分析-使用 Visual Basic」,全華科技圖

    書股份有限公司。

    4、黃俊銘 譯,2004,「數值方法-使用 MATLAB 程式語言」,全華

    科技圖書股份有限公司。

    5、張智星,2004,「MATLAB 程式設計」,清蔚科技、鈦思科技。

    6、李顯宏,2005,「MATLAB 7.x 介面開發與編譯技巧」,文魁圖

    書。

  • 40

    附錄 A (MATLAB GUI 的程式)

    MATLAB GUI 的程式

    function varargout = pt03(varargin)

    % PT03 M-file for pt03.fig

    % PT03, by itself, creates a new PT03 or raises the existing

    % singleton*.

    %

    % H = PT03 returns the handle to a new PT03 or the handle to

    % the existing singleton*.

    %

    % PT03('CALLBACK',hObject,eventData,handles,...) calls the local

    % function named CALLBACK in PT03.M with the given input arguments.

    %

    % PT03('Property','Value',...) creates a new PT03 or raises the

    % existing singleton*. Starting from the left, property value pairs are

    % applied to the GUI before pt03_OpeningFunction gets called. An

    % unrecognized property name or invalid value makes property application

    % stop. All inputs are passed to pt03_OpeningFcn via varargin.

    %

    % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one

    % instance to run (singleton)".

    %

    % See also: GUIDE, GUIDATA, GUIHANDLES

    % Copyright 2002-2003 The MathWorks, Inc.

    % Edit the above text to modify the response to help pt03

    % Last Modified by GUIDE v2.5 20-Jan-2006 10:31:07

    % Begin initialization code - DO NOT EDIT

    gui_Singleton = 1;

    gui_State = struct('gui_Name', mfilename, ...

    'gui_Singleton', gui_Singleton, ...

  • 41

    'gui_OpeningFcn', @pt03_OpeningFcn, ...

    'gui_OutputFcn', @pt03_OutputFcn, ...

    'gui_LayoutFcn', [] , ...

    'gui_Callback', []);

    if nargin && ischar(varargin{1})

    gui_State.gui_Callback = str2func(varargin{1});

    end

    if nargout

    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

    else

    gui_mainfcn(gui_State, varargin{:});

    end

    % End initialization code - DO NOT EDIT

    % --- Executes just before pt03 is made visible.

    function pt03_OpeningFcn(hObject, eventdata, handles, varargin)

    % This function has no output args, see OutputFcn.

    % hObject handle to figure

    % eventdata reserved - to be defined in a future version of MATLAB

    % handles structure with handles and user data (see GUIDATA)

    % varargin command line arguments to pt03 (see VARARGIN)

    % Choose default command line output for pt03

    handles.output = hObject;

    % Update handles structure

    guidata(hObject, handles);

    % UIWAIT makes pt03 wait for user response (see UIRESUME)

    % uiwait(handles.figure1);

    % --- Outputs from this function are returned to the command line.

    function varargout = pt03_OutputFcn(hObject, eventdata, handles)

    % varargout cell array for returning output args (see VARARGOUT);

    % hObject handle to figure

  • 42

    % eventdata reserved - to be defined in a future version of MATLAB

    % handles structure with handles and user data (see GUIDATA)

    % Get default command line output from handles structure

    varargout{1} = handles.output;

    function edit1_Callback(hObject, eventdata, handles)

    % hObject handle to edit1 (see GCBO)

    % eventdata reserved - to be defined in a future version of MATLAB

    % handles structure with handles and user data (see GUIDATA)

    % Hints: get(hObject,'String') returns contents of edit1 as text

    % str2double(get(hObject,'String')) returns contents of edit1 as a double

    function yd =f(x,y);

    yd=eval(get(findobj('Tag','edit1'),'String'));

    % --- Executes during object creation, after setting all properties.

    function edit1_CreateFcn(hObject, eventdata, handles)

    % hObject handle to edit1 (see GCBO)

    % eventdata reserved - to be defined in a future version of MATLAB

    % handles empty - handles not created until after all CreateFcns called

    % Hint: edit controls usually have a white background on Windows.

    % See ISPC and COMPUTER.

    if ispc && isequal(get(hObject,'BackgroundColor'),

    get(0,'defaultUicontrolBackgroundColor'))

    set(hObject,'BackgroundColor','white');

    end

    function edit2_Callback(hObject, eventdata, handles)

    % hObject handle to edit2 (see GCBO)

    % eventdata reserved - to be defined in a future version of MATLAB

    % handles structure with handles and user data (see GUIDATA)

  • 43

    % Hints: get(hObject,'String') returns contents of edit2 as text

    % str2double(get(hObject,'String')) returns contents of edit2 as a double

    % --- Executes during object creation, after setting all properties.

    function edit2_CreateFcn(hObject, eventdata, handles)

    % hObject handle to edit2 (see GCBO)

    % eventdata reserved - to be defined in a future version of MATLAB

    % handles empty - handles not created until after all CreateFcns called

    % Hint: edit controls usually have a white background on Windows.

    % See ISPC and COMPUTER.

    if ispc && isequal(get(hObject,'BackgroundColor'),

    get(0,'defaultUicontrolBackgroundColor'))

    set(hObject,'BackgroundColor','white');

    end

    function edit3_Callback(hObject, eventdata, handles)

    % hObject handle to edit3 (see GCBO)

    % eventdata reserved - to be defined in a future version of MATLAB

    % handles structure with handles and user data (see GUIDATA)

    % Hints: get(hObject,'String') returns contents of edit3 as text

    % str2double(get(hObject,'String')) returns contents of edit3 as a double

    % --- Executes during object creation, after setting all properties.

    function edit3_CreateFcn(hObject, eventdata, handles)

    % hObject handle to edit3 (see GCBO)

    % eventdata reserved - to be defined in a future version of MATLAB

    % handles empty - handles not created until after all CreateFcns called

    % Hint: edit controls usually have a white background on Windows.

    % See ISPC and COMPUTER.

    if ispc && isequal(get(hObject,'BackgroundColor'),

  • 44

    get(0,'defaultUicontrolBackgroundColor'))

    set(hObject,'BackgroundColor','white');

    end

    function edit4_Callback(hObject, eventdata, handles)

    % hObject handle to edit4 (see GCBO)

    % eventdata reserved - to be defined in a future version of MATLAB

    % handles structure with handles and user data (see GUIDATA)

    % Hints: get(hObject,'String') returns contents of edit4 as text

    % str2double(get(hObject,'String')) returns contents of edit4 as a double

    % --- Executes during object creation, after setting all properties.

    function edit4_CreateFcn(hObject, eventdata, handles)

    % hObject handle to edit4 (see GCBO)

    % eventdata reserved - to be defined in a future version of MATLAB

    % handles empty - handles not created until after all CreateFcns called

    % Hint: edit controls usually have a white background on Windows.

    % See ISPC and COMPUTER.

    if ispc && isequal(get(hObject,'BackgroundColor'),

    get(0,'defaultUicontrolBackgroundColor'))

    set(hObject,'BackgroundColor','white');

    end

    function edit5_Callback(hObject, eventdata, handles)

    % hObject handle to edit5 (see GCBO)

    % eventdata reserved - to be defined in a future version of MATLAB

    % handles structure with handles and user data (see GUIDATA)

    % Hints: get(hObject,'String') returns contents of edit5 as text

    % str2double(get(hObject,'String')) returns contents of edit5 as a double

  • 45

    % --- Executes during object creation, after setting all properties.

    function edit5_CreateFcn(hObject, eventdata, handles)

    % hObject handle to edit5 (see GCBO)

    % eventdata reserved - to be defined in a future version of MATLAB

    % handles empty - handles not created until after all CreateFcns called

    % Hint: edit controls usually have a white background on Windows.

    % See ISPC and COMPUTER.

    if ispc && isequal(get(hObject,'BackgroundColor'),

    get(0,'defaultUicontrolBackgroundColor'))

    set(hObject,'BackgroundColor','white');

    end

    % --- Executes on button press in pushbutton1.

    function pushbutton1_Callback(hObject, eventdata, handles)

    % hObject handle to pushbutton1 (see GCBO)

    % eventdata reserved - to be defined in a future version of MATLAB

    % handles structure with handles and user data (see GUIDATA)

    x_min=eval(get(handles.edit2,'String'));

    x_max=eval(get(handles.edit3,'String'));

    x_step=eval(get(handles.edit4,'String'));

    xspan=(x_min:x_step:x_max);

    y0=eval(get(handles.edit5,'String'));

    [x,y] = ode45(@f,xspan,y0);

    plot(x,y,'rd-');

    xlabel('x');

    ylabel('y');

    grid;

    專題封面1.pdf1444.pdf專題報告444.pdf