ODE45 和 Runge-Kutta 方法与解析解的绝对误差比较

2023-12-29

如果有人可以帮助解决以下问题,我将不胜感激。 我有以下常微分方程:

dr/dt = 4*exp(0.8*t) - 0.5*r   ,r(0)=2, t[0,1]       (1)

我用两种不同的方式解决了(1)。 借助于龙格-库塔法(第四阶)并通过ode45在Matlab中。我将这两个结果与解析解进行了比较,解析解由下式给出:

r(t) = 4/1.3 (exp(0.8*t) - exp(-0.5*t)) + 2*exp(-0.5*t)

当我绘制每种方法相对于精确解的绝对误差时,我得到以下结果:

对于RK方法,我的代码是:

h=1/50;                                            
x = 0:h:1;                                        
y = zeros(1,length(x)); 
y(1) = 2;    
F_xy = @(t,r) 4.*exp(0.8*t) - 0.5*r;                   
for i=1:(length(x)-1)                              
    k_1 = F_xy(x(i),y(i));
    k_2 = F_xy(x(i)+0.5*h,y(i)+0.5*h*k_1);
    k_3 = F_xy((x(i)+0.5*h),(y(i)+0.5*h*k_2));
    k_4 = F_xy((x(i)+h),(y(i)+k_3*h));
    y(i+1) = y(i) + (1/6)*(k_1+2*k_2+2*k_3+k_4)*h;  % main equation
end

And for ode45:

tspan = 0:1/50:1;
x0 = 2;
f = @(t,r) 4.*exp(0.8*t) - 0.5*r;
[tid, y_ode45] = ode45(f,tspan,x0);

我的问题是,为什么我使用时会出现振荡ode45? (我指的是绝对误差)。两种解决方案都是准确的(1e-9),但是会发生什么ode45在这种情况下?

当我计算 RK 方法的绝对误差时,为什么它看起来更好?


你的 RK4 函数正在采取比那些小得多的固定步骤ode45正在服用。您真正看到的是由于以下原因造成的错误多项式插值 https://en.wikipedia.org/wiki/Polynomial_interpolation用于产生真实步骤之间的点ode45需要。这通常被称为“密集输出”(参见海尔和奥斯特曼 1990 http://dx.doi.org/10.1007/BF01385634).

当您指定一个TSPAN具有两个以上元素的向量,Matlab ODE 套件求解器 http://www.mathworks.com/help/matlab/ordinary-differential-equations.html产生固定步长的输出。这并不意味着他们实际上使用固定步长或他们使用您中指定的步长TSPAN然而。您可以看到使用的实际步长,并且仍然可以通过以下方式获得所需的固定步长输出ode45输出结构并使用deval http://www.mathworks.com/help/matlab/ref/deval.html:

sol = ode45(f,tspan,x0);
diff(sol.x) % Actual step sizes used
y_ode45 = deval(sol,tspan);

在执行初始步骤后您会看到0.02,因为你的 ODE 很简单,所以它收敛于0.1用于后续步骤。默认容差与默认最大步长限制(积分间隔的十分之一)相结合决定了这一点。让我们绘制真实步骤的误差:

exactsol = @(t)(4/1.3)*(exp(0.8*t)-exp(-0.5*t))+2*exp(-0.5*t);
abs_err_ode45 = abs(exactsol(tspan)-y_ode45);
abs_err_ode45_true = abs(exactsol(sol.x)-sol.y);
abs_err_rk4 = abs(exactsol(tspan)-y);
figure;
plot(tspan,abs_err_ode45,'b',sol.x,abs_err_ode45_true,'k.',tspan,abs_err_rk4,'r--')
legend('ODE45','ODE45 (True Steps)','RK4',2)

正如您所看到的,真实步骤的误差比 RK4 的误差增长得更慢(ode45实际上是比 RK4 更高阶的方法,所以您会预料到这一点)。由于插值,误差在积分点之间增大。如果您想限制这一点,那么您应该通过调整容差或其他选项odeset http://www.mathworks.com/help/matlab/ref/odeset.html.

如果你想强行ode45使用步骤1/50你可以这样做(有效,因为你的 ODE 很简单):

opts = odeset('MaxStep',1/50,'InitialStep',1/50);
sol = ode45(f,tspan,x0,opts);
diff(sol.x)
y_ode45 = deval(sol,tspan);

对于另一个实验,尝试扩大积分间隔以积分到t = 10或许。您将在错误中看到许多有趣的行为(绘制相对错误在这里很有用)。你能解释一下吗?你能用吗ode45 and odeset产生表现良好的结果?使用自适应步骤方法对大区间内的指数函数进行积分具有挑战性,并且ode45不一定是完成这项工作的最佳工具。有备择方案 http://en.wikipedia.org/wiki/Numerical_methods_for_ordinary_differential_equations#The_first-order_exponential_integrator_method然而,但它们可能需要一些编程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ODE45 和 Runge-Kutta 方法与解析解的绝对误差比较 的相关文章

  • ODE 时间 Matlab 与 R

    如果在 matlab 中使用可变时间步长求解器 例如 ODE45 我会定义输出的时间跨度 即times 0 50 matlab 将返回 0 到 50 之间不同时间步长的结果 然而在 R 中 我似乎必须定义我希望 ODE 返回结果的时间点 即
  • 继续在 Matlab 中一遍又一遍地播放声音?

    我正在尝试创建一个 MATLAB 程序来每隔几分钟一遍又一遍地播放声音 现在我将其设置为每隔几秒播放一次 只是为了消除系统中的一些错误 但是 当我的程序尝试重播声音时 我收到此错误 Error using gt audioplayer au
  • matlab mex 文件和 C++ dll (Windows)

    我有一个带有 Test 类的 DLL 标题 class MY EXPORT Test public int doit const string str 和来源 int Test doit const string str return in
  • MATLAB中如何画水平线和垂直线?

    我目前正在尝试在 MATLAB 中绘制简单的垂直线和水平线 例如 我想绘制线 y 245 我该怎么做呢 MATLAB 根据您提供的向量逐点进行绘图 因此 要创建一条水平线 您需要改变x同时保持y对于垂直线恒定 反之亦然 xh 0 10 yh
  • Julia 中使用微分方程的二阶 ODE

    我正在尝试使用 Julia 中的微分方程求解谐振子 IE using DifferentialEquations using Plots m 1 0 1 0 function mass system ddu du u p t a t 1 m
  • 扩展 MATLAB 函数名称的最大长度

    我编写了一个 MATLAB 程序 可以动态创建自定义 MATLAB 函数 并使用以下命令在其他 MATLAB 实例中启动它们unix命令 我使用这个程序来自动化 fMRI 神经影像分析 使用 SPM8 for MATLAB 一切正常 但是
  • Matlab中转换数据类型的有效方法(double vs. im2double)

    我想将真彩色图像转换为双精度 据我所知有两种方法可以做到这一点 double rgb img im2double rgb img 哪一种效率更高 谢谢 他们都是不同的 im2double将图像的范围转换为0 1如果数据类型是uint8 or
  • MATLAB 中最有效的矩阵求逆

    在 MATLAB 中计算某个方阵 A 的逆矩阵时 使用 Ai inv A should be the same as Ai A 1 MATLAB 通常会通知我这不是最有效的求逆方法 那么什么是更有效率的呢 如果我有一个方程系统 可能会使用
  • MATLAB 中的多个捕获组

    我有一个包含数字或字母的字符串a 可能紧随其后的是r or l 在 MATLAB 中 以下正则表达式返回为 gt gt regexp 10r 0 9 a l r match ans 10r 我希望10 and r分开 因为我有两个捕获组 有
  • 使用mat2cell将MxN的矩阵划分为1xN大小的M矩阵

    我有一个大小为 MxN 的矩阵 比方说 1867x3 1867 行和 3 列 我想将其分成 1867 个大小为 1x3 的单元格 我使用了mat2cell X 1 1866 这里X是矩阵 1867x3 结果给出了两个单元格 一个单元格的大小
  • MATLAB - 如何将子图一起缩放?

    我在一张图中有多个子图 每个图的 X 轴是相同的变量 时间 每个图上的 Y 轴都不同 无论是它所代表的内容还是数据的大小 我想要一种同时放大所有图的时间尺度的方法 理想情况下 可以在其中一张图上使用矩形缩放工具 并让其他图相应地更改其 X
  • Simulink 仿真引擎如何工作?

    我想了解 Simulink 仿真引擎的工作原理 它是否使用离散事件模拟机制 那么如何处理连续时间 它是否依赖于基于静态循环的代码生成 或者 在第一个周期之前 它会计算出块的执行顺序 从不需要任何其他块输入的块开始 每个周期 它都会根据输入和
  • 使用 MATLAB 进行线路跟踪

    我有一个图像 我想将其转换为逻辑图像 包括线条为黑色 背景为白色 当然 可以使用阈值方法来实现这一点 但我不想使用这种方式来做到这一点 我想通过使用线路跟踪方法或类似的方法来检测它 这是关于视网膜血管检测的 我找到了一个article ht
  • MATLAB 教程中的 SIFT 实现

    我正在寻找 MATLAB 中的一些基本 SIFT 实现 我需要从第一原则来写它 另外 我正在寻找一些可以解释程序中发生的事情的内容 Vedali 的代码和 David Lowe 的代码超出了我的理解范围 如果您是 Matlab 用户 您一定
  • Matlab:如何更改矩阵的存储方式?从 1x1x3 到 1x3?

    我目前有 val 1 0 7216 val 2 0 7216 val 3 0 7216 但我想要 0 7216 0 716 0 721 我可以做什么样的操作来做到这一点 The reshape函数将在这里解决问题 Arrange the e
  • 在 Matlab 中高效获取像素坐标

    我想在 Matlab 中创建一个函数 给定一个图像 该函数将允许人们通过单击图像中的像素来选择该像素并返回该像素的坐标 理想情况下 人们能够连续单击图像中的多个像素 并且该函数会将所有相应的坐标存储在一个矩阵中 有没有办法在Matlab中做
  • matlab中的正则逻辑回归代码

    我正在尝试正则化 LR 在 matlab 中使用以下公式很简单 成本函数 J theta 1 m sum y i log h x i 1 y i log 1 h x i lambda 2 m sum theta j 梯度 J theta t
  • 如何使用 MATLAB 的 substruct 函数创建表示使用“end”的引用的结构?

    我想使用substruct http www mathworks com help matlab ref substruct html函数创建一个结构体以供使用subsref 目的是使用索引字符串subsref而不是通常的 符号 因为我正在
  • 如何更改Plotyy第二轴的颜色和字体大小?

    我使用 MATLAB 的plotyy 函数绘制了两条曲线 AX H1 H2 plotyy voltage span amplitude voltage span Ca SR The problem is that I cannot chan
  • 如何在文本集中创建所有字符组合?

    例如 我有这样的文本集 第 1 栏 a b 第 2 栏 l m n 第 3 栏 v w x y 我想将它们组合起来以获得如下输出 alv alw alx aly amv amw amx amy 这将输出 24 种文本组合 如果我只使用前两列

随机推荐

  • 处理失败的期货

    在 Play Framework 2 3 中 操作可以从成功的未来调用中产生结果 如下所示 def index Action async val futureInt scala concurrent Future intensiveComp
  • XPath 如何以名称空间不知道的方式识别谓词中的属性[重复]

    这个问题在这里已经有答案了 我有以下 XML 文件
  • 为数据库中的日期添加 30 天

    我在数据库中发布了更新日期和发布日期 目前它们的日期相同 我如何更改它 在 mysql 插入期间 以便发布日期比发布更新日期晚 30 天 我正在使用 pubDate Thanks 您可以使用日期添加 http dev mysql com d
  • PM2 Flush 不清除日志

    我运行的 Ubuntu 服务器突然满了 因为 pm2 日志占用了 16GB 我试过pm2 flush 但这只会清除占用 4GB 的文件夹 作为 root pm2 文件夹被清除 但日志文件夹未被清除 作为我自己的用户 该文件夹已被清除 但用户
  • 在Python中如何将`email.message.Message`对象转换为`email.message.EmailMessage`对象

    据我了解mboxPython 3 6 标准库中的类生成以下类型的旧式消息对象email message Message 较新的班级email message EmailMessage3 4 3 6 中引入的功能可以更轻松地访问消息内容 通过
  • 禁用 nginx 中的请求缓冲

    看起来 nginx 在将请求传递到上游服务器之前会缓冲请求 虽然对我来说大多数情况下都可以 但这是非常糟糕的 我的情况是这样的 我有 nginx 作为前端服务器来代理 3 个不同的服务器 apache 与典型的 php 应用程序 我用 py
  • lambda函数使用其参数作为模板参数调用模板函数

    以下是示例代码 无法编译 We use 迭代函数来迭代某个范围并运行 lambda 回调函数 这iterate函数将传递一些指示 即type 到回调 lambda 函数 然后该函数将根据指示进行工作 由于这些指示在编译时是固定的 我相信有一
  • Collection.stream() 的实现

    我已经在 J DK 1 8 上工作了几天 我遇到了一些与此类似的代码 List
  • 使用 ul li 生成 Jquery 多级菜单列表

    images vertical horizontal Jquery UI include quickfox 要处理的数组 我有像上面一样的文件夹结构 它存储在数组目录中 见下文 var dirs images images vertical
  • 如何在Vuejs中处理浏览器后退按钮单击事件

    在 Vue 组件中 我想像这样处理浏览器返回事件 mounted if browser back console log browser back button clicked else console log stay here 为了处理
  • 从 JSON 文件定义 Mongoose 模式

    我想从 JSON 文件定义我的猫鼬架构 这是我的 JSON 文件结构 default item productTitle label Product Title note e g Samsung GALAXY Note 4 type tex
  • Angular.js 观察函数调用的结果

    以下代码片段是否存在任何表面问题 ul class breadcrumb li class active span nbsp a href path dir url dir name a nbsp span class dividier s
  • 如何在 pythonpyder IDE 中使用相对导入

    我有 anaconda python 并正在使用spyder IDE 我试图弄清楚如何在运行底部或 F5 中使用相对导入 假设我有 pkg A foo1 py pkg A foo2 py 并且 foo1 py 有 from import f
  • 如何修复手机上的 Skrollr?

    我遵循移动浏览器支持指南 将内容包装在正文标记之后和之前 解释在这里 https github com Prinzhorn skrollr what you need in order to support mobile browsers
  • PHP Curl 和 setcookie 问题

    我有一个curl 脚本 充当客户端和主服务器之间的代理 field array array Accept gt HTTP ACCEPT Accept Charset gt HTTP ACCEPT CHARSET Accept Encodin
  • 在 Magento ORM 中使用布尔字段

    我正在为我的自定义实体开发后端编辑页面 我几乎一切都正常工作 包括保存一堆不同的文本字段 但是 当尝试设置布尔字段的值时 我遇到了问题 我努力了 landingPage gt setEnabled 1 landingPage gt setE
  • 在域模型之间映射数据的模式

    这是我最近需要做的一件常见的事情 我正在寻找任何常见的模式来使这变得更容易一些 这一切的主要要点是我有一些数据模型 它们被建模来满足 ORM 并纯粹对对象进行 CRUD 操作 这些模型目前通过存储库 工厂公开 取决于其 C 还是 RUD 然
  • Matplotlib动画,移动方块

    我正在从文本文件加载 x y 坐标和偏航角 这些坐标是正方形中间的坐标 yaw 是正方形与 x 轴的角度 在我的文本文件中 坐标正在变化 我想制作一个动画 其中方块将移动 遵循文件中的坐标 并具有精确的偏航角 一个动画刻度应该代表一个方块移
  • 如何禁用一条指令的中断?

    有没有其他方法可以在持续时间内禁用中断只有一条指令 in x86 questions tagged x86比使用CLI操作说明 是的 正在加载SS with a MOV将禁止下一条指令的外部中断 指令集参考是这样说的 使用 MOV 指令加载
  • ODE45 和 Runge-Kutta 方法与解析解的绝对误差比较

    如果有人可以帮助解决以下问题 我将不胜感激 我有以下常微分方程 dr dt 4 exp 0 8 t 0 5 r r 0 2 t 0 1 1 我用两种不同的方式解决了 1 借助于龙格 库塔法 第四阶 并通过ode45在Matlab中 我将这两