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

📄 10gjfq.c

📁 常用数值算法程序集
💻 C
字号:

  #include "stdlib.h"
  #include "math.h"
  void gjfq(t,h,n,y,eps,k,z,f)
  void  (*f)();
  int n,k;
  double t,h,eps,y[],z[];
  { void rkt();
    int i,j;
    double a,qq,*d,*p,*u,*v,*w;
    d=malloc(n*sizeof(double));
    p=malloc(n*sizeof(double));
    u=malloc(n*sizeof(double));
    v=malloc(n*sizeof(double));
    w=malloc(n*sizeof(double));
    for (i=0; i<=n-1; i++) {p[i]=0.0; z[i*k]=y[i];}
    a=t;
    (*f)(t,y,n,d);
    for (j=0; j<=n-1; j++) u[j]=d[j];
    rkt(t,h,y,n,eps,f);
    t=a+h;
    (*f)(t,y,n,d);
    for (j=0; j<=n-1; j++)
      { z[j*k+1]=y[j]; v[j]=d[j];}
    for (j=0; j<=n-1; j++)
      { p[j]=-4.0*z[j*k+1]+5.0*z[j*k]+2.0*h*(2.0*v[j]+u[j]);
        y[j]=p[j];
      }
    t=a+2.0*h;
    (*f)(t,y,n,d);
    for (j=0; j<=n-1; j++)
      { qq=2.0*h*(d[j]-2.0*v[j]-2.0*u[j])/3.0;
        qq=qq+4.0*z[j*k+1]-3.0*z[j*k];
        z[j*k+2]=(p[j]+qq)/2.0;
        y[j]=z[j*k+2];
      }
    for (i=3; i<=k-1; i++)
      { t=a+(i-1)*h;
        (*f)(t,y,n,d);
        for (j=0; j<=n-1; j++)
          { u[j]=v[j]; v[j]=d[j];}
        for (j=0; j<=n-1; j++)
          { qq=-4.0*z[j*k+i-1]+5.0*z[j*k+i-2];
            p[j]=qq+2.0*h*(2.0*v[j]+u[j]);
            y[j]=p[j];
          }
        t=t+h;
        (*f)(t,y,n,d);
        for (j=0; j<=n-1; j++)
          { qq=2.0*h*(d[j]-2.0*v[j]-2.0*u[j])/3.0;
            qq=qq+4.0*z[j*k+i-1]-3.0*z[j*k+i-2];
            y[j]=(p[j]+qq)/2.0;
            z[j*k+i]=y[j];
          }
      }
    free(d); free(p); free(u); free(v); free(w);
    return;
  }


  static void rkt(t,h,y,n,eps,f)
  void  (*f)();
  int n;
  double t,h,eps,y[];
  { int m,i,j,k;
    double hh,p,dt,x,tt,q,a[4],*g,*b,*c,*d,*e;
    g=malloc(n*sizeof(double));
    b=malloc(n*sizeof(double));
    c=malloc(n*sizeof(double));
    d=malloc(n*sizeof(double));
    e=malloc(n*sizeof(double));
    hh=h; m=1; p=1.0+eps; x=t;
    for (i=0; i<=n-1; i++) c[i]=y[i];
    while (p>=eps)
      { a[0]=hh/2.0; a[1]=a[0]; a[2]=hh; a[3]=hh;
        for (i=0; i<=n-1; i++)
          { g[i]=y[i]; y[i]=c[i];}
        dt=h/m; t=x;
        for (j=0; j<=m-1; j++)
          { (*f)(t,y,n,d);
            for (i=0; i<=n-1; i++) 
              { b[i]=y[i]; e[i]=y[i];}
            for (k=0; k<=2; k++)
              { for (i=0; i<=n-1; i++)
                  { y[i]=e[i]+a[k]*d[i];
                    b[i]=b[i]+a[k+1]*d[i]/3.0;
                  }
                tt=t+a[k];
                (*f)(tt,y,n,d);
              }
            for (i=0; i<=n-1; i++)
              y[i]=b[i]+hh*d[i]/6.0;
            t=t+dt;
          }
        p=0.0;
        for (i=0; i<=n-1; i++)
          { q=fabs(y[i]-g[i]);
            if (q>p) p=q;
          }
        hh=hh/2.0; m=m+m;
      }
    free(g); free(b); free(c); free(d); free(e);
    return;
  }

⌨️ 快捷键说明

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