数值分析第二章实验报告

DecEric Lv2

第二章实验报告

个人主页:https://decent898.github.io/

项目地址:https://github.com/Decent898/numerical_analysis_2

1. 实验目标

建立一个图形化界面,用四大迭代方法求解方程的根。尝试用规范的格式输出迭代过程,并且绘制每次迭代的图像,尝试设计交互式图像,从而直观地的了解迭代的过程,比较各方法的收敛速度。

2. 实验内容

1.实现二分法、牛顿切线法和割线法来求解给定函数的根,埃特肯法输入f(x)=x的格式求解。

2.基于python flask库建立后端,负责计算迭代过程,同时还按照每种方法特性展示解的逼近过程。

3.在前端展示迭代过程(规范化的格式)、逼近过程图像、以及基于chart.js的交互式图表,可以观察每一次逼近的动态过程。

4.对于边界处理问题:埃特肯法的化简方法技巧性较强,暂未想到好的算法来化简,于是设置为用户输入;牛顿法和割线法的发散问题可以转化为迭代一定次数(max-iter)后仍然无法收敛的问题,从而提示函数不收敛。

5.输入同一个式子,用不同的方法,比较收敛速度。

6.埃特肯法同一个方程,输入不同的化简式,比较收敛速度。

3. 实验过程

1.在分析问题以后,我选择了python作为使用的语言,原因如下:

以前知道python有eval函数能直接计算表达式的值,了解python对于函数输入的处理比较方便。

我想直观地了解迭代的过程,想画一些交互式的图来加深我对迭代的理解,这就需要一个强大的绘图模块与图形化交互界面,因此选择了python的matplotlib以及考虑了html里可以导入的chart.js库来分别画静态的和动态的图。

2.四个方法具体实现:

二分法:从给定的区间开始,每次将区间二分,选择使函数值变号的子区间继续迭代。

牛顿法:使用导数信息,通过迭代公式逼近根的值。

割线法:不需要计算导数,通过两个初始点的函数值线性逼近根。

埃特肯法:根据推导所得的公式进行迭代

3.输入函数的处理:

在读入函数时,一大挑战是将输入的字符串函数转化为python可运算的表达式对象。这里选择使用python的lambda函数提取x,再用eval函数计算。

4.求解过程:

每种方法按照相应算法,目标是x的变化值小于误差,同时计算迭代次数,如果迭代次数大于100则停止。

特别值得一提的是:牛顿法的切线微分采用了近似切线的计算方法,即在函数上取两个靠近的点进行斜率计算。

每次迭代保存近似解,在前端格式化输出步骤。

图:求解的解(左:二分法,右:埃特肯法)

5.图形化展示:

在静态图像的绘制上选择了matplotlib库,动态图选用了chart.js库:

二分法:绘制了各区间的左右端点和中点,直观显示左右端点的变动。另外,动态图中可以显示各个点的分布,可以缩放图的大小进行观察。

求根可视化

牛顿法:绘制了每次迭代的切线与x轴的交点,对应绘制下一条切线。其中,动态图加入了每次迭代绘制切线的过程。

割线法:绘制了每次迭代迭代的割线,产生下一条割线。动态图也加入了绘制割线的过程。

求根可视化

埃特肯法:按照课本格式绘制了两次迭代+一条割线的回形图,动态图加入了每次迭代绘制回形线的过程。

求根可视化

4. 输入

1.函数表达式:如:

2.初始区间或是初始值,如(二分法),或(牛顿法,埃特肯法),或,(割线法)

3.精度要求

5. 输出

1.迭代过程的中间结果:近似值,误差

2.最终求得的近似根

3.迭代过程的图表

6. 实验分析

__① __不同形式下埃特肯法的效率比较

例:现在对于函数

求在附近的根,精度。

若按以下迭代公式:

因,迭代过程发散。现在用埃特肯法计算得收敛结果:

发现迭代次数为6次

接下来构造:

因,迭代过程收敛

收敛速度很快,只需要2次。

②不同方法比较收敛速度

例:现在对于函数

求在附近的根,精度。

二分法:

迭代16次

埃特肯法:

求根可视化

迭代4次

牛顿切线法:

迭代3次

割线法:

求根可视化

迭代3次

7. 实验结论

这次实验,我用可视化的形式做了很多测试,用动态图仔细研究了误差从大到小每次迭代的变化情况,给我以更深印象。

我发现:在埃特肯法中,交点处斜率大于1的函数形式在迭代时会出现 “回字形”结构,即每次迭代都是在真实根的上下波动,不利于收敛效率。

而交点处斜率小于1的函数形式在迭代时为阶梯式上升,从一侧逼近真实根,这样收敛效率较高。

综合上述实验分析中的两个实验,可以得出结论:对于同一个式子,二分法的效率是最低的,埃特肯法的效率因选定函数形式影响,而牛顿法鉴于微分运算复杂,虽然收敛效率高,但是运算精度难以保证,当我修改了运算过程中保留的位数,发现牛顿法受运算数精度影响较大,用牛顿下山法能缓解这个问题,然而数本身的精度会影响切线的斜率精度(尤其是与x轴交点处斜率较小的函数),从而减慢收敛速度。故割线法综合考虑最优。

在实际情况下,我们还要考虑运算的复杂度:比如二分法的单次迭代运算最为简单,牛顿法和割线法都比较复杂,埃特肯法能一次次复用之前的结果。

因此,我认为,在解题时,若能找到较好的,埃特肯法为较为理想的解题方法,如果很难找到,可以尝试割线法,如果函数的导数形式简单,可以选择牛顿切线法。而二分法不优先考虑。

  • 标题: 数值分析第二章实验报告
  • 作者: DecEric
  • 创建于 : 2024-10-12 21:47:43
  • 更新于 : 2024-10-12 22:06:15
  • 链接: https://redefine.ohevan.com/2024/10/12/数值分析第二章实验报告/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
此页目录
数值分析第二章实验报告