Anonymous user
Runge-Kutta method: Difference between revisions
m
→{{header|REXX}}: added whitespace, optimized a function, simplified some code.
m (→{{header|C++}}: minor stylistic changes) |
m (→{{header|REXX}}: added whitespace, optimized a function, simplified some code.) |
||
Line 2,751:
╚═══════════════╝ y'(t)=t² √ y(t) ╚═══════════════════════════════════════════╝
</pre>
<lang rexx>/*REXX program uses the Runge─Kutta method to solve the equation:
numeric digits 40; f= digits() % 4
x0= 0;
n=1 + (x1-x0) / dx
y.=1; do m=1 for n-1; p= m - 1; y.m= RK4(dx, x0 + dx*p, y.p)
end /*m*/ /* [↑] use 4th order Runge─Kutta. */
w= digits() % 2
say center('X', f, "═") center('Y', w+2, "═") center("relative error", w+8, '═') /*hdr*/
do i=0 to n-1 by 10; x= (x0 + dx*i) / 1;
say center(x, f) fmt(y.i) left('', 2 + ($>=0) ) fmt($)
end /*i*/ /*└┴┴┴───◄─────── aligns positive #'s. */
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
fmt: parse arg z; z= right( format(
jus= has. & \hasE; T=
return translate( right(z, (z>=0) + w + 5*hasE + 2*(jus & (z<0) ) ),
/*──────────────────────────────────────────────────────────────────────────────────────*/
RK4: procedure; parse arg dx,x,y; dxH= dx/2; k1= dx * (x ) * sqrt(y )
k2= dx * (x + dxH) * sqrt(y + k1/2)
k3= dx * (x + dxH) * sqrt(y + k2/2)
k4= dx * (x + dx ) * sqrt(y + k3 )
return y + (k1 + k2*2 + k3*2 + k4) / 6
/*──────────────────────────────────────────────────────────────────────────────────────*/
|