func8p2-key.cpp
上传用户:zhdd911129
上传日期:2007-05-11
资源大小:722k
文件大小:5k
源码类别:

matlab例程

开发平台:

Matlab

  1. /*
  2. *   LINEAR FINITE-DIFFERENCE ALGORITHM 11.3
  3. *
  4. *   To approximate the solution of the boundary-value problem
  5. *
  6. *      Y'' = P(X)Y' + Q(X)Y + R(X), A<=X<=B, Y(A) = ALPHA, Y(B) = BETA:
  7. *
  8. *   INPUT:   Endpoints A, B; boundary conditions ALPHA, BETA;
  9. *            integer N.
  10. *
  11. *   OUTPUT:  Approximations W(I) to Y(X(I)) for each I=0,1,...,N+1.
  12. */
  13. #include<stdio.h>
  14. #include<math.h>
  15. #define true 1
  16. #define false 0
  17. main()
  18. {
  19.    double A[24], B[24], C[24], D[24], L[24], U[24], Z[24], W[24];
  20.    double AA,BB,ALPHA,BETA,X,H;
  21.    int N,I,M,J,OK;
  22.    FILE *OUP[1];
  23.    double F(double, double);
  24.    void INPUT(int *, double *, double *, double *, double *, int *);
  25.    void OUTPUT(FILE **);
  26.    double P(double);
  27.    double Q(double);
  28.    double R(double);
  29.    INPUT(&OK, &AA, &BB, &ALPHA, &BETA, &N);
  30.    if (OK) {
  31.       OUTPUT(OUP);
  32.       /* STEP 1 */
  33.       H = ( BB - AA ) / ( N + 1.0 );
  34.       X = AA + H;
  35.       A[0] = 2.0 + H * H * Q( X );
  36.       B[0] = -1.0 + 0.5 * H * P( X );
  37.       D[0] = -H*H*R(X)+(1.0+0.5*H*P(X))*ALPHA;
  38.       M = N - 1;
  39.       /* STEP 2 */
  40.       for (I=2; I<=M; I++) {
  41.          X = AA + I * H;
  42.          A[I-1] = 2.0 + H * H * Q( X );
  43.          B[I-1] = -1.0 + 0.5 * H * P( X );
  44.          C[I-1] = -1.0 - 0.5 * H * P( X );
  45.          D[I-1] = -H * H * R( X );
  46.       }  
  47.       /* STEP 3 */
  48.       X = BB - H;
  49.       A[N-1] = 2.0 + H * H * Q( X );
  50.       C[N-1] = -1.0 - 0.5 * H * P( X );
  51.       D[N-1] = -H*H*R(X)+(1.0-0.5*H*P(X))*BETA;
  52.       /* STEP 4 */
  53.       /* STEPS 4 through 8 solve a triagiagonal linear system using
  54.          Algorithm 6.7 */
  55.       L[0] = A[0];
  56.       U[0] = B[0] / A[0];
  57.       Z[0] = D[0] / L[0];
  58.       /* STEP 5 */
  59.       for (I=2; I<=M; I++) {
  60.          L[I-1] = A[I-1] - C[I-1] * U[I-2];
  61.          U[I-1] = B[I-1] / L[I-1];
  62.          Z[I-1] = (D[I-1]-C[I-1]*Z[I-2])/L[I-1];
  63.       }
  64.       /* STEP 6 */
  65.       L[N-1] = A[N-1] - C[N-1] * U[N-2];
  66.       Z[N-1] = (D[N-1]-C[N-1]*Z[N-2])/L[N-1];
  67.       /* STEP 7 */
  68.       W[N-1] = Z[N-1];
  69.       /* STEP 8 */
  70.       for (J=1; J<=M; J++) {
  71.          I = N - J;
  72.          W[I-1] = Z[I-1] - U[I-1] * W[I];
  73.       }
  74.       I = 0;
  75.       /* STEP 9 */
  76.       fprintf(*OUP, "%3d %13.8f %13.8fn", I, AA, ALPHA);
  77.       for (I=1; I<=N; I++) {
  78.          X = AA + I * H;
  79.          fprintf(*OUP, "%3d %13.8f %13.8fn", I, X, W[I-1]);
  80.       }  
  81.       I = N + 1;
  82.       fprintf(*OUP, "%3d %13.8f %13.8fn", I, BB, BETA);
  83.       /* STEP 12 */
  84.       fclose(*OUP);
  85.    }
  86.    return 0;
  87. }
  88. /* Change functions P, Q and R for a new problem */
  89. double P(double X)
  90. {
  91.    double p; 
  92.    p = -2/X;
  93.    return p;
  94. }
  95. double Q(double X)
  96. {
  97.    double q; 
  98.    q = 2/(X*X);
  99.    return q;
  100. }
  101. double R(double X)
  102. {
  103.    double r; 
  104.    r = sin(log(X))/(X*X);
  105.    return r;
  106. }
  107. void INPUT(int *OK, double *AA, double *BB, double *ALPHA, double *BETA, int *N)
  108. {
  109.    double X; 
  110.    char AB;
  111.    printf("This is the Linear Finite-Difference Method.n");
  112.    *OK = true;
  113.    printf("Have the functions P, Q, and R been created immediatelyn");
  114.    printf("preceding the INPUT procedure?n");
  115.    printf("Answer Y or N.n");
  116.    scanf("%c",&AB);
  117.    *OK = false;
  118.    if ((AB == 'Y') || (AB == 'y')) {
  119.       *OK = false;
  120.       while (!(*OK)) {
  121.          printf("Input left and right endpoints separated by blank.n");
  122.          scanf("%lf %lf", AA, BB);
  123.          if (*AA >= *BB) 
  124.             printf("Left endpoint must be less than right endpoint.n");
  125.          else *OK = true;
  126.       }
  127.       printf("Input Y(  %.10e).n", *AA);
  128.       scanf("%lf", ALPHA);
  129.       printf("Input Y(  %.10e).n", *BB);
  130.       scanf("%lf", BETA);
  131.       *OK = false;
  132.       while(!(*OK)) {
  133.          printf("Input an integer > 1 for the number ofn");
  134.          printf("subintervals.  Note that h = (b-a)/(n+1)n");
  135.          scanf("%d", N);
  136.          if (*N <= 1) printf("Number must exceed 1.n");
  137.          else *OK = true;
  138.       }
  139.    }
  140.    else printf("The program will end so that P, Q, R can be created.n");
  141. }
  142. void OUTPUT(FILE **OUP)
  143. {
  144.    char NAME[30];
  145.    int FLAG; 
  146.    printf("Choice of output method:n");
  147.    printf("1. Output to screenn");
  148.    printf("2. Output to text Filen");
  149.    printf("Please enter 1 or 2.n");
  150.    scanf("%d", &FLAG);
  151.    if (FLAG == 2) {
  152.       printf("Input the file name in the form - drive:name.extn");
  153.       printf("for example   A:OUTPUT.DTAn");
  154.       scanf("%s", NAME);
  155.       *OUP = fopen(NAME, "w");
  156.    }
  157.    else *OUP = stdout;
  158.    fprintf(*OUP, "LINEAR FINITE DIFFERENCE METHODnn");
  159.    fprintf(*OUP, "  I          X(I)          W(I)n");
  160. }