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