> restart: > # LINEAR SHOOTING ALGORITHM 11.1 > # > # To approximate the solution of the boundary-value problem > # > # -Y'' + P(X)Y' + Q(X)Y + R(X) = 0, A<=X<=B, Y(A)=ALPHA, Y(B)=BETA: > # > # > # INPUT: Endpoints A,B: boundary conditions ALPHA, BETA: number of > # subintervals N. > # > # OUTPUT: Approximations W(1,I) to Y(X(I)): W(2,I) to Y'(X(I)) > # for each I=0,1,...,N. > print(`This is the Linear Shooting Method.`): > print(`Input the functions P(X), Q(X) and R(X) in terms of x, separated by spaces.`): > print(`For example: -2/x 2/(x^2) sin(log(x))/(x^2)`): > P := scanf(`%a`)[1]: print(`P(x) = `):print(P): > Q := scanf(`%a`)[1]: print(`Q(x) = `):print(P): > R := scanf(`%a`)[1]: print(`R(x) = `):print(R): > P := unapply(P,x): > Q := unapply(Q,x): > R := unapply(R,x): > OK := FALSE: > while OK = FALSE do > print(`Input left and right endpoints separated by blank.`): > A := scanf(`%f`)[1]: print(`Left endpoint = `):print(A): > B := scanf(`%f`)[1]: print(`Right endpoint = `):print(B): > if A >= B then > print(`Left endpoint must be less than right endpoint.`): > else > OK := TRUE: > fi: > od: > print(`Input Y(A).`): > ALPHA := scanf(`%a`)[1]: print(`alpha = `):print(ALPHA): > print(`Input Y(B).`): > BETA := scanf(`%a`)[1]: print(`beta = `):print(BETA): > OK := FALSE: > while OK = FALSE do > print(`Input a positive integer for the number of subintervals.`): > N := scanf(`%d`)[1]: print(`Input = `): print(N): > if N <= 0 then > print(`Number must be a positive integer.`): > else > OK := TRUE: > fi: > od: > if OK = TRUE then > 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 = `): 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, `LINEAR SHOOTING METHOD\n\n`): > fprintf(OUP, ` I X(I) W(1,I) W(2,I)\n`): > # Step 1 > H := (B-A)/N: > U1 := ALPHA: > U2 := 0: > V1 := 0: > V2 := 1: > # Step 2 > for I2 from 1 to N do > # Step 3 > X := A+(I2-1)*H: > T := X+0.5*H: > # Step 4 > K11 := H*U2: > K12 := H*(P(X)*U2+Q(X)*U1+R(X)): > K21 := H*(U2+0.5*K12): > K22 := H*(P(T)*(U2+0.5*K12)+Q(T)*(U1+0.5*K11)+R(T)): > K31 := H*(U2+0.5*K22): > K32 := H*(P(T)*(U2+0.5*K22)+Q(T)*(U1+0.5*K21)+R(T)): > T := X+H: > K41 := H*(U2+K32): > K42 := H*(P(T)*(U2+K32)+Q(T)*(U1+K31)+R(T)): > U1 := U1+(K11+2*(K21+K31)+K41)/6: > U2 := U2+(K12+2*(K22+K32)+K42)/6: > K11 := H*V2: > K12 := H*(P(X)*V2+Q(X)*V1): > T := X+0.5*H: > K21 := H*(V2+0.5*K12): > K22 := H*(P(T)*(V2+0.5*K12)+Q(T)*(V1+0.5*K11)): > K31 := H*(V2+0.5*K22): > K32 := H*(P(T)*(V2+0.5*K22)+Q(T)*(V1+0.5*K21)): > T := X+H: > K41 := H*(V2+K32): > K42 := H*(P(T)*(V2+K32)+Q(T)*(V1+K31)): > V1 := V1+(K11+2*(K21+K31)+K41)/6: > V2 := V2+(K12+2*(K22+K32)+K42)/6: > U[0,I2-1] := U1: > U[1,I2-1] := U2: > V[0,I2-1] := V1: > V[1,I2-1] := V2: > od: > # Step 5 > W1 := ALPHA: > Z := (BETA-U[0,N-1])/V[0,N-1]: > X := A: > I2 := 0: > fprintf(OUP, `%3d %11.8f %11.8f %11.8f\n`, I2, X, W1, Z): > # Step 6 > for I2 from 1 to N do > X := A+I2*H: > W1 := U[0,I2-1]+Z*V[0,I2-1]: > W2 := U[1,I2-1]+Z*V[1,I2-1]: > fprintf(OUP, `%3d %11.8f %11.8f %11.8f\n`, I2, X, W1, W2): > od: > # Step 7 > if OUP <> default then > fclose(OUP): > print(`Output file `,NAME,` created successfully`): > fi: > fi: