File: examples.c

package info (click to toggle)
libwn6 6.0-17
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, sarge
  • size: 6,012 kB
  • ctags: 3,903
  • sloc: ansic: 45,078; makefile: 960; csh: 274; sh: 17
file content (92 lines) | stat: -rw-r--r-- 1,607 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include "wnlib.h"
#include "wnasrt.h"
#include "wnmem.h"

#include "wnconj.h"


#define NUM_VARS  2


local int grad_count,func_count;


local void gradient(double grad[],double vect[])
{
  double x1,x2;
  double diff1,diff2;
  double ob;

  printf("gradient.  count = %d\n",grad_count);
  ++grad_count;

  x1 = vect[0];
  x2 = vect[1];

  diff1 = x2-x1*x1*x1;
  diff2 = 1.0-x1;

  grad[0] = -600.0*diff1*x1*x1 - 2.0*diff2;
  grad[1] = 200.0*diff1;
}


/*
  function = 100(x2-x1^3)^2 + (1-x1)^2
*/
local double function(double vect[])
{
  double x1,x2;
  double diff1,diff2;
  double ob;

  x1 = vect[0];
  x2 = vect[1];

  diff1 = x2-x1*x1*x1;
  diff2 = 1.0-x1;

  ob = (100.0*diff1*diff1 + diff2*diff2);

  printf("ob = %lg,func_count = %d\n",ob,func_count);
  ++func_count;

  return(ob);
}


void main(void)
{
  double vect[2],delta_vect[2];
  int code;
  double val_min;

  /*
  wn_gpmake("no_free");
  */

  grad_count = func_count = 0;

  vect[0] = -1.2;
  vect[1] = -1.0;

  delta_vect[0] = 0.001;
  delta_vect[1] = 0.001;

  wn_conj_gradient_method(&code,&val_min,vect,NUM_VARS,(function),(gradient),WN_IHUGE);
  /*
  wn_conj_direction_method(&code,&val_min,vect,NUM_VARS,(function),WN_IHUGE);
  wn_conj_gradient_diff_method(&code,&val_min,vect,delta_vect,NUM_VARS,(function),WN_IHUGE);
  */

  printf("code = %d\n",code);
  printf("objective = %lg\n",val_min);
  val_min = function(vect);
  printf("actual objective = %lg\n",val_min);
  wn_print_vect(vect,NUM_VARS);
  printf("grad_count = %d,func_count = %d\n",grad_count,func_count);
}