当前位置:首页|资讯|编程|ChatGPT

Euler法,梯形法,RK2,RK4对ODE应用的matlab代码和误差分析及图像输出——数值方法

作者:小埋埋土里发布时间:2023-04-29

一次挺满意的小组合作,记录一下使用的代码和过程。事先声明代码来自chatGPT,由于CSDN上没有找到类似的代码,这也是为以后或许要用到的同学留个资源吧。虽然说代码不是亲自写的,理解还是很容易,顺便注明一些我们走的弯路。

数值方法:

欧拉法:

很容易理解,顺带提一句chatGPT的代码注释真的很强大。

欧拉法调用方法:

y'%3D10y(1-y),所以下面的都以这个ODE为例,再顺带提一句,使用matlab解ODE用dsolve就好。)

本来想解释一下,但真没啥解释的...定义函数,初值,区间,步长,调用函数,画图,坐标轴和图名,就这些。

欧拉法输出图像:


欧拉法图像


梯形法:

英文是Trapezoidal method,tra pe zo i dal,梯形。

这次tspan是区间,不懂就看下面输入案例。

梯形法调用方法:

梯形法输出图像:


梯形法图像

RK2:

RK2调用方法:

图不放了,同上(虽然说调用方法也类似,我还是把饼递到嘴边吧)。

RK4:

RK4调用方法:

误差分析:

我们做的误差分析是得出原函数在t=1时的值和数值方法逼近的值差的绝对值再取对数,听着有点麻烦啊,写成式子应该是这样:%5Ctext%7Berror%7D%3D%5Clog%7B%7Cy(1)-y_%7Bm%7D(1)%7C%7D。这里我们将步长设为自变量,从10的-1到-6次方,误差为因变量,这样取对数后,正常的误差分析结果应该是几条斜率不同的直线。

代码:

误差分析图像:

误差分析图像

小问答:这里直线的斜率分别为1,2,4,原因是什么?

另外,效果最好的是RK4,我一开始疑惑为什么RK4方法会触底反弹,chatGPT的解释是:

使用RK4方法拟合函数时,有时在步长减小到一个值时,随着步长继续减小,误差反而增大的原因:在RK4方法中,步长的大小会影响拟合精度,通常情况下,减小步长可以提升拟合的精度。然而,当步长继续减小时,误差反而增大的原因在于舍入误差的影响。由于计算机存储浮点数是有限精度的,当步长较小时,函数的微小变化可能会因为精度不足而被忽略,从而导致误差逐渐累积,最终使得计算结果和真实结果之间的差距增大。

我也询问了为什么欧拉法和RK2为什么不会如此,chatGPT解释是:

欧拉法和RK2方法在同样的函数上进行数值积分时,没有出现这种问题的原因是因为它们的计算精度相对较低,误差随着步长的减小而不是增大。欧拉法和RK2方法都是数值积分常用的一阶显式方法,与RK4方法相比,它们的计算复杂度较低,每次迭代只需要使用一次函数导数计算即可。这种简单的计算方式使得它们在处理简单的函数时更加高效。然而,这种高效性也带来了精度的牺牲。相较于RK4方法的四阶精度,欧拉法只有一阶,而RK2方法只有二阶。因此,在进行数值积分时,它们的误差通常较大。

一些踩坑:

之后,我们换了一个新的函数,区间设为0到60。我们一开始想用函数中间的值来对比误差,即y(30),结果搞出一个四不像图像,具体的就不放了。后来在做报告前,我们才发现在误差分析的代码中,我们用了例如y_exact(t_euler(end))的函数。我们将步长,初值,区间和取值全都换为了新的函数,但就是没发现这个...最后作差是将函数中间数值方法的值和原函数末端值比较,当然完全不对了。还是没有完全理解如此简单的代码啊。顺带一提这些迭代的方法,比较函数末端(end)值其实应该是最能显示误差的。

最后看看我们对另一个函数做的误差分析图吧:

f = @(t, y) -0.051*(y-24);

注意两个误差分析图的斜率哦!


Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1