1 CHAPTER 25 25.1 The analytical solution can be derived by separation of variables dy x 2 1.1 dx y ln y x3 1.1x C 3 Substituting the initial conditions yields C = 0. Taking the exponential gives the final result y x3 1.1 x e3 The result can be plotted as 2 1 0 0 1 2 25.3 For Heun’s method, the value of the slope at x = 0 can be computed as 1.1 which can be used to compute the value of y at the end of the interval as y(0.5) 1 (0 1.1(1))0.5 0.45 The slope at the end of the interval can be computed as y' (0.5) 0.45(0.5) 2 1.1(0.45) 0.3825 which can be averaged with the initial slope to predict y(0.5) 1 1.1 0.3825 0.5 0.629375 2 This formula can then be iterated to yield j 0 1 yij 0.45 0.629375 a 28.5% 2 2 3 4 0.5912578 0.5993577 0.5976365 6.45% 1.35% 0.288% The remaining steps can be implemented with the result xi 0 0.5 1 1.5 2 yi 1.0000000 0.5976365 0.4590875 0.6269127 2.8784358 The results along with the analytical solution are displayed below: 3 2 1 0 0 1 2 25.5 The 4th-order RK method with h = 0.5 gives x 0 0.5 1 1.5 2 y 1 0.60157 0.464524 0.59138 1.584452 k1 -1.1 -0.51133 -0.04645 0.680087 4.594911 ym 0.725 0.473737 0.452911 0.761402 2.73318 k2 -0.75219 -0.25463 0.209471 1.494252 10.83023 ym 0.811953 0.537912 0.516892 0.964943 4.292008 k3 -0.8424 -0.28913 0.239062 1.893701 17.00708 ye 0.578799 0.457006 0.584055 1.538231 10.08799 2 1 0 0 1 2 25.7 The second-order ODE is transformed into a pair of first-order ODEs as in k4 -0.49198 -0.0457 0.671663 4.460869 51.95317 -0.79686 -0.27409 0.253713 1.986144 18.70378 3 dy z dt dz 0.5 x y dt y (0)=2 z (0)=0 (a) The first few steps of Euler’s method are x y z dy/dx dz/dx 0 0.1 0.2 0.3 0.4 0.5 2 2 1.98 1.9405 1.8822 1.805995 0 -0.2 -0.395 -0.583 -0.76205 -0.93027 0 -0.2 -0.395 -0.583 -0.76205 -0.93027 -2 -1.95 -1.88 -1.7905 -1.6822 -1.556 (b) For Heun (without iterating the corrector) the first few steps are x y 0 2 0.1 1.99 0.2 1.96055 0.3 1.912446 0.4 1.846671 0.5 1.764385 z 0 -0.1975 -0.38801 -0.56963 -0.74052 -0.89899 dy/dx 0 -0.1975 -0.38801 -0.56963 -0.74052 -0.89899 dz/dx -2 -1.94 -1.86055 -1.76245 -1.64667 -1.51439 yend 2 1.97025 1.921749 1.855483 1.772619 1.674486 zend -0.2 -0.3915 -0.57407 -0.74587 -0.90519 -1.05043 dy/dx -0.2 -0.3915 -0.57407 -0.74587 -0.90519 -1.05043 dz/dx ave slope -1.95 -0.1 -1.87025 -0.2945 -1.77175 -0.48104 -1.65548 -0.65775 -1.52262 -0.82286 -1.37449 -0.97471 Both results are plotted below: 4 Heun y 2 x 0 0 2 z 4 Euler -2 25.9 (a) The Heun method without iteration can be implemented as in the following table: t 0 0.1 0.2 0.3 0.4 0.5 y k1 1 1.00005 1.000492 1.002176 1.006436 1.014986 0 0.000995 0.007845 0.025865 0.059434 0.111847 yend 1 1.000149 1.001276 1.004762 1.012379 1.02617 k2 0.000995 0.007843 0.025841 0.059335 0.11156 0.184731 0.000498 0.004419 0.016843 0.0426 0.085497 0.148289 4 2.9 3.784421 0.051826 3.789604 0.01065 0.031238 3 3.787545 0.010644 3.78861 0.000272 0.005458 (b) The Ralston 2nd order RK method can be implemented as in the following table: t 0 0.1 0.2 0.3 0.4 0.5 2.9 3 y 1 1.000028 1.000413 1.002011 1.006162 1.014587 k1 0 0.000995 0.007845 0.02586 0.059418 0.111803 yint 1 1.000103 1.001001 1.00395 1.010618 1.022972 k2 0.000421 0.005278 0.020043 0.049332 0.096672 0.164537 0.00028 0.003851 0.015977 0.041508 0.084254 0.146959 3.785066 0.051835 3.788954 0.017276 0.028796 3.787946 0.010646 3.788744 0.001116 0.004293 Both methods are displayed on the following plot along with the exact solution, ye cos t cos3 t 2 3 3 Note that both methods agree closely with the exact solution. Exact 4 Ralston Heun 2 0 0 1 2 3 25.11 (a) Euler x 0 0.2 0.4 0.6 0.8 1 y 2.0000 2.0000 1.8550 1.6492 1.4286 1.2166 z 4.0000 1.8667 1.4021 1.1590 1.0113 0.9139 dy/dx dz/dx 0.00 -10.67 -0.73 -2.32 -1.03 -1.22 -1.10 -0.74 -1.06 -0.49 -0.96 -0.34 (b) 4th-order RK x y 0 2.000 0.2 1.934 k11 k12 k21 k22 k31 k32 k41 k42 z 1 2 4.000 0.000 -10.667 -0.381 -5.736 -0.305 -7.678 -0.603 -3.926 -0.329 -6.903 2.619 -0.594 -4.423 -0.786 -2.962 -0.748 -3.338 -0.888 -2.266 -0.758 -3.215 5 0.4 0.6 0.8 1 1.783 1.593 1.393 1.201 1.976 1.617 1.392 1.243 -0.884 -0.990 -0.990 -0.930 -2.321 -1.387 -0.901 -0.618 -0.962 -1.001 -0.963 -0.884 -1.718 -1.087 -0.732 -0.515 -0.947 -0.999 -0.968 -0.893 -1.830 -1.131 -0.753 -0.526 -0.991 -0.989 -0.928 -0.840 -1.377 -0.897 -0.617 -0.441 -0.949 -0.997 -0.963 -0.887 -1.799 -1.120 -0.748 -0.524 Both methods are plotted on the same graph below. Notice how Euler’s method (particularly for z) is not very accurate for this step size. The 4th-order RK is much closer to the exact solution. 5 y 4 Euler 3 2 z 1 4th-order RK 0 0 0.2 0.4 0.6 0.8 1 25.13 We will look at the first step only present = y2 y1 = 0.24335 dy 4e 0 0.5(2) 3 dx yscale = 2 + (2(3)) = 8 new = 0.001(8) = 0.008 Because present > new, decrease step. 25.15 Option Explicit Sub EulerTest() Dim i As Integer, m As Integer Dim xi As Double, yi As Double, xf As Double, dx As Double, xout As Double Dim xp(200) As Double, yp(200) As Double 'Assign values yi = 1 xi = 0 xf = 4 dx = 0.5 xout = 0.5 'Perform numerical Integration of ODE Call ODESolver(xi, yi, xf, dx, xout, xp, yp, m) 'Display results Sheets("Sheet1").Select Range("a5:b205").ClearContents Range("a5").Select For i = 0 To m ActiveCell.Value = xp(i) ActiveCell.Offset(0, 1).Select 6 ActiveCell.Value = yp(i) ActiveCell.Offset(1, -1).Select Next i Range("a5").Select End Sub Sub ODESolver(xi, yi, xf, dx, xout, xp, yp, m) 'Generate an array that holds the solution Dim x As Double, y As Double, xend As Double Dim h As Double m = 0 xp(m) = xi yp(m) = yi x = xi y = yi Do 'Print loop xend = x + xout If (xend > xf) Then xend = xf 'Trim step if increment exceeds end h = dx Call Integrator(x, y, h, xend) m = m + 1 xp(m) = x yp(m) = y If (x >= xf) Then Exit Do Loop End Sub Sub Integrator(x, y, h, xend) Dim ynew As Double Do 'Calculation loop If (xend - x < h) Then h = xend - x Call Euler(x, y, h, ynew) y = ynew If (x >= xend) Then Exit Do Loop End Sub 'Trim step if increment exceeds end Sub Euler(x, y, h, ynew) Dim dydx As Double 'Implement Euler's method Call Derivs(x, y, dydx) ynew = y + dydx * h x = x + h End Sub Sub Derivs(x, y, dydx) 'Define ODE dydx = -2 * x ^ 3 + 12 * x ^ 2 - 20 * x + 8.5 End Sub 25.17 Option Explicit Sub Heun() Dim maxit As Integer, es As Double Dim n As Integer, m As Integer, i As Integer, iter As Integer Dim xi As Double, xf As Double, yi As Double, h As Double Dim x As Double, y As Double, y2 As Double, y2old As Double Dim k1 As Double, k2 As Double, slope As Double Dim xp(1000) As Double, yp(1000) As Double, itr(1000) As Integer Dim ea As Double maxit = 15: es = 0.0000001 xi = 0: xf = 4: yi = 2 7 n = 4 h = (xf - xi) / n x = xi y = yi m = 0 xp(m) = x yp(m) = y For i = 1 To n Call Derivs(x, y, k1) y2 = y + k1 * h iter = 0 Do y2old = y2 Call Derivs(x + h, y2, k2) slope = (k1 + k2) / 2 y2 = y + slope * h iter = iter + 1 ea = Abs((y2 - y2old) / y2) * 100 If ea < es Or iter >= maxit Then Exit Do Loop m = m + 1 x = x + h xp(m) = x yp(m) = y2 itr(m) = iter y = y2 Next i Sheets("Heun").Select Range("a5:b1005").ClearContents Range("a5").Select For i = 0 To m ActiveCell.Value = xp(i) ActiveCell.Offset(0, 1).Select ActiveCell.Value = yp(i) ActiveCell.Offset(0, 1).Select ActiveCell.Value = itr(i) ActiveCell.Offset(1, -2).Select Next i Range("a5").Select End Sub Sub Derivs(x, y, dydx) 'Define ODE dydx = 4 * Exp(0.8 * x) - 0.5 * y End Sub 25.19 Option Explicit 8 Sub RK4SysTest() Dim i As Integer, m As Integer, n As Integer, j As Integer Dim xi As Double, yi(10) As Double, xf As Double Dim dx As Double, xout As Double Dim xp(200) As Double, yp(200, 10) As Double 'Assign values n = 2 xi = 0 xf = 2 yi(1) = 4 yi(2) = 6 dx = 0.5 xout = 0.5 'Perform numerical Integration of ODE Call ODESolver(xi, yi, xf, dx, xout, xp, yp, m, n) 'Display results Sheets("Sheet1").Select Range("a5:n205").ClearContents Range("a5").Select For i = 0 To m ActiveCell.Value = xp(i) For j = 1 To n ActiveCell.Offset(0, 1).Select ActiveCell.Value = yp(i, j) Next j ActiveCell.Offset(1, -n).Select Next i Range("a5").Select End Sub Sub ODESolver(xi, yi, xf, dx, xout, xp, yp, m, n) 'Generate an array that holds the solution Dim i As Integer Dim x As Double, y(10) As Double, xend As Double Dim h As Double m = 0 x = xi 'set initial conditions For i = 1 To n y(i) = yi(i) Next i 'save output values xp(m) = x For i = 1 To n yp(m, i) = y(i) Next i Do 'Print loop xend = x + xout If (xend > xf) Then xend = xf 'Trim step if increment exceeds end h = dx Call Integrator(x, y, h, n, xend) m = m + 1 'save output values xp(m) = x For i = 1 To n yp(m, i) = y(i) Next i If (x >= xf) Then Exit Do Loop End Sub Sub Integrator(x, y, h, n, xend) 9 Dim j As Integer Dim ynew(10) As Double Do 'Calculation loop If (xend - x < h) Then h = xend - x Call RK4Sys(x, y, h, n, ynew) For j = 1 To n y(j) = ynew(j) Next j If (x >= xend) Then Exit Do Loop End Sub 'Trim step if increment exceeds end Sub RK4Sys(x, y, h, n, ynew) Dim j As Integer Dim ym(10) As Double, ye(10) As Double Dim k1(10) As Double, k2(10) As Double, k3(10) As Double, k4(10) As Double Dim slope(10) 'Implement RK4 method for systems of ODEs Call Derivs(x, y, k1) For j = 1 To n ym(j) = y(j) + k1(j) * h / 2 Next j Call Derivs(x + h / 2, ym, k2) For j = 1 To n ym(j) = y(j) + k2(j) * h / 2 Next j Call Derivs(x + h / 2, ym, k3) For j = 1 To n ye(j) = y(j) + k3(j) * h Next j Call Derivs(x + h, ye, k4) For j = 1 To n slope(j) = (k1(j) + 2 * (k2(j) + k3(j)) + k4(j)) / 6 Next j For j = 1 To n ynew(j) = y(j) + slope(j) * h Next j x = x + h End Sub Sub Derivs(x, y, dydx) 'Define ODE dydx(1) = -0.5 * y(1) dydx(2) = 4 - 0.3 * y(2) - 0.1 * y(1) End Sub Application to Example 25.10: 10 25.21 The Matlab program shown below performs the Euler Method and displays the time just before the cylindrical tank empties (y < 0). %prob2521.m dt=0.5; t=0; y=3; i=1; while(1) y=y+dydt(t,y)*dt; if y<0, break, end t=t+dt; i=i+1; end function dy=dydt(t,y); dy=-0.06*sqrt(y); The result is 56 minutes as shown below >> prob2521 t = 56 25.23 The two differential equations to be solved are c dv g d v2 dt m dx v dt (a) Here are the first few steps of Euler’s method with a step size of h = 0.2. t 0 0.2 0.4 0.6 0.8 1 x 1000 1000 999.6076 998.8232 997.6479 996.0837 v dx/dt 0 1.962 3.922075 5.876384 7.821118 9.752533 0 -1.962 -3.92208 -5.87638 -7.82112 -9.75253 dv/dt 9.81 9.800376 9.771543 9.72367 9.657075 9.57222 (b) Here are the results of the first few steps of the 4th-order RK method with a step size of h = 0.2. t 0 0.2 0.4 0.6 0.8 1 x 1000 999.8038 999.2157 998.2368 996.869 995.1149 v 0 1.961359 3.918875 5.868738 7.807195 9.730582 11 The results for x of both methods are displayed graphically on the following plots. Because the step size is sufficiently small the results are in close agreement. Both indicate that the parachutist would hit the ground at a little after 20 s. The more accurate 4th-order RK method indicates that the solution reaches the ground between t = 20.2 and 20.4 s. 1500 1000 500 0 -500 0 5 10 15 20 25 25.25 The solution can be obtained with the 4th-order RK method with a step size of 1. Here are the results of the first few steps. x 1950 1951 1952 1953 1954 1955 y 2555 2607.676 2661.132 2715.368 2770.38 2826.168 The entire solution along with the data can be plotted as 8000 6000 4000 2000 0 1940 1960 1980 2000 2020 25.27 First, we must recognize that the evaluation of the definite integral I b a f ( x) dx is equivalent to solving the differential equation 12 dy f (x) dx for y(b) given the initial condition y(a) = 0. Thus, we must solve the following initial-value problem: dy 1 1 6 2 dx ( x 0.3) 0.01 ( x 0.9) 2 0.04 where y(0) = 0. We can do this in a number of ways. One convenient approach is to use the MATLAB function ode45 which implements an adaptive RK method. To do this, we must first set up an M-file to evaluate the right-hand side of the differential equation, function dy = humpsODE(x,y) dy = 1./((x-0.3).^2 + 0.01) + 1./((x-0.9).^2 + 0.04) - 6; Then, the integral can be evaluated as >> [x,y] = ode45(@humpsODE,[0 0.5 1],0); >> disp([x,y]) 0 0 0.50000000000000 21.78356481821654 1.00000000000000 29.85525185285369 Thus, the integral estimate is approximately 29.86.