00001
00002
00003
00004
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 }