restart: # BROYDEN ALGORITHM 10.2 # # To approximate the solution of the nonlinear system F(X) = 0 # given an initial approximation X. # # INPUT: Number n of equations and unknowns: initial # approximation X = (X(1),...,X(n)): tolerance TOL: # maximum number of iterations N. # # OUTPUT: Approximate solution X = (X(1),...,X(n)) or a message # that the number of iterations was exceeded. print(`This is the Broyden Method for Nonlinear Systems.`): OK := FALSE: while OK = FALSE do print(`Input the number n of equations.`): N := scanf(`%d`)[1]:print(`n = `):print(N): if N >= 2 then OK := TRUE: else print(`n must be an integer greater than 1.`): fi: od: for I1 from 1 to N do print(`Input the function f[i](x1,x2, ... xn) in terms of x1, x2, ... for i = `):print(I1): print(`For example: x1-x2^2+1`): F[I1] := scanf(`%a`)[1]:print(`function is `):print(F[I1]): od: for I1 from 1 to N do for J from 1 to N do PD[I1,J] := diff(F[I1],evaln(x || J)):print(`partial derivative i,j `):print(I1,J):print(PD[I1,J]): PD[I1,J] := unapply(PD[I1,J],evaln(x || (1..N))): od: od: for I1 from 1 to N do F[I1] := unapply(F[I1],evaln(x || (1..N))): od: OK := FALSE: while OK = FALSE do print(`Input tolerance`): TOL := scanf(`%f`)[1]:print(`Tolerance = `):print(TOL): if TOL > 0 then OK := TRUE: else print(`Tolerance must be positive.`): fi: od: OK := FALSE: while OK = FALSE do print(`Input the maximum number of iterations.`): NN := scanf(`%d`)[1]:print(`Maximum number of iterations = `):print(NN): if NN > 0 then OK := TRUE: else print(`Must be a positive integer.`): fi: od: for I1 from 1 to N do print(`Input initial approximation X(I), I = `, I1): X[I1-1] := scanf(`%f`)[1]: print(`Input is `): print(X[I1-1]): od: if OK = TRUE then print(`Select output destination`): print(`1. Screen`): print(`2. Text file`): print(`Enter 1 or 2`): FLAG := scanf(`%d`)[1]:print(`Your response is `):print(FLAG): if FLAG = 2 then print(`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): else OUP := default: fi: print(`Select amount of output`): print(`1. Answer only`): print(`2. All intermeditate approximations`): print(`Enter 1 or 2`): FLAG := scanf(`%d`)[1]: print(`Your response is `):print(FLAG): fprintf(OUP, `BROYDENS METHOD FOR NONLINEAR SYSTEMS\134n\134n`): if FLAG = 2 then fprintf(OUP, `Iteration, Approximation, Error\134n`): fi: # Step 1 # A will hold the Jacobian for the initial approximation for I1 from 1 to N do for J from 1 to N do A[I1-1,J-1] := evalf(PD[I1,J](seq(X[i],i=0..N-1))): od: # Compute V = F(X(0)) V[I1-1] := evalf(F[I1](seq(X[i],i=0..N-1))): od: # Step 2 for I1 from 1 to N do for J from 1 to N do B[I1-1,J-1] := 0: od: B[I1-1,I1-1] := 1: od: I1 := 1: while I1 <= N and OK = TRUE do I2 := I1+1: I3 := I1: if I1 <> N then C := abs(A[I1-1,I1-1]): for J from I2 to N do if abs(A[J-1,I1-1]) > C then I3 := J: C := abs(A[J-1,I1-1]): fi: od: if C <= 1.0e-20 then OK := FALSE: else if I3 <> I1 then for J from 1 to N do C := A[I1-1,J-1]: A[I1-1,J-1] := A[I3-1,J-1]: A[I3-1,J-1] := C: C := B[I1-1,J-1]: B[I1-1,J-1] := B[I3-1,J-1]: B[I3-1,J-1] := C: od: fi: fi: else if abs(A[N-1,N-1]) <= 1.0e-20 then OK := FALSE: fi: fi: if OK = TRUE then for J from 1 to N do if J <> I1 then C := A[J-1,I1-1]/A[I1-1,I1-1]: for K from 1 to N do A[J-1,K-1] := A[J-1,K-1]-C*A[I1-1,K-1]: B[J-1,K-1] := B[J-1,K-1]-C*B[I1-1,K-1]: od: fi: od: fi: I1 := I1+1: od: if OK = TRUE then for I1 from 1 to N do C := A[I1-1,I1-1]: for J from 1 to N do A[I1-1,J-1] := B[I1-1,J-1]/C: od: od: else print(`Jacobian has no inverse`): fi: if OK = TRUE then # Step 3 K := 2: # Note: S = S(1) SN := 0: for I1 from 1 to N do S[I1-1] := 0: for J from 1 to N do S[I1-1] := S[I1-1]-A[I1-1,J-1]*V[J-1]: od: SN := SN+S[I1-1]^2: od: SN := sqrt(SN): for I1 from 1 to N do X[I1-1] := X[I1-1]+S[I1-1]: od: if FLAG = 2 then fprintf(OUP,` %d`,K-1): for I1 from 1 to N do fprintf(OUP,` %11.8f`,X[I1-1]): od: fprintf(OUP,`\134n %12.6e\134n`,SN): fi: # Step 4 while K < NN and OK = TRUE do # Step 5 for I1 from 1 to N do VV := evalf(F[I1](seq(X[i],i=0..N-1))): Y[I1-1] := VV-V[I1-1]: V[I1-1] := VV: od: # Note: V = F(X(K)) and Y = Y(K) # Step 6 ZN := 0: for I1 from 1 to N do Z[I1-1] := 0: for J from 1 to N do Z[I1-1] := Z[I1-1]-A[I1-1,J-1]*Y[J-1]: od: ZN := ZN+Z[I1-1]*Z[I1-1]: od: ZN := sqrt(ZN): # Note: Z = -A(K-1)^(-1)*Y(K) # Step 7 P := 0: # P will be S(K)^T*A(K-1)^(-1)*Y(K) for I1 from 1 to N do P := P-S[I1-1]*Z[I1-1]: od: # Step 8 for I1 from 1 to N do U[I1-1] := 0: for J from 1 to N do U[I1-1] := U[I1-1]+S[J-1]*A[J-1,I1-1]: od: # Step 9 od: for I1 from 1 to N do for J from 1 to N do A[I1-1,J-1] := A[I1-1,J-1]+(S[I1-1]+Z[I1-1])*U[J-1]/P: od: od: # Step 10 SN := 0: for I1 from 1 to N do S[I1-1] := 0: for J from 1 to N do S[I1-1] := S[I1-1]-A[I1-1,J-1]*V[J-1]: od: SN := SN+S[I1-1]^2: od: SN := sqrt(SN): # Note: A = A(K)^(-1) and S = -A(K)^(-1)*F(X(K)) # Step 11 for I1 from 1 to N do X[I1-1] := X[I1-1]+S[I1-1]: od: # Note: X = X(K+1) KK := K+1: if FLAG = 2 then fprintf(OUP, ` %2d`, K): for I1 from 1 to N do fprintf(OUP, ` %11.8f`, X[I1-1]): od: fprintf(OUP, `\134n%12.6e\134n`, SN): fi: if SN <= TOL then # Procedure completed successfully OK := FALSE: fprintf(OUP, `Iteration number %d`, K): fprintf(OUP, ` gives solution:\134n\134n`): for I1 from 1 to N do fprintf(OUP, ` %11.8f`, X[I1-1]): od: fprintf(OUP, `\134n\134nto within tolerance %.10e\134n\134n`, TOL): fprintf(OUP, `Process is complete\134n`): else # Step 13 K := KK: fi: od: if K >= NN then # Step 14 fprintf(OUP, `Procedure does not converge in %d iterations\134n`, NN): fi: fi: fi: if OUP <> default then fclose(OUP): print(`Output file `,NAME,` created sucessfully`): fi: SVJUaGlzfmlzfnRoZX5Ccm95ZGVufk1ldGhvZH5mb3J+Tm9ubGluZWFyflN5c3RlbXMuRzYi SUFJbnB1dH50aGV+bnVtYmVyfm5+b2Z+ZXF1YXRpb25zLkc2Ig== SSVufj1+RzYi IiIk SWJvSW5wdXR+dGhlfmZ1bmN0aW9ufmZbaV0oeDEseDIsfi4uLn54bil+aW5+dGVybXN+b2Z+eDEsfngyLH4uLi5+Zm9yfml+PX5HNiI= IiIi STdGb3J+ZXhhbXBsZTp+eDEteDJeMisxRzYi SS1mdW5jdGlvbn5pc35HNiI= LChJI3gxRzYiIiIkLUkkY29zRzYkJSpwcm90ZWN0ZWRHSShfc3lzbGliR0YkNiMqJkkjeDJHRiQiIiJJI3gzR0YkRi4hIiIkISImRjBGLg== SWJvSW5wdXR+dGhlfmZ1bmN0aW9ufmZbaV0oeDEseDIsfi4uLn54bil+aW5+dGVybXN+b2Z+eDEsfngyLH4uLi5+Zm9yfml+PX5HNiI= IiIj STdGb3J+ZXhhbXBsZTp+eDEteDJeMisxRzYi SS1mdW5jdGlvbn5pc35HNiI= LCoqJEkjeDFHNiIiIiMiIiIqJCwmSSN4MkdGJUYnJEYnISIiRidGJiEjIiktSSRzaW5HNiQlKnByb3RlY3RlZEdJKF9zeXNsaWJHRiU2I0kjeDNHRiVGJyQiJDEiISIjRic= SWJvSW5wdXR+dGhlfmZ1bmN0aW9ufmZbaV0oeDEseDIsfi4uLn54bil+aW5+dGVybXN+b2Z+eDEsfngyLH4uLi5+Zm9yfml+PX5HNiI= IiIk STdGb3J+ZXhhbXBsZTp+eDEteDJeMisxRzYi SS1mdW5jdGlvbn5pc35HNiI= LCgtSSRleHBHNiQlKnByb3RlY3RlZEdJKF9zeXNsaWJHNiI2IywkKiZJI3gxR0YoIiIiSSN4MkdGKEYtISIiRi1JI3gzR0YoIiM/JCIrOGIoPloqISIqRi0= SThwYXJ0aWFsfmRlcml2YXRpdmV+aSxqfkc2Ig== NiQiIiJGIw== IiIk SThwYXJ0aWFsfmRlcml2YXRpdmV+aSxqfkc2Ig== NiQiIiIiIiM= KiYtSSRzaW5HNiQlKnByb3RlY3RlZEdJKF9zeXNsaWJHNiI2IyomSSN4MkdGKCIiIkkjeDNHRihGLEYsRi1GLA== SThwYXJ0aWFsfmRlcml2YXRpdmV+aSxqfkc2Ig== NiQiIiIiIiQ= KiYtSSRzaW5HNiQlKnByb3RlY3RlZEdJKF9zeXNsaWJHNiI2IyomSSN4MkdGKCIiIkkjeDNHRihGLEYsRitGLA== SThwYXJ0aWFsfmRlcml2YXRpdmV+aSxqfkc2Ig== NiQiIiMiIiI= LCRJI3gxRzYiIiIj SThwYXJ0aWFsfmRlcml2YXRpdmV+aSxqfkc2Ig== NiQiIiNGIw== LCZJI3gyRzYiISRpIiRGJSEiIiIiIg== SThwYXJ0aWFsfmRlcml2YXRpdmV+aSxqfkc2Ig== NiQiIiMiIiQ= LUkkY29zRzYkJSpwcm90ZWN0ZWRHSShfc3lzbGliRzYiNiNJI3gzR0Yn SThwYXJ0aWFsfmRlcml2YXRpdmV+aSxqfkc2Ig== NiQiIiQiIiI= LCQqJkkjeDJHNiIiIiItSSRleHBHNiQlKnByb3RlY3RlZEdJKF9zeXNsaWJHRiU2IywkKiZJI3gxR0YlRiZGJEYmISIiRiZGMA== SThwYXJ0aWFsfmRlcml2YXRpdmV+aSxqfkc2Ig== NiQiIiQiIiM= LCQqJkkjeDFHNiIiIiItSSRleHBHNiQlKnByb3RlY3RlZEdJKF9zeXNsaWJHRiU2IywkKiZGJEYmSSN4MkdGJUYmISIiRiZGMA== SThwYXJ0aWFsfmRlcml2YXRpdmV+aSxqfkc2Ig== NiQiIiRGIw== IiM/ STBJbnB1dH50b2xlcmFuY2VHNiI= SS1Ub2xlcmFuY2V+PX5HNiI= JCIiIiEiJg== SUhJbnB1dH50aGV+bWF4aW11bX5udW1iZXJ+b2Z+aXRlcmF0aW9ucy5HNiI= SUBNYXhpbXVtfm51bWJlcn5vZn5pdGVyYXRpb25zfj1+RzYi IiM6 NiRJR0lucHV0fmluaXRpYWx+YXBwcm94aW1hdGlvbn5YKEkpLH5Jfj1+RzYiIiIi SSpJbnB1dH5pc35HNiI= JCIiIiEiIg== NiRJR0lucHV0fmluaXRpYWx+YXBwcm94aW1hdGlvbn5YKEkpLH5Jfj1+RzYiIiIj SSpJbnB1dH5pc35HNiI= JCIiIiEiIg== NiRJR0lucHV0fmluaXRpYWx+YXBwcm94aW1hdGlvbn5YKEkpLH5Jfj1+RzYiIiIk SSpJbnB1dH5pc35HNiI= JCEiIkYj STpTZWxlY3R+b3V0cHV0fmRlc3RpbmF0aW9uRzYi SSoxLn5TY3JlZW5HNiI= SS0yLn5UZXh0fmZpbGVHNiI= SS1FbnRlcn4xfm9yfjJHNiI= STJZb3VyfnJlc3BvbnNlfmlzfkc2Ig== IiIi SThTZWxlY3R+YW1vdW50fm9mfm91dHB1dEc2Ig== SS8xLn5BbnN3ZXJ+b25seUc2Ig== SUQyLn5BbGx+aW50ZXJtZWRpdGF0ZX5hcHByb3hpbWF0aW9uc0c2Ig== SS1FbnRlcn4xfm9yfjJHNiI= STJZb3VyfnJlc3BvbnNlfmlzfkc2Ig== IiIj BROYDENS METHOD FOR NONLINEAR SYSTEMS Iteration, Approximation, Error 1 0.49986967 0.01946685 -0.52152047 5.865670e-01 2 0.49998638 0.00873784 -0.52317457 1.085640e-02 3 0.50000660 0.00086727 -0.52357234 7.880637e-03 4 0.50000033 0.00003953 -0.52359769 8.281569e-04 5 0.50000000 0.00000019 -0.52359877 3.935104e-05 6 0.50000000 -0.00000000 -0.52359878 1.937122e-07 Iteration number 6 gives solution: 0.50000000 -0.00000000 -0.52359878 to within tolerance 1.0000000000e-05 Process is complete JSFH