odeint的runge_kutta4与Matlab的ode45的比较

2023-12-29

我想用runge_kutta4方法中的odeint C++ 库 http://headmyshoulder.github.io/odeint-v2/。我已经用Matlab解决了这个问题。我在Matlab中的以下代码来解决x'' = -x - g*x',初始值x1 = 1, x2 = 0,如下

main.m

clear all
clc
t = 0:0.1:10;
x0 = [1; 0];
[t, x] = ode45('ODESolver', t, x0);
plot(t, x(:,1));
title('Position');
xlabel('time (sec)');
ylabel('x(t)');

ODESolver.m

function dx = ODESolver(t, x)
dx = zeros(2,1);
g  = 0.15;
dx(1) =  x(2);
dx(2) = -x(1) - g*x(2);
end

我已经安装了 odeint 库。我的使用代码runge_kutta4如下

#include <iostream>

#include <boost/numeric/odeint.hpp>

using namespace std;
using namespace boost::numeric::odeint;

/* The type of container used to hold the state vector */
typedef std::vector< double > state_type;

const double gam = 0.15;

/* The rhs of x' = f(x) */
void lorenz( const state_type &x , state_type &dx ,  double t )
{
    dx[0] =  x[1];
    dx[1] = -x[0] - gam*x[1];
}


int main(int argc, char **argv)
{
    const double dt = 0.1;
    runge_kutta_dopri5<state_type> stepper;
    state_type x(2);
    x[0] = 1.0;
    x[1] = 0.0;


   double t = 0.0;
   cout << x[0] << endl;
   for ( size_t i(0); i <= 100; ++i){
       stepper.do_step(lorenz, x , t, dt );
       t += dt;
       cout << x[0] << endl;
   }


    return 0;
}

The result is in the following picture enter image description here

我的问题是为什么结果会有所不同?我的 C++ 代码有问题吗?

这些是两种方法的第一个值

Matlab    C++
-----------------
1.0000    0.9950
0.9950    0.9803
0.9803    0.9560
0.9560    0.9226
0.9226    0.8806
0.8806    0.8304
0.8304    0.7728
0.7728    0.7084
0.7083    0.6379

Update:

问题是我忘记在我的 C++ 代码中包含初始值。感谢@horchler 注意到它。包含正确的值并使用后runge_kutta_dopri5正如@horchler所建议的,结果是

Matlab    C++
-----------------
1.0000    1.0000
0.9950    0.9950
0.9803    0.9803
0.9560    0.9560
0.9226    0.9226
0.8806    0.8806
0.8304    0.8304
0.7728    0.7728
0.7083    0.7084

我已更新代码以反映这些修改。


The runge_kutta4odeint 中的步进器与 Matlab 的完全不同ode45 http://www.mathworks.com/help/matlab/ref/ode45.html,这是一种基于多蒙王子 http://en.wikipedia.org/wiki/Dormand-Prince_method方法。要复制 Matlab 的结果,您可能应该尝试runge_kutta_dopri5 http://headmyshoulder.github.io/odeint-v2/doc/boost_numeric_odeint/odeint_in_detail/steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.stepper_overview步进器。另外,请确保您的 C++ 代码使用与ode45(默认值是1e-6 and 1e-3, 分别)。最后,看起来您可能没有在 C++ 结果中保存/打印初始条件。

如果你对为什么感到困惑ode45即使您指定了,也没有采取固定步骤t = 0:0.1:10;, see 我的详细答案在这里 https://stackoverflow.com/a/21861868/2278029.

如果必须使用固定步骤runge_kutta4步进器,那么您需要减小 C++ 代码中的积分步长以匹配 Matlab 的输出。

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

odeint的runge_kutta4与Matlab的ode45的比较 的相关文章

  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • 拟合具有扭曲时基的正弦波

    我想知道在 Matlab 中拟合具有扭曲时基的正弦波的最佳方法 时间失真由 n 阶多项式 n 10 给出 其形式为t distort P t 例如 考虑失真t distort 8 12t 6t 2 t 3 这只是幂级数展开 t 2 3 这将
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 一个char数组可以有多少个字符?

    define HUGE NUMBER char string HUGE NUMBER do something with the string string 我想知道在不冒任何潜在内存问题 缓冲区溢出等风险的情况下 我可以添加到 char
  • 使用适用于 Android 的 Drive API 进行断点续传

    我想使用drive api 将大文件 gt 10Mb 上传到Google Drive 使用直接上传 它可以很好地处理较小的文件 当有良好的 wifi 时 Drive Files Insert insert driveService file
  • 使用 xcode 6 提交时出现错误 ITMS-9000“无效图像路径”

    使用 xcode 6 验证或提交我的应用程序时 出现错误 ERROR ITMS 9000 Invalid Image Path No image found at the path referenced under key CFBundle
  • SQL Server 2005 会因为我使用 nvarchar(50) 而不是整数作为主键而惩罚我吗?

    我正在考虑更改一些表以使用 nvarchar 50 作为主键而不是 int 主键 使用 int ID 作为键实际上是不相关的数据 它是我感兴趣的字符串 会发生什么样的性能影响 或者你在哪里研究这个 除了剪切和尝试之外 您已经遇到了数据库设计
  • 自动调整 tkinter 窗口大小以适合所有小部件

    我希望主 tkinter 窗口有一个动态大小调整 这样当您添加新的小部件时 您不必更改窗口的大小 相反 主窗口将考虑该小部件的大小并自动增加其高度 宽度以适合窗口中的该小部件 masterWindow Tk Main Window min
  • 如何限制 C 中的套接字速度? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在 C 中限制套接字连接的带宽 https stackoverflow com questions 235762 how do you throttle the bandwidth of a so
  • 我应该使用 Spring 的哪个库来多线程发送电子邮件

    我的电子邮件太多了 我应该编写调度程序以便向他们发送消息 消息不同 我使用 spring 框架 4 x 我可以编写连接到 SMTP 服务器的简单类 但在这种情况下 我也应该编写我的线程库以便并行发送电子邮件 spring 是否已经编写了库
  • 编译 .pyw 文件,以便它可以像 .pyc 一样运行,无需控制台

    我正在尝试在没有控制台的情况下将 pyw 文件编译为 pyc 当我尝试直接编译它时 结果是一个 pywc 文件 但 pythonw exe 似乎没有将该扩展名注册为它的文件之一 就像 python exe 为 pyc 所做的那样 结果当然是
  • 如何标记一个类是线程安全的(或不是线程安全的)?

    在 MSDN 文档中我们看到 Console http msdn microsoft com en us library 43zwz7ys v VS 100 aspx 线程安全 这种类型是线程安全的 文本编写器 http msdn micr
  • ALAssetRepresentation 元数据方法报告崩溃

    我有一些代码包装了一个 ALAsset 对象 该对象是通过枚举 ALAssetLibrary 中的资产而检索到的 我收到用户的报告 称包装对象的部分向其包含的 ALAsset 请求元数据时遇到崩溃 崩溃的代码位于这个包装类中 它只是询问其
  • 是否可以将 CSS 选择器中的重要属性值变为不重要属性值?

    是否可以将 CSS 选择器中的重要属性值变为不重要属性值 例如 Bootstrap 3 定义 hide class https github com twbs bootstrap blob 26727bfefd46059a6ce66be7e
  • 如何计算叉积?

    我有以下一段伪 C Java C 代码 int a 30 20 int b 40 50 int c 12 12 如何计算叉积 ABxAC 上一个问题中给出的解决方案基本上为您的所有点添加了 Z 0 在如此扩展的向量上 你可以计算出叉积 在几
  • SQL查询按日期时间分组问题?

    我有这个 SQL 查询 SELECT DISTINCT BatchCode SUM Quantity as Created TotalQuantity Status Destination DateCreated CreatedBy FRO
  • 错误:规则只能有一个资源源(提供资源和测试+包含+排除)

    你好 我有以下错误 我在 vuejs 中有一个应用程序 它工作正常 错误突然出现 重新安装了所有内容 清理缓存 但我找不到解决方法 我希望你的帮助 错误 规则只能有一个资源源 提供的资源和测试 包含 排除 exclude null use
  • 存储稍后转发的变量参数

    我正在开发一个小程序 它使用操作队列顺序执行操作 我希望能够在我的操作中存储参数 直到它们被执行 然后应该可以从exec 动作的方法 我下面有一个小例子 include
  • 如何生成 RDP 文件

    在我的应用程序中 我需要能够导入 RDP 文件 将它们存储在设置中 并从应用程序内运行它们 基本上是 RDP 管理功能 但第二个要求是我不知道如何解决这个问题 基本上我想让用户创建一个新的 RDP 输入主机名 然后剩下的将通过 RDP 程序
  • css left 属性允许的最大负值是多少?

    我有一个场景 我更新 left 值以显示 div 元素的某些部分 就我而言 div 元素的宽度非常长 我使用 left 属性来通过动画来回移动 div 示例代码 slides next live click function var pos
  • 在 React Native 中将状态从子组件传递到父组件

    我的应用程序有一个设置屏幕 子组件 您可以在其中更改有关您自己的信息 我正在尝试将其呈现在我的应用程序的个人资料屏幕 父组件 上 因此 个人资料屏幕会显示您的信息 如果您想更改任何信息 您可以在设置中进行操作 现在 我在设置屏幕中所做的任何
  • Snowflake - 如何检索当前正在执行的过程的名称?

    我想在 javascript 过程本身中访问 Snowflake 中当前执行的过程的名称并将其存储在变量中 当我询问 this 对象时 我可以在 Variant 返回中看到名称 但就 JSON 而言 我相信这是名称而不是值 并且我不确定如何
  • odeint的runge_kutta4与Matlab的ode45的比较

    我想用runge kutta4方法中的odeint C 库 http headmyshoulder github io odeint v2 我已经用Matlab解决了这个问题 我在Matlab中的以下代码来解决x x g x 初始值x1 1