Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<math.h>
- //#define eps 10e-11
- #define PI 3.14159265358970323846
- #define b21 1.0/5.0
- #define b31 3.0/40.0
- #define b32 9.0/40.0
- #define b41 44.0/45.0
- #define b42 -56.0/15.0
- #define b43 32.0/9.0
- #define b51 19372.0/6561.0
- #define b52 -25360.0/2187.
- #define b53 64448.0/6561.0
- #define b54 -212.0/729.0
- #define b61 9017.0/3168.0
- #define b62 -355.0/33.0
- #define b63 46732.0/5247.0
- #define b64 49.0/176.0
- #define b65 -5103.0/18656.0
- #define b71 35.0/384.0
- #define b72 0.
- #define b73 500.0/1113.0
- #define b74 125.0/192.0
- #define b75 -2187.0/6784.0
- #define b76 11.0/84.0
- #define c1 35.0/384.0
- #define c2 0.
- #define c3 500.0/1113.0
- #define c4 125.0/192.0
- #define c5 -2187.0/6784.0
- #define c6 11.0/84.0
- #define c7 0.
- #define d1 5179.0/57600.0
- #define d2 0.
- #define d3 7571.0/16695.0
- #define d4 393.0/640.0
- #define d5 -92097.0/339200.0
- #define d6 187.0/2100.0
- #define d7 1.0/40.0
- // Функции (5 штук)
- double fx(double x,double y,double z, double u){
- return y;
- }
- double fy(double x,double y,double z,double u,double alpha){ //дано начальное знаечние
- return u - x * exp( -alpha*x);
- }
- double fz(double x,double y,double z,double u,double alpha){ //дано начальное знаечние
- return -u*exp(-alpha*x) + alpha*u*x*exp(-alpha*x);
- }
- double fu(double x,double y,double z,double u){
- return z;
- }
- double fv(double x,double y,double z,double u){ // наша функция есть производная этого интеграла
- return u*u;
- }
- double Xnewvar(double h,double x,double kx1,double kx2,double kx3,double kx4,double kx5,double kx6,double kx7){
- return x+(c1*kx1+c2*kx2+c3*kx3+c4*kx4+c5*kx5+c6*kx6+c7*kx7);
- }
- double Ynewvar(double h,double y,double ky1,double ky2,double ky3,double ky4,double ky5,double ky6,double ky7){
- return y+(c1*ky1+c2*ky2+c3*ky3+c4*ky4+c5*ky5+c6*ky6+c7*ky7);
- }
- double Znewvar(double h,double z,double kz1,double kz2,double kz3,double kz4,double kz5,double kz6,double kz7){
- return z+(c1*kz1+c2*kz2+c3*kz3+c4*kz4+c5*kz5+c6*kz6+c7*kz7);
- }
- double Unewvar(double h,double u,double ku1,double ku2,double ku3,double ku4,double ku5,double ku6,double ku7){
- return u+(c1*ku1+c2*ku2+c3*ku3+c4*ku4+c5*ku5+c6*ku6+c7*ku7);
- }
- double Vnewvar(double h,double v,double kv1,double kv2,double kv3,double kv4,double kv5,double kv6,double kv7){
- return v+(c1*kv1+c2*kv2+c3*kv3+c4*kv4+c5*kv5+c6*kv6+c7*kv7);
- }
- double Xnewvartilde(double h,double x,double kx1,double kx2,double kx3,double kx4,double kx5,double kx6,double kx7){
- return x+(d1*kx1+d2*kx2+d3*kx3+d4*kx4+d5*kx5+d6*kx6+d7*kx7);
- }
- double Ynewvartilde(double h,double y,double ky1,double ky2,double ky3,double ky4,double ky5,double ky6,double ky7){
- return y+(d1*ky1+d2*ky2+d3*ky3+d4*ky4+d5*ky5+d6*ky6+d7*ky7);
- }
- double Znewvartilde(double h,double z,double kz1,double kz2,double kz3,double kz4,double kz5,double kz6,double kz7){
- return z+(d1*kz1+d2*kz2+d3*kz3+d4*kz4+d5*kz5+d6*kz6+d7*kz7);
- }
- double Unewvartilde(double h,double u,double ku1,double ku2,double ku3,double ku4,double ku5,double ku6,double ku7){
- return u+(d1*ku1+d2*ku2+d3*ku3+d4*ku4+d5*ku5+d6*ku6+d7*ku7);
- }
- double Vnewvartilde(double h,double v,double kv1,double kv2,double kv3,double kv4,double kv5,double kv6,double kv7){
- return v+(d1*kv1+d2*kv2+d3*kv3+d4*kv4+d5*kv5+d6*kv6+d7*kv7);
- }
- double delta(double x,double y,double z,double u, double v,double x1,double y1,double z1,double u1, double v1){
- return sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)+(z-z1)*(z-z1)+(u-u1)*(u-u1)+(v-v1)*(v-v1));
- }
- // Максимальное, минимальное, норма,
- double max(double a,double b){
- if (a>b) return a;
- else return b;
- }
- double min(double a,double b){
- if (a<b) return a;
- else return b;
- }
- double mod(double a,double b){
- return sqrt(a*a+b*b);
- }
- // [на самом деле это Рунге Кутта 5 порядка]
- double err(double *t,double *x,double *y,double *z,double *u, double *v,
- double *h,double facmax, FILE*out,
- double eps,double T,double *k,double *dx,double *dy, double alpha)
- {
- // facmax - хрень для выбора шага
- double tol=eps;
- double p = 1.0/8.0;
- double kx1,kx2,kx3,kx4,kx5,kx6,kx7;
- double ky1,ky2,ky3,ky4,ky5,ky6,ky7;
- double kz1,kz2,kz3,kz4,kz5,kz6,kz7;
- double ku1,ku2,ku3,ku4,ku5,ku6,ku7;
- double kv1,kv2,kv3,kv4,kv5,kv6,kv7;
- double x1,y1,z1,u1,v1;
- double xx,yy,zz,uu,vv;
- double d,hnew;
- double ddx, ddy;
- //fprintf(out,"X%g %g %g %g\n",*x,*y,*z,*u);
- kx1=*h*fx(*x,*y,*z,*u);
- ky1=*h*fy(*x,*y,*z,*u, alpha);
- kz1=*h*fz(*x,*y,*z,*u, alpha);
- ku1=*h*fu(*x,*y,*z,*u);
- kv1=*h*fv(*x,*y,*z,*u);
- kx2=*h*fx(*x+b21*kx1,*y+b21*ky1,*z+b21*kz1,*u+b21*ku1);
- ky2=*h*fy(*x+b21*kx1,*y+b21*ky1,*z+b21*kz1,*u+b21*ku1, alpha);
- kz2=*h*fz(*x+b21*kx1,*y+b21*ky1,*z+b21*kz1,*u+b21*ku1, alpha);
- ku2=*h*fu(*x+b21*kx1,*y+b21*ky1,*z+b21*kz1,*u+b21*ku1);
- kv2=*h*fv(*x+b21*kx1,*y+b21*ky1,*z+b21*kz1,*u+b21*ku1);
- kx3=*h*fx(*x+b31*kx1+b32*kx2,*y+b31*ky1+b32*ky2,*z+b31*kz1+b32*kz2,*u+b31*ku1+b32*ku2);
- ky3=*h*fy(*x+b31*kx1+b32*kx2,*y+b31*ky1+b32*ky2,*z+b31*kz1+b32*kz2,*u+b31*ku1+b32*ku2, alpha);
- kz3=*h*fz(*x+b31*kx1+b32*kx2,*y+b31*ky1+b32*ky2,*z+b31*kz1+b32*kz2,*u+b31*ku1+b32*ku2, alpha);
- ku3=*h*fu(*x+b31*kx1+b32*kx2,*y+b31*ky1+b32*ky2,*z+b31*kz1+b32*kz2,*u+b31*ku1+b32*ku2);
- kv3=*h*fv(*x+b31*kx1+b32*kx2,*y+b31*ky1+b32*ky2,*z+b31*kz1+b32*kz2,*u+b31*ku1+b32*ku2);
- kx4=*h*fx(*x+b41*kx1+b42*kx2+b43*kx3,
- *y+b41*ky1+b42*ky2+b43*ky3,
- *z+b41*kz1+b42*kz2+b43*kz3,
- *u+b41*ku1+b42*ku2+b43*ku3);
- ky4=*h*fy(*x+b41*kx1+b42*kx2+b43*kx3,
- *y+b41*ky1+b42*ky2+b43*ky3,
- *z+b41*kz1+b42*kz2+b43*kz3,
- *u+b41*ku1+b42*ku2+b43*ku3, alpha);
- kz4=*h*fz(*x+b41*kx1+b42*kx2+b43*kx3,
- *y+b41*ky1+b42*ky2+b43*ky3,
- *z+b41*kz1+b42*kz2+b43*kz3,
- *u+b41*ku1+b42*ku2+b43*ku3, alpha);
- ku4=*h*fu(*x+b41*kx1+b42*kx2+b43*kx3,
- *y+b41*ky1+b42*ky2+b43*ky3,
- *z+b41*kz1+b42*kz2+b43*kz3,
- *u+b41*ku1+b42*ku2+b43*ku3);
- kv4=*h*fv(*x+b41*kx1+b42*kx2+b43*kx3,
- *y+b41*ky1+b42*ky2+b43*ky3,
- *z+b41*kz1+b42*kz2+b43*kz3,
- *u+b41*ku1+b42*ku2+b43*ku3);
- kx5=*h*fx(*x+b51*kx1+b52*kx2+b53*kx3+b54*kx4,
- *y+b51*ky1+b52*ky2+b53*ky3+b54*ky4,
- *z+b51*kz1+b52*kz2+b53*kz3+b54*kz4,
- *u+b51*ku1+b52*ku2+b53*ku3+b54*ku4);
- ky5=*h*fy(*x+b51*kx1+b52*kx2+b53*kx3+b54*kx4,
- *y+b51*ky1+b52*ky2+b53*ky3+b54*ky4,
- *z+b51*kz1+b52*kz2+b53*kz3+b54*kz4,
- *u+b51*ku1+b52*ku2+b53*ku3+b54*ku4, alpha);
- kz5=*h*fz(*x+b51*kx1+b52*kx2+b53*kx3+b54*kx4,
- *y+b51*ky1+b52*ky2+b53*ky3+b54*ky4,
- *z+b51*kz1+b52*kz2+b53*kz3+b54*kz4,
- *u+b51*ku1+b52*ku2+b53*ku3+b54*ku4, alpha);
- ku5=*h*fu(*x+b51*kx1+b52*kx2+b53*kx3+b54*kx4,
- *y+b51*ky1+b52*ky2+b53*ky3+b54*ky4,
- *z+b51*kz1+b52*kz2+b53*kz3+b54*kz4,
- *u+b51*ku1+b52*ku2+b53*ku3+b54*ku4);
- kv5=*h*fv(*x+b51*kx1+b52*kx2+b53*kx3+b54*kx4,
- *y+b51*ky1+b52*ky2+b53*ky3+b54*ky4,
- *z+b51*kz1+b52*kz2+b53*kz3+b54*kz4,
- *u+b51*ku1+b52*ku2+b53*ku3+b54*ku4);
- kx6=*h*fx(*x+b61*kx1+b62*kx2+b63*kx3+b64*kx4+b65*kx5,
- *y+b61*ky1+b62*ky2+b63*ky3+b64*ky4+b65*ky5,
- *z+b61*kz1+b62*kz2+b63*kz3+b64*kz4+b65*kz5,
- *u+b61*ku1+b62*ku2+b63*ku3+b64*ku4+b65*ku5);
- ky6=*h*fy(*x+b61*kx1+b62*kx2+b63*kx3+b64*kx4+b65*kx5,
- *y+b61*ky1+b62*ky2+b63*ky3+b64*ky4+b65*ky5,
- *z+b61*kz1+b62*kz2+b63*kz3+b64*kz4+b65*kz5,
- *u+b61*ku1+b62*ku2+b63*ku3+b64*ku4+b65*ku5, alpha);
- kz6=*h*fz(*x+b61*kx1+b62*kx2+b63*kx3+b64*kx4+b65*kx5,
- *y+b61*ky1+b62*ky2+b63*ky3+b64*ky4+b65*ky5,
- *z+b61*kz1+b62*kz2+b63*kz3+b64*kz4+b65*kz5,
- *u+b61*ku1+b62*ku2+b63*ku3+b64*ku4+b65*ku5, alpha);
- ku6=*h*fu(*x+b61*kx1+b62*kx2+b63*kx3+b64*kx4+b65*kx5,
- *y+b61*ky1+b62*ky2+b63*ky3+b64*ky4+b65*ky5,
- *z+b61*kz1+b62*kz2+b63*kz3+b64*kz4+b65*kz5,
- *u+b61*ku1+b62*ku2+b63*ku3+b64*ku4+b65*ku5);
- kv6=*h*fv(*x+b61*kx1+b62*kx2+b63*kx3+b64*kx4+b65*kx5,
- *y+b61*ky1+b62*ky2+b63*ky3+b64*ky4+b65*ky5,
- *z+b61*kz1+b62*kz2+b63*kz3+b64*kz4+b65*kz5,
- *u+b61*ku1+b62*ku2+b63*ku3+b64*ku4+b65*ku5);
- kx7=*h*fx(*x+b71*kx1+b72*kx2+b73*kx3+b74*kx4+b75*kx5+b76*kx6,
- *y+b71*ky1+b72*ky2+b73*ky3+b74*ky4+b75*ky5+b76*ky6,
- *z+b71*kz1+b72*kz2+b73*kz3+b74*kz4+b75*kz5+b76*kz6,
- *u+b71*ku1+b72*ku2+b73*ku3+b74*ku4+b75*ku5+b76*ku6);
- ky7=*h*fy(*x+b71*kx1+b72*kx2+b73*kx3+b74*kx4+b75*kx5+b76*kx6,
- *y+b71*ky1+b72*ky2+b73*ky3+b74*ky4+b75*ky5+b76*ky6,
- *z+b71*kz1+b72*kz2+b73*kz3+b74*kz4+b75*kz5+b76*kz6,
- *u+b71*ku1+b72*ku2+b73*ku3+b74*ku4+b75*ku5+b76*ku6, alpha);
- kz7=*h*fz(*x+b71*kx1+b72*kx2+b73*kx3+b74*kx4+b75*kx5+b76*kx6,
- *y+b71*ky1+b72*ky2+b73*ky3+b74*ky4+b75*ky5+b76*ky6,
- *z+b71*kz1+b72*kz2+b73*kz3+b74*kz4+b75*kz5+b76*kz6,
- *u+b71*ku1+b72*ku2+b73*ku3+b74*ku4+b75*ku5+b76*ku6, alpha);
- ku7=*h*fu(*x+b71*kx1+b72*kx2+b73*kx3+b74*kx4+b75*kx5+b76*kx6,
- *y+b71*ky1+b72*ky2+b73*ky3+b74*ky4+b75*ky5+b76*ky6,
- *z+b71*kz1+b72*kz2+b73*kz3+b74*kz4+b75*kz5+b76*kz6,
- *u+b71*ku1+b72*ku2+b73*ku3+b74*ku4+b75*ku5+b76*ku6);
- kv7=*h*fv(*x+b71*kx1+b72*kx2+b73*kx3+b74*kx4+b75*kx5+b76*kx6,
- *y+b71*ky1+b72*ky2+b73*ky3+b74*ky4+b75*ky5+b76*ky6,
- *z+b71*kz1+b72*kz2+b73*kz3+b74*kz4+b75*kz5+b76*kz6,
- *u+b71*ku1+b72*ku2+b73*ku3+b74*ku4+b75*ku5+b76*ku6);
- xx=Xnewvar(*h,*x,kx1,kx2,kx3,kx4,kx5,kx6,kx7);
- yy=Ynewvar(*h,*y,ky1,ky2,ky3,ky4,ky5,ky6,ky7);
- zz=Znewvar(*h,*z,kz1,kz2,kz3,kz4,kz5,kz6,kz7);
- uu=Unewvar(*h,*u,ku1,ku2,ku3,ku4,ku5,ku6,ku7);
- vv=Vnewvar(*h,*v,kv1,kv2,kv3,kv4,kv5,kv6,kv7);
- x1=Xnewvartilde(*h,*x,kx1,kx2,kx3,kx4,kx5,kx6,kx7);
- y1=Ynewvartilde(*h,*y,ky1,ky2,ky3,ky4,ky5,ky6,ky7);
- z1=Znewvartilde(*h,*z,kz1,kz2,kz3,kz4,kz5,kz6,kz7);
- u1=Unewvartilde(*h,*u,ku1,ku2,ku3,ku4,ku5,ku6,ku7);
- v1=Vnewvartilde(*h,*v,kv1,kv2,kv3,kv4,kv5,kv6,kv7);
- d = delta(xx,yy,zz,uu,vv,x1,y1,z1,u1,v1);
- hnew=(*h)*min(facmax,max(0.3,pow(tol/d,p))); // ***MAGIC*** ???? YES! tol = epsilon | d - ошибка
- if (d < eps) {d = eps;}
- *t+=*h;
- *x=xx; *y=yy; *z=zz; *u=uu;
- //printf("ok2 t: %e x: %e y: %e z: %e u: %e\n",*t,kx1,ky1,kz1,ku1); fprintf(out,"t: %e x: %e y: %e z: %e u: %e\n",*t,*x,*y,*z,*u);
- //printf("X%g %g %g %g\n",*x,*y,*z,*u);
- if (hnew>10e-5) hnew=10e-5; // Шаг не больше чем 10e-5
- if (d > eps){return err(&*t,&*x,&*y,&*z,&*u,&*v,&*h,1.0,out,eps,T,&*k,&*dx,&*dy,alpha);} // вызывваем себя [facmax=1.0]
- else
- if ((*t+*h)>T) {*h=T-*t; return err(&*t,&*x,&*y,&*z,&*u,&*v,&*h,facmax,out,eps,T,&*k,&*dx,&*dy,alpha);}
- else
- if ((*t)==T){
- //printf("%f %f %f %f %f %f\n",*t,*x,*y,*z,*u,*v);
- //fprintf(out,"%f %f %f %f %f %f\n",*t,*x,*y,*z,*u,*v);
- ++*k;
- return d;
- //printf("%f %f %f %f %f\n",*h,*u,*y,*x,(*h)*((*u)*(*u)-(*y)*(*y)-(*x)*(*x)));
- //return (*h)*((*u)*(*u)-(*y)*(*y)-(*x)*(*x));
- }
- else{
- *h=hnew;
- //printf("%f %f %f %f %f %f\n",*t,*x,*y,*z,*u,*v);
- //fprintf(out,"%f %f %f %f %f %f\n",*t,*x,*y,*z,*u,*v);
- ddx=fabs(sin(*t)-*x); // не интерисует
- ddy=fabs(cos(*t)-*y); // не интерисует
- if (ddx>*dx) *dx=ddx; // не интерисует
- if (ddy>*dy) *dy=ddy; // не интерисует
- ++*k;
- return d;
- // printf("%f %f %f %f %f\n",*h,*u,*y,*x,(*h)*((*u)*(*u)-(*y)*(*y)-(*x)*(*x)));
- // return (*h)*((*u)*(*u)-(*y)*(*y)-(*x)*(*x));
- }
- }
- // [Рунге кутта]
- double runge(double x0,double u0,double *X,double *U, FILE*out)
- {
- double t=0;
- double h;
- double x,y,z,u,v;
- double eps;
- double facmax=2.0; // ?
- double er;
- double del;
- double T;
- double I=0;
- double alpha=25.0;
- double dx7,dx9,dx11;
- double dy7,dy9,dy11;
- double del7,del9,del11;
- double x7,y7,z7,u7,v7;
- double x9,y9,z9,u9,v9;
- double x11,y11,z11,u11,v11;
- double k,dx,dy;
- k=0; // Количесвто шагов в начале
- dx=0;
- dy=0;
- T=PI*0.5;// t конечное
- // У меня было заданы начальные условия x и y для z и u используется метод стрельбы
- eps=10e-15;
- h=eps;
- y=0; z=0; // Катины начальные условия
- x=x0; u=u0; // Катины неизвестные нач. условия
- v=0; //начальное значение интеграла?
- facmax=2.0; er=0; del=0; t=0; // обнулечние начальных
- double d=0; // то что возвращает err
- while (t<T){
- d = err(&t,&x,&y,&z,&u,&v,&h,facmax,out,eps,T,&k,&dx,&dy,alpha); // z и u - не знаем в начале, x и y - значем в начале
- fprintf(out,"%.20lf %lf\n",t,u);
- //I+=0.5*(u*u-y*y-x*x - (uprev*uprev - yprev*yprev - xprev*xprev))*(t-tprev);
- /*Tm=(t-tprev)*0.5;
- xm=xprev;
- ym=yprev;
- zm=zprev;
- um=uprev;
- tm=tprev;
- d=err(&tm,&xm,&ym,&zm,&um,&Tm,facmax,out,eps,T,&k,&dx,&dy);
- I+=0.5*(um*um - ym*ym - xm*xm)*(t-tprev);*/
- }
- //А в конце были заданы значения x и u
- *X=x;
- *U=u;
- //printf("INTEGRAL: %.20lf\n", v);
- return v;
- }
- // [Метод стрельбы]
- double sp(double *x0,double *u0,double *X,double *U, FILE*out) // x0 и u0 - не даны в начале
- {
- double gamma=1; // Начальная гамма
- double x1,u1;
- double eps=10e-12;
- double a,b,c,d;
- double X11,X12,X21,X22; // нужно для подсчета матрицы
- double X1,X2;
- double x,u;
- double xx,uu;
- double det;
- double XX=0.8; double UU=0; // известные конечные значения для x и u
- //X1=X(T) X2=u(T)-1
- fprintf(out,"00\n");
- runge(*x0,*u0,&x,&u,out);
- X1=x-XX; X2=u-UU; // Функции невязки
- xx=x-XX; uu=u-UU; // Функции невязки
- //fprintf(out,"eps + 0\n");
- runge(*x0+eps,*u0,&x,&u,out); // подсчет производной
- X11=x-XX; X21=u-UU;
- //fprintf(out,"0 + eps\n");
- runge(*x0,*u0+eps,&x,&u,out); // подсчет производной
- X12=x-XX; X22=u-UU;
- // элементы производной матрицы
- a=(X11-X1)/eps;
- b=(X12-X1)/eps;
- c=(X21-X2)/eps;
- d=(X22-X2)/eps;
- det=a*d-b*c; // опредилитель матрицы производной функции невязки
- //printf(out,"x0 %g %g\n",det,det);
- if (det < eps && det > -eps) det = eps;
- //fprintf(out,"x0 %g %g\n",det,det);
- double h1=(d*X1-b*X2)/det;
- double h2=-(X1*c-X2*a)/det;
- x1=*x0-gamma*h1;
- u1=*u0-gamma*h2;
- printf("H1 = %f, H2 = %f\n", h1,h2);
- while (mod(X1,X2) >= mod(xx,uu)){ //переходим к следующей гамме
- gamma*=0.5;
- if (gamma < eps) break;
- x1=*x0-gamma*h1;
- u1=*u0-gamma*h2;
- //fprintf(out,"chikl %f %f \n",x1,u1);
- x=0; u=0;
- runge(x1,u1,&x,&u,out);
- printf(" X1 = %g U1 = %g\n", x1,u1);
- X1=x-XX; X2=u-UU;
- }
- // теперь гамма хорошая
- *x0=x1; // нашли хорошие начальные условия
- *u0=u1; // нашли хорошие начальные условия
- //runge(*x0,*u0,&x,&u,out);
- X1=x-XX; X2=u-UU; // окончательная функция невязки?
- *X=X1+XX;
- *U=X2+UU;
- return 0;
- }
- void pristrel(FILE*out)
- {
- double x,u;
- double x0,u0;
- double d=0;
- double XX,UU; // в конце заданные x и u
- XX=0.8; UU=0; // их значения
- double v=0; //
- double eps=10e-8;
- //начальные параметры пристрелки
- //x0=-193.9873696474; u0=-1246.4150443086;//T=20;
- //x0=36.191649591711020; u0=78.592331658908350;//T=10;
- x0=0; u0=10; // начальные условия (которые будем менять)
- x=0.8; u=0; // конечные условия
- //X1=X(T) X2=u(T)-1
- runge(x0,u0,&x,&u,out);
- d=mod(x-XX,u-UU);
- printf("d: %g x: %g u: %g x0: %g u0: %g.20\n",d,x,u,x0,u0);
- //fprintf(out,"oi%1.20f %1.20f %1.20f %1.20f\n",x,u,x0,u0);
- printf("%f\n",d);
- //printf("%f\n",d);
- while(d > eps){
- sp(&x0,&u0,&x,&u,out);
- //runge(x0,u0,&x,&u,out);
- d = mod(x-XX,u-UU);
- //fprintf(out,"%f\n",d);
- printf("d: %.20lf x: %g u: %g x0: %g u0: %lf \n",d,x,u,x0,u0);
- /*fprintf(out,"%e %e %e %e\n",x,u,x0,u0);*/
- }
- v = runge(x0,u0,&x,&u,out); // значение интеграла
- printf("x0: %1.15f u0: %1.15f\n",x0,u0);
- printf("x: %1.15f u: %1.15f",x,u);
- /*fprintf(out,"Integral: %e\n",v);
- fprintf(out,"x0: %e u0: %1e\n",x0,u0);
- fprintf(out,"x: %e u: %e",x,u);*/
- }
- double zapuskrunge(FILE*out)
- {
- double x,u;
- double x0,u0;
- double I;
- x0=-0.079004795578223; u0=0.954478985578936; //T=Pi/2; // как я понимаю начальные усовия уже посчитали
- //z0=36.191649591711020; u0=78.592331658908350;//T=10;
- //z0=-100; u0=-100;
- x=0; u=0;
- I=runge(x0,u0,&x,&u,out);
- printf("x0: %1.10f u0: %1.10f\n",x0,u0);
- printf("x: %1.10f u: %1.10f",x,u);
- printf("\n Integral %f\n",I);
- printf("x0: %1.10f u0: %1.10f\n",x0,u0);
- printf("x: %1.10f u: %1.10f",x,u);
- //fprintf(out,"\n Integral %f\n",I);
- //fprintf(out,"\n Integral %f\n",I);
- //fprintf(out,"z0: %1.10f u0: %1.10f\n",z0,u0);
- //fprintf(out,"x: %1.10f u: %1.10f",x,u);
- //
- return 0;
- }
- double test(FILE*out) // для различных epsilon и выводим числа рунге
- {
- double t=0;
- double h;
- double x,y,z,u,v;
- double eps;
- double facmax=2.0;
- double er=0;
- double del=0;
- double T=PI;
- double dx,dy;
- double k; //int k;
- double dx7,dx9,dx11;
- double dy7,dy9,dy11;
- int k7,k9,k11;
- double del7,del9,del11;
- double x7,y7;
- double x9,y9;
- double x11,y11;
- int R=1;
- double x0,y0,z0,u0;
- x0=0;y0=1;z0=0;u0=0;
- double gamma=1.;
- double alpha=5;
- T=PI;
- while (R!=10e6){
- T=R*PI;
- eps=10e-7; k=0; dx=0; dy=0;
- h=eps; x=x0; y=y0; z=z0; u=u0; facmax=2.0; er=0; del=0; t=0;
- //printf("ok%e %e %e %e %e\n",x,y,z,u,h);
- while (t<gamma*T){
- del+=err(&t,&x,&y,&z,&u,&v,&h,facmax,out,eps,gamma*T,&k,&dx,&dy,alpha);
- //printf("ok%e %e %e %e %e\n",x,y,z,u,h);
- }
- del7=del;k7=k;
- dx7=dx;dy7=dy;
- x7=x; y7=y;
- eps=10e-9; k=0; dx=0; dy=0;
- h=eps;x=x0; y=y0; z=z0; u=u0; facmax=2.0; er=0; del=0; t=0;
- while (t<gamma*T){
- del+=err(&t,&x,&y,&z,&u,&v,&h,facmax,out,eps,gamma*T,&k,&dx,&dy,alpha);
- }
- del9=del;k9=k;
- dx9=dx;dy9=dy;
- x9=x; y9=y;
- eps=10e-11; k=0; dx=0; dy=0;
- h=eps; x=x0; y=y0; z=z0; u=u0; facmax=2.0; er=0; del=0; t=0;
- while (t<gamma*T){
- del+=err(&t,&x,&y,&z,&u,&v,&h,facmax,out,eps,gamma*T,&k,&dx,&dy,alpha);
- }
- del11=del; k11=k;
- dx11=dx; dy11=dy;
- x11=x; y11=y;
- //k-steps
- printf("T: %d Pi\n\n",R);
- printf("eps 10e-7 k: %d, |x(T)|: %e |y(T)-cos(T)|: %e dx:%e dy: %e delta(T): %e\n\n",k7,fabs(x7),fabs(y7-cos(T)),dx7,dy7,del7);
- printf("eps 10e-9 k: %d, |x(T)|: %e |y(T)-cos(T)|: %e dx:%e dy: %e delta(T): %e\n\n",k9,fabs(x9),fabs(y9-cos(T)),dx9,dy9,del9);
- printf("eps 10e-11 k: %d, |x(T)|: %e |y(T)-cos(T)|: %e dx:%e dy: %e delta(T): %e\n\n",k11,fabs(x11),fabs(y11-cos(T)),dx11,dy11,del11);
- printf("Runge number x for T: %g\n\n", fabs((x7-x9)/(x9-x11)));
- printf("Runge number y for T: %g\n\n", fabs((y7-y9)/(y9-y11)));
- fprintf(out,"T: %d Pi\n",R);
- fprintf(out,"eps 10e-7 k: %d, |x(T)|: %e |y(T)-cos(T)|: %e dx:%e dy: %e delta(T): %e\n\n",k7,fabs(x7),fabs(y7-cos(T)),dx7,dy7,del7);
- fprintf(out,"eps 10e-9 k: %d, |x(T)|: %e |y(T)-cos(T)|: %e dx:%e dy: %e delta(T): %e\n\n",k9,fabs(x9),fabs(y9-cos(T)),dx9,dy9,del9);
- fprintf(out,"eps 10e-11 k: %d, |x(T)|: %e |y(T)-cos(T)|: %e dx:%e dy: %e delta(T): %e\n\n",k11,fabs(x11),fabs(y11-cos(T)),dx11,dy11,del11);
- fprintf(out,"Runge number x for T: %g\n\n", fabs((x7-x9)/(x9-x11)));
- fprintf(out,"Runge number y for T: %g\n\n", fabs((y7-y9)/(y9-y11)));
- R*=10;
- }
- return y;
- }
- int main(void){
- FILE*out=fopen("output.txt","w");
- //pristrel(out);
- zapuskrunge(out);
- //test(out);
- return sqrt(9);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement