restart:# WAVE EQUATION FINITE-DIFFERENCE ALGORITHM 12.4## To approximate the solution to the wave equation:# subject to the boundary conditions# u(0,t) = u(l,t) = 0, 0 < t < T = max t# and the initial conditions# u(x,0) = F(x) and Du(x,0)/Dt = G(x), 0 <= x <= l:## INPUT: endpoint l: maximum time T: constant ALPHA: integers m, N.## OUTPUT: approximations W(I,J) to u(x(I),t(J)) for each I = 0, ..., m# and J=0,...,N.print(`This is the Finite-Difference Method for the Wave Equation.`):print(`Input the functions F(X) and G(X) in terms of x, separated by a space.`):print(`For example: sin(3.141592654*x) 0`):F := scanf(`%a`)[1]:G := scanf(`%a`)[1]:print(`F(x) = `):print(F):print(`G(x) = `):print(G):F := unapply(F,x):G := unapply(G,x):print(`The lefthand endpoint on the X-axis is 0.`):OK := FALSE:while OK = FALSE doprint(`Input the righthand endpoint on the X-axis.`):FX := scanf(`%f`)[1]:print(`Righthand endpoint = `):print(FX):if FX <= 0 thenprint(`Must be a positive number.`):elseOK := TRUE:fi:od:OK := FALSE:while OK = FALSE doprint(`Input the maximum value of the time variable T.`):FT := scanf(`%f`)[1]:print(`Maximum time value = `):print(FT):if FT <= 0 thenprint(`Must be a positive number.\134n`):elseOK := TRUE:fi:od:print(`Input the constant alpha.`):ALPHA := scanf(`%f`)[1]:print(`alpha = `):print(ALPHA):OK := FALSE:while OK = FALSE doprint(`Input integer m := number of intervals on X-axis`):print(`and N := number of time intervals - separated by a blank.`):print(`Note that m must be 3 or larger.`):M := scanf(`%d`)[1]:N := scanf(`%d`)[1]:print(`Number of intervals on x-axis m = `):print(M):print(`Number of time intervals n = `):print(N):if M <= 2 or N <= 0 thenprint(`Numbers are not within correct range.`):elseOK := TRUE:fi:od:if OK = TRUE thenM1 := M+1:M2 := M-1:N1 := N+1:N2 := N-1:# Step 1# V is used in place of lambdaH := FX/M:K := FT/N:V := ALPHA*K/H:# Step 2for J from 2 to N1 doW[0,J-1] := 0:W[M1-1,J-1] := 0:od:# Step 3W[0,0] := evalf(F(0)):W[M1-1,0] := evalf(F(FX)):# Step 4for I2 from 2 to M doW[I2-1,0] := F(H*(I2-1)):W[I2-1,1] := (1-V^2)*F(H*(I2-1))+V^2*(F(I2*H)+F(H*(I2-2)))/2+K*G(H*(I2-1)):od:# Step 5for J from 2 to N dofor I2 from 2 to M doW[I2-1,J] := evalf(2*(1-V^2)*W[I2-1,J-1]+V^2*(W[I2,J-1]+W[I2-2,J-1])-W[I2-1,J-2]):od:od:# Step 6print(`Choice of output method:`):print(`1. Output to screen`):print(`2. Output to text file`):print(`Please enter 1 or 2.`):FLAG := scanf(`%d`)[1]: print(`Input is `):print(FLAG):if FLAG = 2 thenprint(`Input the file name in the form - drive:\134\134name.ext`):print(`for example: A:\134\134OUTPUT.DTA`):NAME := scanf(`%s`)[1]: print(`Output file is `):print(NAME):OUP := fopen(NAME,WRITE,TEXT):elseOUP := default:fi:fprintf(OUP, `FINITE DIFFERENCE METHOD FOR THE WAVE EQUATION\134n\134n`):fprintf(OUP, ` I X(I) W(X(I),%12.6e)\134n`, FT):for I2 from 1 to M1 doX := (I2-1)*H:fprintf(OUP, `%3d %11.8f %13.8f\134n`, I2, X, W[I2-1,N1-1]):od:if OUP <> default thenfclose(OUP):print(`Output file `,NAME,` created successfully`):fi:fi:JSFH