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

📄 alg116.c

📁 c语言版的 数值计算方法
💻 C
📖 第 1 页 / 共 2 页
字号:
      printf("Input the derivative of f at 0 and at 1\n");
      scanf("%lf %lf", FPL, FPR);
      printf("Input the derivative of p at 0 and at 1\n");
      scanf("%lf %lf", PPL, PPR);
      printf("Input the derivative of q at 0 and at 1\n");
      scanf("%lf %lf", QPL, QPR);
   }
   else printf("The program will end so that P, Q, F can be created.\n");
}

void OUTPUT(FILE **OUP)
{
   char NAME[30];
   int FLAG; 

   printf("Choice of output method:\n");
   printf("1. Output to screen\n");
   printf("2. Output to text File\n");
   printf("Please enter 1 or 2.\n");
   scanf("%d", &FLAG);
   if (FLAG == 2) {
      printf("Input the file name in the form - drive:name.ext\n");
      printf("for example   A:OUTPUT.DTA\n");
      scanf("%s", NAME);
      *OUP = fopen(NAME, "w");
   }
   else *OUP = stdout;
   fprintf(*OUP, "CUBIC SPLINE RAYLEIGH-RITZ METHOD\n\n");
}   

int MINO(int I, int J)
{
   if (J < I) return J;
   else return I;
}

int MAXO(int I, int J) 
{
   if (J > I) return J;
   else return I;
}

int INTE(int J, int JJ)
{
   int inte;
   
   inte = JJ - J + 3;
   return inte;
}

void DPHICO(int I, int J, double *A, double *B, double *C, double H, int N)
{
   double EE,E, AA, BB, CC;
   int OK;

   *A = 0.0;
   *B = 0.0;
   *C = 0.0;
   E = I - 1.0;
   OK = true;
   if ( (J < I-2) || (J >= I+2) ) OK = false;
   if ( (I == 1) && (J < I) ) OK = false;
   if ( (I == 2) && (J < I-1) ) OK = false;
   if ( (I == N+1) && (J > N+1) ) OK = false;
   if ( (I == N+2) && (J >= N+2) ) OK = false;
   if (OK) {
      if (J <= I-2) {
         *A = ((E-4.0)*E+4.0)/(8.0*H);
         *B = (-E+2.0)/(4.0*H*H);
         *C = 1.0/(8.0*H*H*H);
         OK = false;
      }
      else {
         if (J > I) {
            *A = ((-E-4.0)*E-4.0)/(8.0*H);
            *B = (E+2.0)/(4.0*H*H);
            *C = -1.0/(8.0*H*H*H);
            OK = false;
         }  
         else {
            if (J > I-1) {
               *A = (3.0*E+4.0)*E/(8.0*H);
               *B = (-3.0*E-2.0)/(4.0*H*H);
               *C = 3.0/(8.0*H*H*H);
               if ( (I != 1) && (I != N+1) ) OK = false;
            }  
            else {
               *A = (-3.0*E+4.0)*E/(8.0*H);
               *B = (3.0*E-2.0)/(4.0*H*H);
               *C = -3.0/(8.0*H*H*H);
               if ( (I != 2) && (I != N+2) ) OK = false;
            }  
         }  
      }  
   }  
   if (OK) {
      if ( I <= 2 ) {
         AA = -1.0/(8.0*H);
         BB = 1.0/(4.0*H*H);
         CC = -1.0/(8.0*H*H*H);
         if ( I == 2 ) {
            *A = *A - AA;
            *B = *B - BB;
            *C = *C - CC;
         }  
         else {
            *A = *A - 4.0*AA;
            *B = *B - 4.0*BB;
            *C = *C - 4.0*CC;
         }  
      }  
      else {
         EE = N+2.0;
         AA = ((EE-4.0)*EE+4.0)/(8.0*H);
         BB = (-EE+2.0)/(4.0*H*H);
         CC = 1.0/(8.0*H*H*H);
         if ( I == N+1 ) {
            *A = *A - AA;
            *B = *B - BB;
            *C = *C - CC;
         }  
         else {
            *A = *A - 4.0*AA;
            *B = *B - 4.0*BB;
            *C = *C - 4.0*CC;
         }  
      }  
   }  
}

