欢迎光临散文网 会员登陆 & 注册

MATLAB OOP继承多态——Picard和Aitken

2022-05-18 22:05 作者:鸣凤在竹-白驹食场  | 我要投稿

      说明:由于面向大二学生,数值分析和微分方程数值解课程仍未学(大三开设),仅以简单的数值分析内容为例,目的是MATLAB如何根据原理编写算法,以及MATLAB本身语言的程序设计思路和语法知识。

      学习面向未来,本科阶段不仅仅打下良好的理论基础,也应在本科阶段打下良好的编码基础,不至于把编码这个不大的问题交给未来。计算数学是基础数学应用到科技创新的必由之路,尤其是国家层面的科技,更包括社会各行业的智能计算。

        对于复杂方程f(x)%3D0 ,具体求根通常分两步走:先用适当方法获得根的某个初始近似值 x_%7B0%7D%20;然后再反复迭代,将x_%7B0%7D%20逐步加工成一系列近似根x_%7B1%7D%2Cx_%7B2%7D%2Cx_%7B3%7D%2C...,直到足够精确为止。

1.  不动点迭代法

       不动点迭代法又称为 皮卡(Picard )迭代法、 逐次逼近法,不动点迭代法是求方程在某区间内单根的近似值的重要方法。

        用不动点迭代法求方程f(x)%3D0 的单根x%5E*%20的主要步骤为:

     (1)把f(x)%3D0 变形为 x%3D%5Cvarphi%20(x),称%5Cvarphi%20(x)为迭代函数。

     (2)以x_%7Bk%2B1%7D%3D%5Cvarphi%20(x_%7Bk%7D)%2C%20k%3D0%2C1%2C2%2C...为迭代公式,以x%5E*%20附近的某一个值x_%7B0%7D为迭代初值,反复迭代,得到迭代序列: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)的变形不唯一。迭代公式不同或迭代初值不同,迭代过程有的收敛,有的不收敛。

       不动点迭代法的收敛性分析(略去)。

2. 埃特金加速法

        埃特金(Aitken)加速法用来加快不动点迭代法的收敛速度。先用不动点迭代法算出序列%5Cleft%5C%7B%20x_%7Bk%7D%20%5Cright%5C%7D%20,再对此序列作修正得到%5Cleft%5C%7B%20%5Cbar%7Bx%7D%20_%7Bk%7D%20%5Cright%5C%7D%20,具体方法:

       用埃特金加速法对不动点迭代法x%3D%5Cvarphi%20(x)迭代过程加速得到的迭代序列记为%5Cleft%5C%7B%20x_%7Bk%7D%20%5Cright%5C%7D%20_%7Bk%3D0%7D%5E%7B%5Cinfty%7D,则计算出x_%7Bk%7Dx_%7Bk%2B1%7Dx_%7Bk%2B2%7D后,对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来逼近方程的根。

3. 斯特芬森加速法

        埃特金方法不管原序列%5Cleft%5C%7B%20x_%7Bk%7D%20%5Cright%5C%7D%20是怎样产生的,对%5Cleft%5C%7B%20x_%7Bk%7D%20%5Cright%5C%7D%20进行加速计算,得到序列%5Cleft%5C%7B%20%5Cbar%7Bx%7D%20_%7Bk%7D%20%5Cright%5C%7D%20。如果把埃特金加速技巧与不动点迭代法结合,则可得到如下的迭代法:

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的继承与多态

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:用迭代法求方程x%5E4%2B2x%5E2-x-3%3D0在区间%5B1%2C%201.2%5D内的实根。其迭代函数构造形式有三种,如下:

(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迭代法测试代码如下,文件命名为test_picard.m

求解结果,此处不给出迭代过程的输出。

可视化图象

图1 Picard迭代法求解第一种迭代形式的近似解和精度收敛曲线

Aitken加速迭代法测试代码如下,文件命名为test_aitken.m

输出结果如下:增加了一项time的计算(迭代速度较快,若time为0,可多次运行)。

可视化图象:

图2 Aitken加速迭代法求解第一种形式的近似解和精度收敛曲线

第二种迭代函数形式的测试:

可视化图象,由于迭代次数较多,不再标记marker:

图3 Picard迭代法求解第二种迭代形式的近似解和精度收敛曲线

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

可视化图象

图4 Aitken加速迭代法求解第二种迭代形式的近似解和精度收敛曲线


MATLAB OOP继承多态——Picard和Aitken的评论 (共 条)

分享到微博请遵守国家法律