MATLAB OOP繼承多態(tài)——Picard和Aitken
? ? ? 說(shuō)明:由于面向大二學(xué)生,數(shù)值分析和微分方程數(shù)值解課程仍未學(xué)(大三開(kāi)設(shè)),僅以簡(jiǎn)單的數(shù)值分析內(nèi)容為例,目的是MATLAB如何根據(jù)原理編寫(xiě)算法,以及MATLAB本身語(yǔ)言的程序設(shè)計(jì)思路和語(yǔ)法知識(shí)。
? ? ? 學(xué)習(xí)面向未來(lái),本科階段不僅僅打下良好的理論基礎(chǔ),也應(yīng)在本科階段打下良好的編碼基礎(chǔ),不至于把編碼這個(gè)不大的問(wèn)題交給未來(lái)。計(jì)算數(shù)學(xué)是基礎(chǔ)數(shù)學(xué)應(yīng)用到科技創(chuàng)新的必由之路,尤其是國(guó)家層面的科技,更包括社會(huì)各行業(yè)的智能計(jì)算。
? ? ? ? 對(duì)于復(fù)雜方程 ,具體求根通常分兩步走:先用適當(dāng)方法獲得根的某個(gè)初始近似值
;然后再反復(fù)迭代,將
逐步加工成一系列近似根
,直到足夠精確為止。
1.? 不動(dòng)點(diǎn)迭代法
? ? ? ?不動(dòng)點(diǎn)迭代法又稱為 皮卡(Picard )迭代法、 逐次逼近法,不動(dòng)點(diǎn)迭代法是求方程在某區(qū)間內(nèi)單根的近似值的重要方法。
? ? ? ? 用不動(dòng)點(diǎn)迭代法求方程?的單根
的主要步驟為:
? ? ?(1)把?變形為
,稱
為迭代函數(shù)。
? ? ?(2)以為迭代公式,以
附近的某一個(gè)值
為迭代初值,反復(fù)迭代,得到迭代序列:
。
? ? ?(3)若此序列收斂,則必收斂于精確根 ,即
。
? ? ? ?方程?到?
的變形不唯一。迭代公式不同或迭代初值不同,迭代過(guò)程有的收斂,有的不收斂。
? ? ? ?不動(dòng)點(diǎn)迭代法的收斂性分析(略去)。
2. 埃特金加速法
? ? ? ? 埃特金(Aitken)加速法用來(lái)加快不動(dòng)點(diǎn)迭代法的收斂速度。先用不動(dòng)點(diǎn)迭代法算出序列,再對(duì)此序列作修正得到
,具體方法:
? ? ? ?用埃特金加速法對(duì)不動(dòng)點(diǎn)迭代法迭代過(guò)程加速得到的迭代序列記為
,則計(jì)算出
、
、
后,對(duì)
作以下修正:
然后用來(lái)逼近方程的根。
3. 斯特芬森加速法
? ? ? ? 埃特金方法不管原序列是怎樣產(chǎn)生的,對(duì)
進(jìn)行加速計(jì)算,得到序列
。如果把埃特金加速技巧與不動(dòng)點(diǎn)迭代法結(jié)合,則可得到如下的迭代法:
稱為斯蒂芬森(Steffensen)迭代法。斯蒂芬森迭代法是二階收斂的。
4. OOP的繼承與多態(tài)
4.1 繼承 ??
? ? ? ?定義一個(gè)?class?的時(shí)候,可以從某個(gè)現(xiàn)有的?class?繼承,新的class?稱為子類(Subclass),而被繼承的class?稱為基類、父類或超類(Base class、Super class)。
? ? ? 父類和子類的關(guān)系是一般和特殊的關(guān)系。例如水果和蘋(píng)果的關(guān)系,蘋(píng)果繼承了水果,蘋(píng)果是水果的子類,則蘋(píng)果是一種特殊的水果。
? ? ? ?從子類的角度看,子類擴(kuò)展(extend)了父類;但從父類角度看,父類派生(derive)出子類。也就是說(shuō),擴(kuò)展和派生所描述的是同一個(gè)動(dòng)作,只是觀察角度不同而已。
? ? ? ?多繼承增加了編程了復(fù)雜度,盡量避免在MATLAB算法設(shè)計(jì)中使用多繼承,而是使用單繼承,可以保證編程思路更清晰,避免更多麻煩。
? ? ? ?在設(shè)計(jì)Aitken類時(shí),則繼承了Picard類,Picard類稱為父類,Aitken類為子類。語(yǔ)法格式
? ?? ?子類除繼承父類的非私有屬性外,仍可定義自己獨(dú)特的屬性,如增加一個(gè)迭代時(shí)間屬性變量time
? ? ? MATLAB中繼承的特點(diǎn):
? ? (1)在繼承中,基類的構(gòu)造方法不會(huì)自動(dòng)調(diào)用,需要在子類的構(gòu)造方法中專門(mén)調(diào)用。
? ? (2)在調(diào)用基類的方法時(shí)需要加上self(因?yàn)楸舅惴ńy(tǒng)一采用self表示當(dāng)前類)前綴,后面為符號(hào)“@”(表示引用父類構(gòu)造函數(shù))和父類名稱,以及父類的參數(shù)。
? ? (3)在?MATLAB?中,首先查找對(duì)應(yīng)類型的方法,如果在子類中找不到對(duì)應(yīng)的方法,才到基類中逐個(gè)查找。如測(cè)試代碼中:aitken.plot_x_eps_curve(true) ,子類無(wú)定義,則在父類中查找。
? ? (4)子類獲得了父類全部非私有的功能。子類不能繼承父類中的私有方法,也不能被調(diào)用父類的私有方法。對(duì)于父類中擴(kuò)展的非私有方法,子類可以拿來(lái)即用。
4.2 多態(tài)
? ? ??多態(tài)性是指具有不同功能的函數(shù)可以使用相同的函數(shù)名,這樣就可以用一個(gè)函數(shù)名調(diào)用不同內(nèi)容的函數(shù)。在面向?qū)ο蠓椒ㄖ幸话闶沁@樣表述多態(tài)性:向不同的對(duì)象發(fā)送同一條消息,不同的對(duì)象在接收時(shí)會(huì)產(chǎn)生不同的行為(即方法)。也就是說(shuō),每個(gè)對(duì)象可以用自己的方式去響應(yīng)共同的消息。所謂消息,就是調(diào)用函數(shù),不同的行為就是指不同的實(shí)現(xiàn),即執(zhí)行不同的函數(shù)。
? ? ? ?多態(tài)性的優(yōu)點(diǎn):
? ? ?(1)增加了程序的靈活性:以不變應(yīng)萬(wàn)變,不論對(duì)象千變?nèi)f化,使用者都是同一種形式去調(diào)用;
? ? ?(2)增加了程序額可擴(kuò)展性。
? ? ? 如在Aitken類中重寫(xiě)了父類方法solve_nlinear_equ,同名方法iterative_output內(nèi)部引用父類方法并傳參。
5. Picard迭代法OOP設(shè)計(jì)(完整代碼)
? ? ? ?基類設(shè)計(jì)中,所有屬性的權(quán)限為protected,若為private,則子類無(wú)法繼承。設(shè)置為protected,類外不能被引用,但子類可以。
6. Aitken加速法OOP設(shè)計(jì),繼承Picard迭代法(完整代碼)
? ? ? ? 繼承父類PicardSolveNLEqu,并重寫(xiě)了父類方法solve_nlinear_equ;同名函數(shù)iterative_output中調(diào)用父類的同名函數(shù),并傳參;完整繼承父類的plot_x_eps_curve方法。
7. 案例測(cè)試
例1:用迭代法求方程在區(qū)間
內(nèi)的實(shí)根。其迭代函數(shù)構(gòu)造形式有三種,如下:
(1)?;
(2);
(3),不收斂。
Picard迭代法測(cè)試代碼如下,文件命名為test_picard.m
求解結(jié)果,此處不給出迭代過(guò)程的輸出。
可視化圖象

Aitken加速迭代法測(cè)試代碼如下,文件命名為test_aitken.m
輸出結(jié)果如下:增加了一項(xiàng)time的計(jì)算(迭代速度較快,若time為0,可多次運(yùn)行)。
可視化圖象:

第二種迭代函數(shù)形式的測(cè)試:
可視化圖象,由于迭代次數(shù)較多,不再標(biāo)記marker:

Aikten加速迭代法測(cè)試代碼,由于迭代速度較快,設(shè)置精度1e-20.
可視化圖象
