MATLAB OOP继承多态——Picard和Aitken
说明:由于面向大二学生,数值分析和微分方程数值解课程仍未学(大三开设),仅以简单的数值分析内容为例,目的是MATLAB如何根据原理编写算法,以及MATLAB本身语言的程序设计思路和语法知识。
学习面向未来,本科阶段不仅仅打下良好的理论基础,也应在本科阶段打下良好的编码基础,不至于把编码这个不大的问题交给未来。计算数学是基础数学应用到科技创新的必由之路,尤其是国家层面的科技,更包括社会各行业的智能计算。
对于复杂方程 ,具体求根通常分两步走:先用适当方法获得根的某个初始近似值
;然后再反复迭代,将
逐步加工成一系列近似根
,直到足够精确为止。
1. 不动点迭代法
不动点迭代法又称为 皮卡(Picard )迭代法、 逐次逼近法,不动点迭代法是求方程在某区间内单根的近似值的重要方法。
用不动点迭代法求方程 的单根
的主要步骤为:
(1)把 变形为
,称
为迭代函数。
(2)以为迭代公式,以
附近的某一个值
为迭代初值,反复迭代,得到迭代序列:
。
(3)若此序列收敛,则必收敛于精确根 ,即
。
方程 到
的变形不唯一。迭代公式不同或迭代初值不同,迭代过程有的收敛,有的不收敛。
不动点迭代法的收敛性分析(略去)。
2. 埃特金加速法
埃特金(Aitken)加速法用来加快不动点迭代法的收敛速度。先用不动点迭代法算出序列,再对此序列作修正得到
,具体方法:
用埃特金加速法对不动点迭代法迭代过程加速得到的迭代序列记为
,则计算出
、
、
后,对
作以下修正:
然后用来逼近方程的根。
3. 斯特芬森加速法
埃特金方法不管原序列是怎样产生的,对
进行加速计算,得到序列
。如果把埃特金加速技巧与不动点迭代法结合,则可得到如下的迭代法:
称为斯蒂芬森(Steffensen)迭代法。斯蒂芬森迭代法是二阶收敛的。
4. OOP的继承与多态
4.1 继承
定义一个 class 的时候,可以从某个现有的 class 继承,新的class 称为子类(Subclass),而被继承的class 称为基类、父类或超类(Base class、Super class)。
父类和子类的关系是一般和特殊的关系。例如水果和苹果的关系,苹果继承了水果,苹果是水果的子类,则苹果是一种特殊的水果。
从子类的角度看,子类扩展(extend)了父类;但从父类角度看,父类派生(derive)出子类。也就是说,扩展和派生所描述的是同一个动作,只是观察角度不同而已。
多继承增加了编程了复杂度,尽量避免在MATLAB算法设计中使用多继承,而是使用单继承,可以保证编程思路更清晰,避免更多麻烦。
在设计Aitken类时,则继承了Picard类,Picard类称为父类,Aitken类为子类。语法格式
子类除继承父类的非私有属性外,仍可定义自己独特的属性,如增加一个迭代时间属性变量time
MATLAB中继承的特点:
(1)在继承中,基类的构造方法不会自动调用,需要在子类的构造方法中专门调用。
(2)在调用基类的方法时需要加上self(因为本算法统一采用self表示当前类)前缀,后面为符号“@”(表示引用父类构造函数)和父类名称,以及父类的参数。
(3)在 MATLAB 中,首先查找对应类型的方法,如果在子类中找不到对应的方法,才到基类中逐个查找。如测试代码中:aitken.plot_x_eps_curve(true) ,子类无定义,则在父类中查找。
(4)子类获得了父类全部非私有的功能。子类不能继承父类中的私有方法,也不能被调用父类的私有方法。对于父类中扩展的非私有方法,子类可以拿来即用。
4.2 多态
多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
多态性的优点:
(1)增加了程序的灵活性:以不变应万变,不论对象千变万化,使用者都是同一种形式去调用;
(2)增加了程序额可扩展性。
如在Aitken类中重写了父类方法solve_nlinear_equ,同名方法iterative_output内部引用父类方法并传参。
5. Picard迭代法OOP设计(完整代码)
基类设计中,所有属性的权限为protected,若为private,则子类无法继承。设置为protected,类外不能被引用,但子类可以。
6. Aitken加速法OOP设计,继承Picard迭代法(完整代码)
继承父类PicardSolveNLEqu,并重写了父类方法solve_nlinear_equ;同名函数iterative_output中调用父类的同名函数,并传参;完整继承父类的plot_x_eps_curve方法。
7. 案例测试
例1:用迭代法求方程在区间
内的实根。其迭代函数构造形式有三种,如下:
(1) ;
(2);
(3),不收敛。
Picard迭代法测试代码如下,文件命名为test_picard.m
求解结果,此处不给出迭代过程的输出。
可视化图象

Aitken加速迭代法测试代码如下,文件命名为test_aitken.m
输出结果如下:增加了一项time的计算(迭代速度较快,若time为0,可多次运行)。
可视化图象:

第二种迭代函数形式的测试:
可视化图象,由于迭代次数较多,不再标记marker:

Aikten加速迭代法测试代码,由于迭代速度较快,设置精度1e-20.
可视化图象
