озволило досягти заданої точності (через це значення деяких чисел у ПРП менше ніж у ЦРП).
Можна побачити, що при h рівному і використання ЦРП ефективніше ніж ПРП.
Для порівняння ПРП і ЦРП при великому кроці h точність для зупину зробимо більш грубою. Тоді побачимо, що:
nh 522/21 * 20/36 * 20/2420/21613/25 * 15/19 * 15/2615/18720/29 * 19/29 * 19/2319/19
Видно, що при h рівному і використання ЦРП раніше ефективніше, ніж ПРП. А при h рівному і, навіть при не досягненні необхідної точності у ПРП, кількість ітерацій при використанні ЦРП менше ніж при використанні ПРП.
Можна зробити висновок, що застосування центральної РП предпочтительней, як з точки зору ефективної роботи програми, так і з точки зору швидкості отримання результату.
Код програми на Сі:
# include lt; stdio.h gt;
# include lt; math.h gt;
# include lt; windows.h gt;
# define EPS 0.000000002
# define f function
# define nv the_number_of_variables
# define CENTRAL 0
# define RIGHT 1
# define LEFT 2int the_number_of_variables=4; function (double * x) {pow (x [0] + 10 * x [1], 2) + 5 * pow (x [2] -x [3], 2) + pow (x [1] - 2 * x [2], 4) + 10 * pow (x [0] -x [3], 4);
} * ToRus (const char text []); * gradient (double * x, double h, int ds); CentralDS (double * x, double h, int i); RightDS (double * x, double h, int i); LeftDS (double * x, double h, int i); (* DS [3]) (double * x, double h, int i)={CentralDS, RightDS, LeftDS}; NormaV (double * x, int n); * minimi (double * x, double * p, double dx); zoloto (double * x, double * p, double a, double b, double eps); argminf (double * x, double * g, double eps); main () {i, k, n, ds; * g, * g_old, * x, * p, yI, yII; eps1, eps2, h, Sc, Sz, betta, alfa; =(double *) malloc (nv * sizeof (double));=(double *) malloc (nv * sizeof (double));
k=1;=6;//циклічність (через скільки ітерації станеться рестарт)=0.001;=1e - 6;=1e - 6;//крок при обчислення градієнта в РС
ds=CENTRAL;//RIGHT (% s , ToRus ( При розрахунках використана )); (ds + 1) {1: printf (% s raquo ;, ToRus ( центральна )); break; 2: printf (% s , ToRus ( права )); break; 3: printf (% s , ToRus ( ліва )) ; break;
} (% s n , ToRus ( різницева схема знаходження градієнта )); (% s: tx0=(, ToRus ( Початкова точка ));
for (i=0; i lt; nv; i ++) {[i]=1; printf (%. 0lf, , x [i]);
} (), tf (x0) =% .6lf n , function (x));
printf (% s: teps1 =% .3lf n , ToRus ( Максимальна величина норми градієнта при останове ), eps1); (% s: teps2= % lf n , ToRus ( Точність обчислення аргументу alfa на кожній ітерації ), eps2); (% s: th =% lf n , ToRus ( Крок в різницевій похідною ), h );
g_old=gradient (x, h, ds); (i=0; i lt; nv; i ++) p [i]=- g_old [i]; ( n% s t t t% s t t t% s n , ToRus ( МСГ [ОМ/ЗС]raquo;),ToRus(laquo;Аргументыraquo;),ToRus(laquo;Функцияraquo;));(laquo;---------------------------------------------------------------------------raquo;);(laquo;%2d , k);=f (x);=argminf (x, p, eps2); (i=0; i lt; nv; i ++) {x [i] +=alfa * p [i]; } (i=0; i lt; nv; i ++) {printf ( x% d =%. 4lf , i + 1, x [i]);} ( f =%. 6lf n , f (x)); ++; yII=f (x); {= gradient (x, h, ds);=0;=0; (i=0; i lt; nv; i ++) {+=g [i] * g [i]; +=g_old [i] * g_old [i];
}=Sc/Sz; (k% n == 1) {= 0; (fabs (yI-yII) lt; EPS) {
eps1=NormaV (g, nv) +1.; ( t% s n , ToRus ( Зупинка унаслідок надзвичайно малої зміни y (x) ));
}
} (i=0; i lt; nv; i ++) {_ old [i]=g [i]; [i]=betta * p [i] - g [i];
} (% 2d , k);=argminf (x, p, eps2); (i=0; i lt; nv; i ++) {x [i] + =alfa * p [i];} (i=0; i lt; nv; i ++) {printf ( x% d =%. 4lf , i + 1, x [i]);}= yI;=f (x); ( f =%. 6lf n , yI); ++;
} while (NormaV (g, nv) gt; eps1);(laquo;---------------------------------------------------------------------------raquo;);(laquo;%s: f (, ToRus ( Підсумок розрахунків )); (i=0; i lt; nv; i ++) {printf (%. 4lf, , x [i]);} ( laquo ;) =% .6lf n , f (x)); (x); (g); (g_old); (p); 0;
} CentralDS (double * x, double h, int i) {j; * y; df;=(double *) malloc (nv * sizeof (double)); (j=0; j lt ; nv; j ++) {[j]=x [j];
} [i] +=0.5 * h;=f (y); [i] -=h; -=f (y); /=h; (y); df;
} RightDS (double * x, double h, int i) {j; * y; df;=(double *) malloc (nv * sizeof (doub...