1 #ifndef GNUMERIC_GOAL_SEEK_H
2 #define GNUMERIC_GOAL_SEEK_H
3 
4 #include <numbers.h>
5 #include <glib.h>
6 
7 typedef struct {
8 	gnm_float xmin;           // Minimum allowed value for x.
9 	gnm_float xmax;           // Maximum allowed value for x.
10 	gnm_float precision;      // Desired relative precision.
11 
12 	gboolean havexpos;        // Do we have a valid xpos?
13 	gnm_float xpos;           // Value for which f(xpos) > 0.
14 	gnm_float ypos;           // f(xpos).
15 
16 	gboolean havexneg;        // Do we have a valid xneg?
17 	gnm_float xneg;           // Value for which f(xneg) < 0.
18 	gnm_float yneg;           // f(xneg).
19 
20 	gboolean have_root;       // Do we have a valid root?
21 	gnm_float root;           // Value for which f(root) == 0.
22 } GnmGoalSeekData;
23 
24 typedef struct {
25 	GnmCell *xcell;           // Cell to change
26 	GnmCell *ycell;           // Result cell
27 	gnm_float ytarget;        // Target value
28 } GnmGoalSeekCellData;
29 
30 typedef enum { GOAL_SEEK_OK, GOAL_SEEK_ERROR } GnmGoalSeekStatus;
31 
32 typedef GnmGoalSeekStatus (*GnmGoalSeekFunction) (gnm_float x, gnm_float *y, void *user_data);
33 
34 void goal_seek_initialize (GnmGoalSeekData *data);
35 
36 GnmGoalSeekStatus goal_seek_point (GnmGoalSeekFunction f,
37 				   GnmGoalSeekData *data,
38 				   void *user_data,
39 				   gnm_float x0);
40 
41 GnmGoalSeekStatus goal_seek_newton (GnmGoalSeekFunction f,
42 				    GnmGoalSeekFunction df,
43 				    GnmGoalSeekData *data,
44 				    void *user_data,
45 				    gnm_float x0);
46 
47 GnmGoalSeekStatus goal_seek_bisection (GnmGoalSeekFunction f,
48 				       GnmGoalSeekData *data,
49 				       void *user_data);
50 
51 GnmGoalSeekStatus goal_seek_trawl_uniformly (GnmGoalSeekFunction f,
52 					     GnmGoalSeekData *data,
53 					     void *user_data,
54 					     gnm_float xmin, gnm_float xmax,
55 					     int points);
56 
57 GnmGoalSeekStatus goal_seek_trawl_normally (GnmGoalSeekFunction f,
58 					    GnmGoalSeekData *data,
59 					    void *user_data,
60 					    gnm_float mu, gnm_float sigma,
61 					    int points);
62 
63 GnmGoalSeekStatus gnm_goal_seek_eval_cell (gnm_float x,
64 					   gnm_float *y, gpointer data);
65 
66 GnmGoalSeekStatus gnm_goal_seek_cell (GnmGoalSeekData *data,
67 				      GnmGoalSeekCellData *celldata);
68 
69 
70 #endif
71