78 #include <uves_utils_polynomial.h>
79 #include <uves_error.h>
80 #include <uves_utils_wrappers.h>
105 cpl_vector *x = NULL;
106 cpl_vector *y = NULL;
107 cpl_bivector *xy = NULL;
108 cpl_vector *z = NULL;
113 double coeff[3] = {43, -0.3, 0.0001};
114 double valx, valy, valz;
116 x = cpl_vector_new(1);
117 y = cpl_vector_new(1);
118 z = cpl_vector_new(1);
120 for (valx = -10; valx <= 50; valx += 4.7)
121 for (valy = 0.001; valy <= 0.002; valy *= 1.1)
124 valz = coeff[0]*valx*valx + coeff[1]*valy*valx + coeff[2]*valy*valy*valy*valy;
126 cpl_vector_set_size(x, npoints);
127 cpl_vector_set_size(y, npoints);
128 cpl_vector_set_size(z, npoints);
129 cpl_vector_set(x, npoints-1, valx);
130 cpl_vector_set(y, npoints-1, valy);
131 cpl_vector_set(z, npoints-1, valz);
135 for (degx = 0; degx <= 5; degx++)
136 for (degy = 0; degy <= 5; degy++) {
137 uves_unwrap_bivector_vectors(&xy);
138 xy = cpl_bivector_wrap_vectors(x, y);
148 if (degx >= 2 && degy >= 4) {
151 for (i = 0; i < cpl_vector_get_size(x); i++)
154 cpl_vector_get(x, i),
155 cpl_vector_get(y, i)),
156 cpl_vector_get(z, i), 0.001);
161 for (i = 0; i <= degx; i++)
162 for (j = 0; j <= degy; j++)
163 if (i == 2 && j == 0)
165 else if (i == 1 && j == 1)
167 else if (i == 0 && j == 4)
179 uves_free_vector(&x);
180 uves_free_vector(&y);
181 uves_free_vector(&z);
182 uves_unwrap_bivector_vectors(&xy);
195 cpl_polynomial *cp1 = cpl_polynomial_new(2);
196 cpl_polynomial *cp2 = cpl_polynomial_new(2);
197 cpl_size power[2] = {0, 3};
202 cpl_polynomial_set_coeff(cp1, power, 7.0);
203 cpl_polynomial_set_coeff(cp2, power, 9.0);
217 uves_free_polynomial(&cp1);
218 uves_free_polynomial(&cp2);
234 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
241 return cpl_test_end(0);
void uves_polynomial_delete(polynomial **p)
Delete a polynomial.
static void test_polynomial_fit_2d(void)
Test polynomial fitting.
#define uves_msg_warning(...)
Print an warning message.
polynomial * uves_polynomial_add_2d(const polynomial *p1, const polynomial *p2)
Add two polynomials.
double uves_polynomial_get_coeff_2d(const polynomial *p, int degree1, int degree2)
Get a coefficient of a 2D polynomial.
int main(void)
Test of uves_polynomial.
static void test_polynomial(void)
Various tests.
cpl_error_code uves_polynomial_rescale(polynomial *p, int varno, double scale)
Rescale a polynomial.
polynomial * uves_polynomial_new(const cpl_polynomial *pol)
Create a polynomial.
double uves_polynomial_evaluate_2d(const polynomial *p, double x1, double x2)
Evaluate a 2d polynomial.
polynomial * uves_polynomial_fit_2d(const cpl_bivector *xy_pos, const cpl_vector *values, const cpl_vector *sigmas, int poly_deg1, int poly_deg2, double *mse, double *red_chisq, polynomial **variance)
Fit a 2d surface with a polynomial in x and y.