MATLAB面向對象程序設計——牛頓法求解非線性方程
?1. 面向對象程序設計簡述
? ? ? ?面向過程(Procedure Oriented,簡稱PO)思想即把求解的問題流程化,把一個復雜的大任務分解為小任務或子過程,子過程可繼續(xù)劃分,進而對子過程進行函數(shù)設計、編碼實現(xiàn);或者把一個算法分解為可解決的功能模塊,或求解步驟流程化,按照功能模塊或步驟進行程序設計。
? ? ? ? 面向對象(Object Oriented,簡稱OO)是一種程序設計思想。從20世紀60年代提出面向對象的概念到現(xiàn)在,它已經發(fā)展成為一種比較成熟的編程思想,并且逐步成為目前軟件開發(fā)領域的主流技術。面向對象設計理念是一種從組織結構上模擬客觀世界的方法。
? ? ? ?面向對象程序設計是在面向過程程序設計的基礎上發(fā)展而來的,它比面向過程編程具有更強的靈活性、擴展性。面向對象程序設計也是一個程序員發(fā)展的“分水嶺”,讀者應深刻理解面向對象設計的思想。
? ? ? ?類(Class)和對象(Object)是面向對象編程(Object Oriented Programming,簡稱OOP)的核心概念:
?“類”是封裝對象的屬性和行為的載體,它是一個模板,一種抽象的概念,用于描述一類對象的狀態(tài)(屬性、變量及其數(shù)據(jù))和行為(方法或函數(shù))。反過來說,具有相同屬性和行為的一類實體被稱為類。
?“對象”是類的一個實例,實例化的對象有狀態(tài)和行為。一個對象通常被劃分為靜態(tài)部分和動態(tài)部分:
靜態(tài)部分被稱為“屬性”,任何對象都具備自身的屬性,這些屬性不僅是客觀存在的,而且是不能被忽視的。如平面幾何圖形的邊數(shù)
、周長
、面積
等,又如迭代逼近算法的迭代初值
、最大迭代次數(shù)
、精度要求
等。
動態(tài)部分指的是對象的行為或方法,即對象執(zhí)行的動作、調用的方法或函數(shù)。如平面幾何類中根據(jù)判斷幾何圖形的類型是圓形、三角形還是四邊形,以及計算周長、面積等。
? ? ? ?類與對象的關系:類是一類事物的描述,是抽象的。對象是一類事物的實例,是具體的。類是對象的模板,對象是類的實體。類定義了一類對象有哪些屬性和方法,但并沒有實際的空間,實例化出的對象占有實際空間,用來存儲成員變量。
注:算法從某種程度上來說,就是處理計算各種數(shù)據(jù),算法可以說就是值的計算和處理。而變量作為數(shù)據(jù)的存儲載體,在算法設計中無處不在,對象在實例化后,本質上就已經傳遞或存儲了類屬性數(shù)據(jù)。
? ? ? ?總之,對于一個復雜的問題進行子問題的劃分,面向過程把子問題設計為函數(shù),數(shù)據(jù)在函數(shù)間通過參數(shù)交互,解決復雜問題;而面向對象,其對應的子問題可以設計為類并實例化為對象,對象擁有屬性(數(shù)據(jù))和方法(函數(shù)),對象之間通過組合和交互來解決問題。
? ? ? ? 本文基于數(shù)值分析與科學計算設計算法,相對于大型軟件開發(fā),其面向對象程序設計的思想并不復雜,主要涉及類的定義和設計,以及對象的實例化和調用。
2. MATLAB面向對象程序設計方法
? ? ? ?以五種形式的牛頓迭代法求解非線性方程的近似解為例(參考原理),說明MATLAB面向對象的設計流程、方法和思想。
(1)類的定義
? ? ? ? ?關鍵字classdef 修飾,定義了牛頓迭代法類NewtonRoot(多個單詞,每個單詞首字母大寫,“駝峰式”命名),同時繼承handle類,使得能夠在類內構造函數(shù)外修改屬性并可不返回新變量。
(2)類的屬性定義
? ? ? 關鍵字修飾properties,默認為公有屬性,通過參數(shù)(Access=protected)設置訪問權限。
? ? ? ?類的屬性變量,用于存儲數(shù)據(jù),便于對象和方法之間數(shù)據(jù)的傳遞、共享和計算。對于牛頓迭代法求解非線性方程,其問題本身應該包括待求方程equ_func、初值x0等,除此之外,在各方法間涉及到方程一階導數(shù)和二階導數(shù)的計算。
對于屬性定義,說明如下:
屬性變量對數(shù)據(jù)類型沒有限制,可以是標量(double, string...)或矩陣(
)等;
屬性變量可以有默認值,默認值可以直接賦予一個值,也可以是一個MATLAB表達式(僅在類實例化時計算一次)
常量屬性在對象生存周期中保持不變,不能對其進行修改,如重力加速度常數(shù)
;
非獨立屬性的值依賴于其他屬性,一旦其他屬性的值改變,則該屬性也會改變;支持點調用和向量化操作。
屬性的訪問限制:私有屬性private,只有該類的成員方法可以訪問該數(shù)據(jù),而子類和其他外部函數(shù)無法訪問;保護屬性protected,只有該類的成員方法和子類可以訪問該數(shù)據(jù);公有屬性public,該類的成員方法、子類的成員方法、類之外的函數(shù)都可以訪問該數(shù)據(jù)
(3)類的方法定義
? ? ? ?關鍵字methods修飾,默認公有屬性,通過參數(shù)(Access=protected)設置訪問權限。?
1)類的構造方法
? ? ? ?類的構造方法是對象實例化的第一步操作,負責創(chuàng)建類的對象,初始化對象的屬性。構造函數(shù)與類名相同,一個類的定義中只能有一個構造函數(shù)。如下代碼所示,主要包括類屬性的初始化、類屬性的健壯性檢驗、必要屬性的初始化計算等。
? ? ? ?此處類的構造函數(shù)的輸出參數(shù)限制為self,即表示類對象本身??梢允褂闷渌Q,如obj,但在類的整個定義中應統(tǒng)一,本文統(tǒng)一采用self。
2)setXXX和getXXX方法
? ? ? ?由于類的屬性訪問權限的設置,對象不能直接訪問類的屬性,但可以通過setXXX和getXXX所提供的方法進行訪問。主要指通過對象訪問類屬性(getXXX)和修改類屬性值(setXXX),并在修改參數(shù)值時進行必要的參數(shù)檢驗和斷言。
? ? ? ?注意:每個方法的第一個參數(shù)限定為self。以供對象點調用。
3)類方法
? ? ? ?注意:該方法的輸入?yún)?shù)限制為self,以供對象點調用。其他參數(shù)是設置可根據(jù)實際所解決的問題設置。可以在類定義中僅給出函數(shù)的聲明,將函數(shù)的實現(xiàn)放到一個單獨的文件中,但構造函數(shù)、析構函數(shù)、static(靜態(tài))函數(shù)除外。
4)類的其他方法
? ? ? ? ?本例中,定了六個保護屬性protected的方法,實例化的對象不能直接調用。
3. MATLAB面向對象程序設計完整代碼(牛頓迭代法)
4. MATLAB面向對象程序設計——測試調用
? ? ? ? 具體實例參考牛頓迭代法的面向過程設計
(1)對象的實例化
? ? ? ? ?對象的實例化為OOP的第一步,然后才能通過對象調用其他方法。如下代碼所示,實例化后,對象擁有類定義的所有屬性變量和方法。必要參數(shù)必須傳遞,可變參數(shù)通過關鍵字參數(shù)Name-Value的形式傳遞(如"display", "iter")。
(2)對象訪問類屬性
? ? ? ?由于類類型定義時,其訪問權限為保護屬性protected,不允許類外調用,即使是實例化的對象。如顯示對象nt_obj,命令行窗口顯示如下:
? ? ? ? 如圖1所示,當前實例化的對象盡可訪問的屬性或方法僅僅是定義為公有屬性的方法。

? ? ? ??但可以通過類方法所提供的getXXX和setXXX方法訪問和修改類屬性變量的值。對象訪問類方法的方法為“對象名.方法名()”
? ? ? ? 現(xiàn)修改類屬性的訪問權限為public,則實例化后,對象可以顯示所有屬性信息,且對象可以直接訪問類的所有屬性。通常情況下,類屬性定義為私有屬性或保護屬性。
(3)對象調用方法
? ? ? ? ?由于類方法solve_newton除self外無其他參數(shù),可不傳參,此處省略(),若有除self外的參數(shù),則必須傳參(args)。
? ? ? ?通過調用setmethod(method)修改牛頓法的迭代形式,求解不同情形下的非線性方程的近似解。
(4)完整測試代碼,命名文件名為“test_newton_root_object”
輸出過程(簡化的牛頓法不收斂):
? ? ? ? ?各牛頓法的誤差收斂曲線如圖2所示,由于簡化牛頓法不收斂或收斂較慢,故不再可視化。