void PHICO(int I, int J, double *A, double *B, double *C, double *D, double H, int N)
{
   double EE,E, AA, BB, CC,DD;
   int OK;

   *A = 0.0;
   *B = 0.0;
   *C = 0.0;
   *D = 0.0;
   E = I - 1.0;
   OK = true;
   if ( (J < I-2) || (J >= I+2) ) OK = false;
   if ( (I == 1) && (J < I) ) OK = false;
   if ( (I == 2) && (J < I-1) ) OK = false;
   if ( (I == N+1) && (J > N+1) ) OK = false;
   if ( (I == N+2) && (J >= N+2) ) OK = false;
   if (OK) {
      if (J <= I-2) {
         *A = (((-E+6.0)*E-12.0)*E+8.0)/24.0;
         *B = ((E-4.0)*E+4.0)/(8.0*H);
         *C = (-E+2.0)/(8.0*H*H);
         *D = 1.0/(24.0*H*H*H);
         OK = false;
      }  
      else {
         if (J > I) {
            *A = (((E+6.0)*E+12.0)*E+8.0)/24.0;
            *B = ((-E-4.0)*E-4.0)/(8.0*H);
            *C = (E+2.0)/(8.0*H*H);
            *D = -1.0/(24.0*H*H*H);
            OK = false;
         }  
         else {
            if (J > I-1) {
               *A = ((-3.0*E-6.0)*E*E+4.0)/24.0;
               *B = (3.0*E+4.0)*E/(8.0*H);
               *C = (-3.0*E-2.0)/(8.0*H*H);
               *D = 1.0/(8.0*H*H*H);
               if ( (I != 1) && (I != N+1) ) OK = false;
            }  
            else {
               *A = ((3.0*E-6.0)*E*E+4.0)/24.0;
               *B = (-3.0*E+4.0)*E/(8.0*H);
               *C = (3.0*E-2.0)/(8.0*H*H);
               *D = -1.0/(8.0*H*H*H);
               if (( I != 2) && (I != N+2)) OK = false;
            }  
         }  
      }  
   }
   if (OK) {
      if ( I <= 2 ) {
         AA = 1.0/24.0;
         BB = -1.0/(8.0*H);
         CC = 1.0/(8.0*H*H);
         DD = -1.0/(24.0*H*H*H);
         if ( I == 2 ) {
            *A = *A - AA;
            *B = *B - BB;
            *C = *C - CC;
            *D = *D - DD;
         }  
         else { 
            *A = *A - 4.0*AA;
            *B = *B - 4.0*BB;
            *C = *C - 4.0*CC;
            *D = *D - 4.0*DD;
         }  
      }  
      else {
         EE = N+2.0;
         AA = (((-EE+6.0)*EE-12.0)*EE+8.0)/24.0;
         BB = ((EE-4.0)*EE+4.0)/(8.0*H);
         CC = (-EE+2.0)/(8.0*H*H);
         DD = 1.0/(24.0*H*H*H);
         if ( I == N+1 ) {
            *A = *A - AA;
            *B = *B - BB;
            *C = *C - CC;
            *D = *D - DD;
         }  
         else {
            *A = *A - 4.0*AA;
            *B = *B - 4.0*BB;
            *C = *C - 4.0*CC;
            *D = *D - 4.0*DD;
         }  
      }  
   }  
}

double XINT(double XU, double XL, double A1, double B1, double C1, double D1, double A2, double B2, double C2, double D2, double A3, double B3, double C3, double D3)
{
   double C[20];
   double AA,BB,CC,DD,EE,FF,GG,XHIGH,XLOW,xint;
   int I;
  
   AA = A1*A2;
   BB = A1*B2+A2*B1;
   CC = A1*C2+B1*B2+C1*A2;
   DD = A1*D2+B1*C2+C1*B2+D1*A2;
   EE = B1*D2+C1*C2+D1*B2;
   FF = C1*D2+D1*C2;
   GG = D1*D2;
   C[9] = AA*A3;
   C[8] = (AA*B3+BB*A3)/2.0;
   C[7] = (AA*C3+BB*B3+CC*A3)/3.0;
   C[6] = (AA*D3+BB*C3+CC*B3+DD*A3)/4.0;
   C[5] = (BB*D3+CC*C3+DD*B3+EE*A3)/5.0;
   C[4] = (CC*D3+DD*C3+EE*B3+FF*A3)/6.0;
   C[3] = (DD*D3+EE*C3+FF*B3+GG*A3)/7.0;
   C[2] = (EE*D3+FF*C3+GG*B3)/8.0;
   C[1] = (FF*D3+GG*C3)/9.0;
   C[0] = (GG*D3)/10.0;
   XHIGH = 0.0;
   XLOW = 0.0;
   for (I=1; I<=10; I++) {
      XHIGH = (XHIGH + C[I-1])*XU;
      XLOW = (XLOW + C[I-1])*XL;
   }
   xint = XHIGH - XLOW;
   return xint;
}

void COEF(int L, int N, int M, double FPO, double FPN, double *A, double *B, double *C, double *D, double *X, double H)
{
   double AA[25], BB[25], CC[25], DD[25], XA[25], XL[25], XU[25], XZ[25];
   int I, J;

   for (I=1; I<=N; I++)
      switch (L) {
         case 1:
            AA[I-1] = F(X[I-1]);
            break;
         case 2:
            AA[I-1] = P(X[I-1]);
            break;
         case 3:
            AA[I-1] = Q(X[I-1]);
            break;
      }  
   XA[0] = 3.0*(AA[1]-AA[0])/H - 3.0*FPO;
   XA[N-1] = 3.0*FPN - 3.0*(AA[N-1]-AA[N-2])/H;
   XL[0] = 2.0*H;
   XU[0] = 0.5;
   XZ[0] = XA[0]/XL[0];
   for (I=2; I<=M; I++) {
      XA[I-1] = 3.0*(AA[I]-2.0*AA[I-1]+AA[I-2])/H;
      XL[I-1] = H*(4.0-XU[I-2]);
      XU[I-1] = H/XL[I-1];
      XZ[I-1] = (XA[I-1]-H*XZ[I-2])/XL[I-1];
   }  
   XL[N-1] = H*(2.0-XU[N-2]);
   XZ[N-1] = (XA[N-1]-H*XZ[N-2])/XL[N-1];
   CC[N-1] = XZ[N-1];
   for (I=1; I<=M; I++) {
      J = N-I;
      CC[J-1] = XZ[J-1]-XU[J-1]*CC[J];
      BB[J-1] = (AA[J]-AA[J-1])/H -H*(CC[J]+2.0*CC[J-1])/3.0;
      DD[J-1] = (CC[J]-CC[J-1])/(3.0*H);
   }  
   for (I=1; I<=M; I++) {
      A[I-1] = ((-DD[I-1]*X[I-1]+CC[I-1])*X[I-1]-BB[I-1])*X[I-1]+AA[I-1];
      B[I-1] = (3.0*DD[I-1]*X[I-1]-2.0*CC[I-1])*X[I-1]+BB[I-1];
      C[I-1] = CC[I-1]-3.0*DD[I-1]*X[I-1];
      D[I-1] = DD[I-1];
   }   
}

⌨️ 快捷键说明

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