Runge-Kutta method: Difference between revisions

→‎{{header|C++}}: simplifying a bit
(Added Wren)
(→‎{{header|C++}}: simplifying a bit)
Line 408:
Using Lambdas
<lang cpp>/*
* compiled with gcc 5.4:
* g++-mp-5 -std=c++14(Debian 8.3.0-o6) rk4 rk48.3.cc0
*
* g++ -std=c++14 -o rk4 %
*
*/
# include <iostream>
# include <math.h>
using namespace std;
 
auto rk4(double f(double, double))
{
return
[ f =](double t, double y, double dt ) -> double { return
[t,y,dt,f =]( double dy1) -> double { return
[t,y,dt,f,dy1 =]( double dy2) -> double { return
[t,y,dt,f,dy1,dy2 =]( double dy3) -> double { return
[t,y,dt,f,dy1,dy2,dy3=]( double dy4) -> double { return
( dy1 + 2*dy2 + 2*dy3 + dy4 ) / 6 ;} (
dt * f( t+dt , y+dy3 ) );} (
Line 429 ⟶ 430:
dt * f( t+dt/2, y+dy1/2 ) );} (
dt * f( t , y ) );} ;
}
bool is_whole(double t) {
constexpr double WHOLE_TOLERANCE = 1e-12;
return std::fabs(t-round(t)) < WHOLE_TOLERANCE;
}
 
int main(void)
{
constconstexpr double TIME_MAXIMUM = 10.0, WHOLE_TOLERANCE = 1e-12 ;
const double T_START = 0.0, Y_START = 1.0, DT = 0.10;
double y = Y_START, t = T_START ;1.0,
 
return DT = 0.10;
auto eval_diff_eqn = [ ](double t, double y)->double{ return t*sqrt(y) ; } ;
auto eval_solution = [ ](double t )->double{ return pow(t*t+4,2)/16 ; } ;
auto find_error = [eval_solution ](double t, double y)->double{ return fabs(y-eval_solution(t)) ; } ;
auto is_whole = [WHOLE_TOLERANCE](double t )->bool { return fabs(t-round(t)) < WHOLE_TOLERANCE; } ;
 
auto eval_diff_eqndy = rk4( [ ](double t, double y) -> double { return t*sqrt(y) ; } ) ;
auto dy = rk4( eval_diff_eqn ) ;
 
for (
double y = Y_START, t = T_START ;
double y = Y_START, t = T_START ;
while(t <= TIME_MAXIMUM) {;
y += dy(t,y,DT) ;, t += DT;
})
if (is_whole(t))
if (is_whole(t)) { printf("y(%4.1f)\t=%12.6f \t error: %12.6e\n", t, y,find_error std::fabs(y - pow(t*t+4,y2)/16)); }
 
return 0;
while(t <= TIME_MAXIMUM) {
if (is_whole(t)) { printf("y(%4.1f)\t=%12.6f \t error: %12.6e\n",t,y,find_error(t,y)); }
y += dy(t,y,DT) ; t += DT;
}
return 0;
}</lang>
 
1,934

edits