> 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 do > print(`Input the righthand endpoint on the X-axis.`): > FX := scanf(`%f`)[1]: > print(`Righthand endpoint = `):print(FX): > if FX <= 0 then > print(`Must be a positive number.`): > else > OK := TRUE: > fi: > od: > OK := FALSE: > while OK = FALSE do > print(`Input the maximum value of the time variable T.`): > FT := scanf(`%f`)[1]: > print(`Maximum time value = `):print(FT): > if FT <= 0 then > print(`Must be a positive number.\n`): > else > OK := TRUE: > fi: > od: > print(`Input the constant alpha.`): > ALPHA := scanf(`%f`)[1]:print(`alpha = `):print(ALPHA): > OK := FALSE: > while OK = FALSE do > print(`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 then > print(`Numbers are not within correct range.`): > else > OK := TRUE: > fi: > od: > if OK = TRUE then > M1 := M+1: > M2 := M-1: > N1 := N+1: > N2 := N-1: > # Step 1 > # V is used in place of lambda > H := FX/M: > K := FT/N: > V := ALPHA*K/H: > # Step 2 > for J from 2 to N1 do > W[0,J-1] := 0: > W[M1-1,J-1] := 0: > od: > # Step 3 > W[0,0] := evalf(F(0)): > W[M1-1,0] := evalf(F(FX)): > # Step 4 > for I2 from 2 to M do > W[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 5 > for J from 2 to N do > for I2 from 2 to M do > W[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 6 > print(`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 then > print(`Input the file name in the form - drive:\\name.ext`): > print(`for example: A:\\OUTPUT.DTA`): > NAME := scanf(`%s`)[1]: print(`Output file is `):print(NAME): > OUP := fopen(NAME,WRITE,TEXT): > else > OUP := default: > fi: > fprintf(OUP, `FINITE DIFFERENCE METHOD FOR THE WAVE EQUATION\n\n`): > fprintf(OUP, ` I X(I) W(X(I),%12.6e)\n`, FT): > for I2 from 1 to M1 do > X := (I2-1)*H: > fprintf(OUP, `%3d %11.8f %13.8f\n`, I2, X, W[I2-1,N1-1]): > od: > if OUP <> default then > fclose(OUP): > print(`Output file `,NAME,` created successfully`): > fi: > fi: