xneldermead.c

00001 /*
00002   Пример использования функций из модуля @optim.h@ 
00003   Минимизация <<банана>>-Розенброка:
00004   $f(x_1, x_2) = (x_2 - x_1^2)^2 + (1 - x_1)^2$
00005   симплекс-методом Нелдера-Мида   
00006 */
00007 
00008 #include <stdio.h>
00009 #include <math.h>
00010 #include "nl.h"
00011 
00012 double func(double *x)
00013 {
00014 
00015   double tmp1, tmp2;
00016 
00017   tmp1 = x[1] - x[0]*x[0];
00018   tmp2 = 1 - x[0];
00019 
00020   return tmp1 * tmp1 + tmp2 * tmp2;
00021 }
00022 
00023 int main(void)
00024 {
00025   size_t n, j;
00026   double *x0, **x, *f, *xbar, *xr, *xe, *xc;
00027   double f0;
00028   double tolf, tolx;
00029   int maxfun, maxiter, rc, nfun, niter;
00030 
00031   n = 2;
00032 
00033   x0 = nl_dvector_create(n);
00034   x = nl_dmatrix_create(n + 1, n);
00035   f = nl_dvector_create(n + 1);
00036   xbar = nl_dvector_create(n);
00037   xr = nl_dvector_create(n);
00038   xe = nl_dvector_create(n);
00039   xc = nl_dvector_create(n);
00040 
00041   x0[0] = -1.2;
00042   x0[1] = 1;
00043   tolf = 1.0e-6;
00044   tolx = 1.0e-6;
00045   maxfun = 200;
00046   maxiter = 50;
00047 
00048   opt_nelder_mead(n, func, x0, &f0, 0, x, f, tolf, tolx, maxfun, maxiter, 
00049     &rc, &nfun, &niter, xbar, xr, xe, xc);
00050 
00051   if (rc)
00052   {
00053     printf("\nЧисло итераций или количество вычисленных значений функции\n");
00054     printf("превысило максимально допустимое!\n" );
00055   }
00056   else
00057     printf("\nУспешное завершение\n");
00058 
00059   printf("\nКоличество вычисленных значений функции: %d\n", nfun);
00060   printf("Число итераций (количество построенных симплексов): %d\n",niter);
00061 
00062   printf("\nВычисленная точка минимума:\n");
00063   nl_dvector_print(x0, n, "  %12.6e");
00064 
00065   printf("\nЗначение функции в этой точке: %12.6e\n", f);
00066 
00067   printf("\nВершины последнего симплекса:\n");
00068   nl_dmatrix_print(x, n + 1, n, "  %12.6e");
00069 
00070   printf("\nЗначения функции в вершинах:\n");
00071   nl_dvector_print(f, n + 1, "  %12.6e");
00072   
00073   nl_dvector_free(x0);
00074   nl_dmatrix_free(x, n + 1);
00075   nl_dvector_free(f);
00076   nl_dvector_free(xbar);
00077   nl_dvector_free(xr);
00078   nl_dvector_free(xe);
00079   nl_dvector_free(xc);
00080 
00081   return 0;
00082 }

Документация по NL. Последние изменения: Mon Oct 9 12:25:54 2006. Создано системой  doxygen 1.4.7