4
** Try the Numerical Recipies code
7
** Georgia Institute of Technology
14
#include <libciomr/libciomr.h>
19
int iter, maxiter = 20;
21
double *x_cur, *x_last, *g_cur, *g_last;
22
double *dx, *dg, *hdg;
25
double dfunc(double *x, double *g);
30
x_cur = init_array(ndim);
31
x_last = init_array(ndim);
32
g_cur = init_array(ndim);
33
g_last = init_array(ndim);
34
dx = init_array(ndim);
35
dg = init_array(ndim);
36
hdg = init_array(ndim);
37
hessin = block_matrix(ndim,ndim);
43
for (i=0; i<ndim; i++) {
47
/* get value and gradient */
48
E = dfunc(x_cur,g_cur);
50
for (iter=0; iter<maxiter; iter++) {
52
printf("Iteration %d. Energy = %12.6lf\n", iter, E);
53
printf("x and gradient\n");
54
for (i=0; i<ndim; i++)
55
printf("%12.6lf %12.6lf\n", x_cur[i], g_cur[i]);
58
if (fabs(E - E_last) < 0.00001) {
59
printf("Converged\n");
63
for (i=0; i<ndim; i++) {
64
dg[i] = g_cur[i] - g_last[i];
65
dx[i] = x_cur[i] - x_last[i];
68
for (i=0; i<ndim; i++) {
70
for (j=0; j<ndim; j++) hdg[i] += hessin[i][j]*dg[j];
74
for (i=0; i<ndim; i++) {
80
for (i=0; i<ndim; i++) dg[i] = fac*dx[i] - fad*hdg[i];
81
for (i=0; i<ndim; i++) {
82
for (j=0; j<ndim; j++) {
83
hessin[i][j] += fac*dx[i]*dx[j] - fad*hdg[i]*hdg[j] + fae*dg[i]*dg[j];
87
printf("Hessian inverse:\n");
88
for (i=0; i<ndim; i++) {
89
for (j=0; j<ndim; j++) {
90
printf("%12.6lf ", hessin[i][j]);
96
for (i=0; i<ndim; i++) {
101
for (i=0; i<ndim; i++) {
102
for (j=0; j<ndim; j++) {
103
x_cur[i] -= hessin[i][j] * g_cur[j];
108
E = dfunc(x_cur,g_cur);
111
} /* end iteration */
113
free(x_cur); free(x_last); free(g_cur); free(g_last);
114
free(dx); free(dg); free(hdg);
119
double dfunc(double *x, double *g)
122
/* right now try (x-1)^2 + 10y^2, min is 0 at x=1,y=0 */
123
E = (x[0] - 1.0) * (x[0] - 1.0) + 10.0 * x[1] * x[1];
124
g[0] = 2.0 * (x[0] - 1.0);