⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alg104.ma

📁 Numerical Anaysis 8th Edition, by Burden and Faires (Mathematica Source)
💻 MA
字号:
(*  CONTINUATION METHOD FOR SYSTEMS ALGORITHM 10.1
*
*   To approximate the solution to the nonlinear system
*    F(x) = 0 given an initail approximation X:
*
*   INPUT: Number n of equations and unknowns; initial approximation
*           X = (X(1), ..., X(n)); number of Runge-Kutta 4
*           iterations N1
*
*  OUTPUT: Approximate solution X = (X(1), ..., X(n)) or a message 
*	    that the number of iterations was exceeded.
*)
OK = 0;
n = 3;
For[i = 1,i <= n,i++,
   TEMP[i] = Input["This is the Continuation Method for Nonlinear Systems.\n
    If n is not 3 the program must be altered.\n
    Input the function F["<>ToString[i]<>"] in terms of x1,x2,x3\n"];
   F[i][x1_,x2_,x3_] := Evaluate[TEMP[i]];
];
For[i = 1,i <= n,i++,
   DER = D[TEMP[i],x1];
   P[i,1][x1_,x2_,x3_] := Evaluate[DER];
   DER = D[TEMP[i],x2];
   P[i,2][x1_,x2_,x3_] := Evaluate[DER];
   DER = D[TEMP[i],x3];
   P[i,3][x1_,x2_,x3_] := Evaluate[DER];
];
OK = 0;
While[OK == 0,
   N1 = Input["Input number of RK4 iterations\n
     no decimal points\n"];
   If[N1 <= 0,
     Input["Must be a positive integer.\n
     Enter 1 [enter] to continue\n"],
     OK = 1;
   ];
];
For[i = 1, i <= n, i++,
   X[i-1] = Input["Input the initial approximation X("<>ToString[i]<>")\n"];
];
If[OK == 1,
   FLAG = Input["Select output destination\n
      1. Screen\n
      2. Text file\n
    Enter 1 or 2\n"];
   If[FLAG == 2,
      NAME = InputString["Input the file name\n
         For example:   output.dta\n"];
      OUP = OpenWrite[NAME,FormatType->OutputForm],
      OUP = "stdout";
   ];
   Write[OUP,"CONTINUATION METHOD FOR NONLINEAR SYSTEMS\n"];
   (* Step 1 *)
   H=N[1.0/N1];
   RMM[1]=0.5;
   RMM[2]=0.5;
   RMM[3]=1.0;
   RMM[4]=0.0;
   For[i = 1, i<=n, i++,
      X1[i-1] = N[X[i-1]];
   ];
   For[i = 1, i<=n, i++,
      B[i-1] = N[-F[i][X[0],X[1],X[2]]];
      B[i-1] = N[H*B[i-1]];
   ];
   K = 1;
   (* Step 2 *)
   While[OK == 1 && K <= N1,
      (* Steps  3 - 6 *)
      KK = 1;
      For[i = 1, i <= n, i++,
         X[i-1] = N[X1[i-1]];
      ];
      While[OK == 1 && KK <= 4,
         For[i = 1, i <= n, i++,
            For[J = 1, J <= n, J++,
               A[i-1,J-1] = N[P[i,J][X[0],X[1],X[2]]];
            ];
            A[i-1,n] = N[B[i-1]];
         ];
      (* Solve a linear system A K(KK) = b *)
         q = n-1;
         OK = 1;
         i = 1;
         While[OK == 1 && i <= q,
            Z = Abs[A[i-1,i-1]];
            IR = i;
            IA = i+1;
            For[J = IA, J <= n, J++,
               If[Abs[A[J-1,i-1]] > Z,
                  IR = J;
                  Z = Abs[A[J-1,i-1]];
               ];
            ];
            If[Z <= 10^-20,
               OK = 0,
               If[IR != i,
                  For[J = i, J <= n+1, J++,
                     c = A[i-1,J-1];
                     A[i-1,J-1] = A[IR-1,J-1];
                     A[IR-1,J-1] = c;
                  ];
               ];
               For[J = IA, J <= n, J++,
                  c = N[A[J-1,i-1]/A[i-1,i-1]];
                  If[Abs[c] <= 10^-20,
                     c = 0;
                  ];
                  For[L = i, L <= n+1, L++,
                     A[J-1,L-1] = N[A[J-1,L-1]-c*A[i-1,L-1]];
                  ];
               ];
            ];
            i = i+1;
         ];
         If[OK == 1,
            If[Abs[A[n-1,n-1]] <= 10^-20,
               OK = 0,
               Y[n-1] = N[A[n-1,n]/A[n-1,n-1]];
               For[i = 1, i <= q, i++,
                  J = n-i;
                  JA = J+1;
                  c = A[J-1,n];
                  For[L = JA, L <= n, L++,
                     c = N[c-A[J-1,L-1]*Y[L-1]];
                  ];
                  Y[J-1] = N[c/A[J-1,J-1]];
               ];
            ];
         ];
         If[OK == 0,
            Print["Linear system is singular\n"];
         ];
         If[OK == 1,
            For[i = 1, i <= n, i++,
               RK1[KK,i-1] = N[Y[i-1]];
               X[i-1] = N[X1[i-1]+RMM[KK]*RK1[KK,i-1]];
            ];
	 ];
         KK = KK + 1;
      ];
      (* Step 7 *)
      If[OK == 1,
         For[i = 1, i <= n, i++,
   X1[i-1]=N[X1[i-1]+(RK1[1,i-1]+2*RK1[2,i-1]+2*RK1[3,i-1]+RK1[4,i-1])/6];
         ];
         Write[OUP,K];
         For[i = 1, i <= n, i++,
            Write[OUP,N[X1[i-1],10]];
         ];
         Write[OUP,"\n"];
         K = K + 1;
      ];
   ];
   If[OUP == "OutputStream[",NAME," 3]",
      Print["Output file: ",NAME," created successfully\n"];
      Close[OUP]
   ];
];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -