最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

MATLAB OOP繼承多態(tài)——Picard和Aitken

2022-05-18 22:05 作者:鳴鳳在竹-白駒食場(chǎng)  | 我要投稿

? ? ? 說(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ù)雜方程f(x)%3D0 ,具體求根通常分兩步走:先用適當(dāng)方法獲得根的某個(gè)初始近似值 x_%7B0%7D%20;然后再反復(fù)迭代,將x_%7B0%7D%20逐步加工成一系列近似根x_%7B1%7D%2Cx_%7B2%7D%2Cx_%7B3%7D%2C...,直到足夠精確為止。

1.? 不動(dòng)點(diǎn)迭代法

? ? ? ?不動(dòng)點(diǎn)迭代法又稱為 皮卡(Picard )迭代法、 逐次逼近法,不動(dòng)點(diǎn)迭代法是求方程在某區(qū)間內(nèi)單根的近似值的重要方法。

? ? ? ? 用不動(dòng)點(diǎn)迭代法求方程f(x)%3D0?的單根x%5E*%20的主要步驟為:

? ? ?(1)把f(x)%3D0?變形為 x%3D%5Cvarphi%20(x),稱%5Cvarphi%20(x)為迭代函數(shù)。

? ? ?(2)以x_%7Bk%2B1%7D%3D%5Cvarphi%20(x_%7Bk%7D)%2C%20k%3D0%2C1%2C2%2C...為迭代公式,以x%5E*%20附近的某一個(gè)值x_%7B0%7D為迭代初值,反復(fù)迭代,得到迭代序列:x_%7B1%7D%2Cx_%7B2%7D%2Cx_%7B3%7D%2C... 。

? ? ?(3)若此序列收斂,則必收斂于精確根x%5E*%20 ,即%5Clim_%7Bk%5Cto%20%5Cinfty%20%7D%20x_%7Bk%7D%3Dx%5E*%20。

? ? ? ?方程f(x)%3D0?到?x%3D%5Cvarphi%20(x)的變形不唯一。迭代公式不同或迭代初值不同,迭代過(guò)程有的收斂,有的不收斂。

? ? ? ?不動(dòng)點(diǎn)迭代法的收斂性分析(略去)。

2. 埃特金加速法

? ? ? ? 埃特金(Aitken)加速法用來(lái)加快不動(dòng)點(diǎn)迭代法的收斂速度。先用不動(dòng)點(diǎn)迭代法算出序列%5Cleft%5C%7B%20x_%7Bk%7D%20%5Cright%5C%7D%20,再對(duì)此序列作修正得到%5Cleft%5C%7B%20%5Cbar%7Bx%7D%20_%7Bk%7D%20%5Cright%5C%7D%20,具體方法:

? ? ? ?用埃特金加速法對(duì)不動(dòng)點(diǎn)迭代法x%3D%5Cvarphi%20(x)迭代過(guò)程加速得到的迭代序列記為%5Cleft%5C%7B%20x_%7Bk%7D%20%5Cright%5C%7D%20_%7Bk%3D0%7D%5E%7B%5Cinfty%7D,則計(jì)算出x_%7Bk%7D、x_%7Bk%2B1%7D、 x_%7Bk%2B2%7D后,對(duì)x_%7Bk%2B1%7D作以下修正:

%5Cbar%7Bx%7D%20_%7Bk%2B1%7D%3Dx_%7Bk%7D-%5Cfrac%7B(x_%7Bk%2B1%7D-x_%7Bk%7D)%5E2%7D%7Bx_%7Bk%2B2%7D-2x_%7Bk%2B1%7D%2Bx_%7Bk%7D%7D%20%2C%20k%3D0%2C1%2C2%2C...

然后用%5Cbar%7Bx%7D%20_%7Bk%2B1%7D來(lái)逼近方程的根。

3. 斯特芬森加速法

? ? ? ? 埃特金方法不管原序列%5Cleft%5C%7B%20x_%7Bk%7D%20%5Cright%5C%7D%20是怎樣產(chǎn)生的,對(duì)%5Cleft%5C%7B%20x_%7Bk%7D%20%5Cright%5C%7D%20進(jìn)行加速計(jì)算,得到序列%5Cleft%5C%7B%20%5Cbar%7Bx%7D%20_%7Bk%7D%20%5Cright%5C%7D%20。如果把埃特金加速技巧與不動(dòng)點(diǎn)迭代法結(jié)合,則可得到如下的迭代法:

y_%7Bk%7D%3D%5Cvarphi%20(x_%7Bk%7D)%EF%BC%8Cz_%7Bk%7D%3D%5Cvarphi%20(y_%7Bk%7D)%EF%BC%8Cx_%7Bk%2B1%7D%3Dx_%7Bk%7D-%5Cfrac%7B(y_%7Bk%7D-x_%7Bk%7D)%5E2%7D%7Bz_%7Bk%7D-2y_%7Bk%7D%2Bx_%7Bk%7D%7D%EF%BC%8Ck%3D0%2C1%2C2%2C...

稱為斯蒂芬森(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:用迭代法求方程x%5E4%2B2x%5E2-x-3%3D0在區(qū)間%5B1%2C%201.2%5D內(nèi)的實(shí)根。其迭代函數(shù)構(gòu)造形式有三種,如下:

(1)?x_%7Bk%2B1%7D%3D%5Cvarphi%20(x_%7Bk%7D)%3D(3%2Bx_%7Bk%7D-2x_%7Bk%7D%5E2)%5E%7B1%2F4%7D;

(2)x_%7Bk%2B1%7D%3D%5Cvarphi%20(x_%7Bk%7D)%3D%5Csqrt%7B%5Csqrt%7Bx_%7Bk%7D%2B4%7D-1%20%7D%20;

(3)x_%7Bk%2B1%7D%3D%5Cvarphi%20(x_%7Bk%7D)%3Dx_%7Bk%7D%5E4%2B2x_%7Bk%7D%5E2-3,不收斂。

Picard迭代法測(cè)試代碼如下,文件命名為test_picard.m

求解結(jié)果,此處不給出迭代過(guò)程的輸出。

可視化圖象

圖1 Picard迭代法求解第一種迭代形式的近似解和精度收斂曲線

Aitken加速迭代法測(cè)試代碼如下,文件命名為test_aitken.m

輸出結(jié)果如下:增加了一項(xiàng)time的計(jì)算(迭代速度較快,若time為0,可多次運(yùn)行)。

可視化圖象:

圖2 Aitken加速迭代法求解第一種形式的近似解和精度收斂曲線

第二種迭代函數(shù)形式的測(cè)試:

可視化圖象,由于迭代次數(shù)較多,不再標(biāo)記marker:

圖3 Picard迭代法求解第二種迭代形式的近似解和精度收斂曲線

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

可視化圖象

圖4 Aitken加速迭代法求解第二種迭代形式的近似解和精度收斂曲線


MATLAB OOP繼承多態(tài)——Picard和Aitken的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
老河口市| 皮山县| 四川省| 新河县| 巴青县| 建阳市| 马山县| 措勤县| 中阳县| 开封县| 上栗县| 常熟市| 绥芬河市| 永春县| 霞浦县| 临颍县| 鱼台县| 章丘市| 嵊州市| 娄烦县| 应城市| 郎溪县| 苏尼特右旗| 黑水县| 桂东县| 绥滨县| 贡山| 毕节市| 宜阳县| 柳林县| 梁山县| 松潘县| 横山县| 漳州市| 安平县| 武乡县| 大安市| 潞城市| 台东市| 贵溪市| 噶尔县|