libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
polyval.c
1 /*
2 * Copyright (c) 2015-2019 Sergey Bakhurin
3 * Digital Signal Processing Library [http://dsplib.org]
4 *
5 * This file is part of libdspl-2.0.
6 *
7 * is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * DSPL is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 
22 #include <stdlib.h>
23 #include <string.h>
24 #include "dspl.h"
25 
26 
27 
28 #ifdef DOXYGEN_ENGLISH
29 
30 #endif
31 #ifdef DOXYGEN_RUSSIAN
32 
33 #endif
34 int DSPL_API poly_z2a_cmplx(complex_t* z, int nz, int ord, complex_t* a)
35 {
36  int k, ind, res;
37  complex_t x[2];
38 
39  if(!z || !a)
40  return ERROR_PTR;
41  if(nz < 0)
42  return ERROR_SIZE;
43  if(nz > ord || ord < 1)
44  return ERROR_POLY_ORD;
45 
46  RE(x[1]) = 1.0;
47  IM(x[1]) = 0.0;
48 
49  memset(a, 0, (ord+1) * sizeof(complex_t));
50 
51  RE(a[0]) = 1.0;
52  ind = 1;
53  for(k = 0; k < nz; k++)
54  {
55  RE(x[0]) = -RE(z[k]);
56  IM(x[0]) = -IM(z[k]);
57  res = conv_cmplx(a, ind, x, 2, a);
58  if(res!=RES_OK)
59  return res;
60  ind++;
61  }
62 
63  return RES_OK;
64 }
65 
66 
67 
68 
69 
70 #ifdef DOXYGEN_ENGLISH
71 
72 #endif
73 #ifdef DOXYGEN_RUSSIAN
74 
134 #endif
135 int DSPL_API polyroots(double* a, int ord, complex_t* r, int* info)
136 {
137  complex_t *t = NULL;
138  int m;
139  int err;
140 
141  if(!a || !r)
142  return ERROR_PTR;
143  if(ord<0)
144  return ERROR_POLY_ORD;
145  if(a[ord] == 0.0)
146  return ERROR_POLY_AN;
147 
148  t = (complex_t*)malloc(ord * ord * sizeof(complex_t));
149  if(!t)
150  return ERROR_MALLOC;
151 
152  for(m = 0; m < ord-1; m++)
153  {
154  RE(t[m * (ord+1) + 1]) = 1.0;
155  RE(t[m + ord * (ord - 1)]) = -a[m] / a[ord];
156  }
157  RE(t[ord * ord - 1]) = -a[ord-1] / a[ord];
158 
159  err = matrix_eig_cmplx(t, ord, r, info);
160 
161  if(t)
162  free(t);
163  return err;
164 }
165 
166 
167 
168 
169 #ifdef DOXYGEN_ENGLISH
170 
171 #endif
172 #ifdef DOXYGEN_RUSSIAN
173 
218 #endif
219 int DSPL_API polyval(double* a, int ord, double* x, int n, double* y)
220 {
221  int k, m;
222 
223  if(!a || !x || !y)
224  return ERROR_PTR;
225  if(ord<0)
226  return ERROR_POLY_ORD;
227  if(n<1)
228  return ERROR_SIZE;
229 
230  for(k = 0; k < n; k++)
231  {
232  y[k] = a[ord];
233  for(m = ord-1; m>-1; m--)
234  y[k] = y[k]*x[k] + a[m];
235  }
236  return RES_OK;
237 }
238 
239 
240 
241 
242 
243 #ifdef DOXYGEN_ENGLISH
244 
245 #endif
246 #ifdef DOXYGEN_RUSSIAN
247 
292 #endif
293 int DSPL_API polyval_cmplx(complex_t* a, int ord,
294  complex_t* x, int n, complex_t* y)
295 {
296  int k, m;
297  complex_t t;
298 
299  if(!a || !x || !y)
300  return ERROR_PTR;
301  if(ord<0)
302  return ERROR_POLY_ORD;
303  if(n<1)
304  return ERROR_SIZE;
305 
306  for(k = 0; k < n; k++)
307  {
308  RE(y[k]) = RE(a[ord]);
309  IM(y[k]) = IM(a[ord]);
310  for(m = ord-1; m>-1; m--)
311  {
312  RE(t) = CMRE(y[k], x[k]);
313  IM(t) = CMIM(y[k], x[k]);
314  RE(y[k]) = RE(t) + RE(a[m]);
315  IM(y[k]) = IM(t) + IM(a[m]);
316  }
317  }
318  return RES_OK;
319 }
320 
#define ERROR_POLY_ORD
Неверно задан порядок полинома. Порядок полинома должен быть положительным целым числом.
Definition: dspl.h:544
#define RE(x)
Макрос определяющий реальную часть комплексного числа.
Definition: dspl.h:359
int polyval(double *a, int ord, double *x, int n, double *y)
Расчет вещественного полинома
Definition: polyval.c:219
#define ERROR_PTR
Ошибка указателя. Данная ошибка означает, что один из обязательных указателей (память под который дол...
Definition: dspl.h:545
int polyroots(double *a, int ord, complex_t *r, int *info)
Расчет корней вещественного полинома
Definition: polyval.c:135
#define ERROR_SIZE
Ошибка при передаче размера массива. Данная ошибка возникает когда помимо указателя на массив входных...
Definition: dspl.h:553
int polyval_cmplx(complex_t *a, int ord, complex_t *x, int n, complex_t *y)
Расчет комплексного полинома
Definition: polyval.c:293
int conv_cmplx(complex_t *a, int na, complex_t *b, int nb, complex_t *c)
Линейная свертка двух комплексных векторов
Definition: conv.c:327
int matrix_eig_cmplx(complex_t *a, int n, complex_t *v, int *info)
Расчет собственных значений квадратной комплексной матрицы.
Definition: matrix.c:90
double complex_t[2]
Описание комплексного типа данных.
Definition: dspl.h:86
#define RES_OK
Функция завершилась корректно. Ошибки отсутствуют.
Definition: dspl.h:497
#define IM(x)
Макрос определяющий мнимую часть комплексного числа.
Definition: dspl.h:417
#define ERROR_POLY_AN
Неверно задан старший коэффициент полинома. Например при вычислении кореней полинома степени .
Definition: dspl.h:543
#define ERROR_MALLOC
Ошибка динамического выделения памяти. Данная ошибка означает, что при динамическом выделении памяти ...
Definition: dspl.h:536