我想在odeint C++ library中使用runge_kutta4
方法。我已經在Matlab中解決了這個問題。在Matlab我下面的代碼來解決x'' = -x - g*x'
,與初始值x1 = 1
,x2 = 0
,如下所示odeint的runge_kutta4與Matlab的ode45的比較
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;
}
結果是在下面的圖片
我的問題是,爲什麼結果不同?我的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
更新:
的問題是,我忘了包括在我的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
我已經更新代碼,以反映這些修改。
+1不久前,Cleve Moler在MATLAB中寫了一篇關於ODE求解器的博文:http://blogs.mathworks.com/cleve/2014/05/12/ordinary-differential-equation-suite /,http://blogs.mathworks.com/cleve/2014/05/26/ordinary-differential-equation-solvers-ode23-and-ode45/,http://blogs.mathworks.com/cleve/2014/06/09 /普通微分方程剛度/ – Amro 2014-11-05 03:35:27
I second @ Amro的建議。即使你不使用Matlab,也強烈推薦並且有幫助。 [Cleve's Corner博客](http://blogs.mathworks.com/cleve/)非常棒。 – horchler 2014-11-05 04:03:33
@horchler,比你更有幫助和信息。我發現了這個問題。我沒有在我的C++繪圖中包含初始值。這個伎倆。結果現在完美匹配。 – CroCo 2014-11-05 04:13:58