diff --git a/dspl/doc/html/formula.repository b/dspl/doc/html/formula.repository
index 39c4e2f..45b2fc1 100644
--- a/dspl/doc/html/formula.repository
+++ b/dspl/doc/html/formula.repository
@@ -63,83 +63,83 @@
\form#62:\[ k_i = \left( \frac{k_{i-1}} { 1+\sqrt{1-k_{i-1}^2} } \right)^2 \]
\form#63:$ k<1 $
\form#64:$ y = \textrm{sn}(u K(k), k)$
-\form#65:\[ Y(k) = \frac{1}{N} \sum_{m = 0}^{n-1} x(m) \exp \left( j \frac{2\pi}{n} m k \right), \]
-\form#66:$n = n_0 \times n_1 \times n_2 \times n_3 \times \ldots \times n_p \times m$
-\form#67:$n = n_0 \times n_1 \times n_2 \ldots \times n_p \times m$
-\form#68:$ n = 725760 $
-\form#69:$725760 = 2 \cdot 3 \cdot 4 \cdot 5 \cdot 6 \cdot 7 \cdot 9 \cdot 16 $
-\form#70:$ n = 172804 = 43201 \cdot 4 $
-\form#71:$ n = 13 \cdot 17 \cdot 23 \cdot 13 = 66079 $
-\form#72:$\sqrt{2^{31}} = 46340.95$
-\form#73:$x_0$
-\form#74:$x_1$
-\form#75:$x(k) = x_0 + k \cdot dx$
-\form#76:$dx = \frac{x_1 - x_0}{n-1}$
-\form#77:$k = 0 \ldots n-1.$
-\form#78:$dx = \frac{x_1 - x_0}{n}$
-\form#79:$10^{x_0}$
-\form#80:$10^{x_1}$
-\form#81:$x(k) = 10^{x_0} \cdot dx^k$
-\form#82:$dx = \sqrt[n-1]{10^{x_1 - x_0}}$
-\form#83:$dx = \sqrt[n]{10^{x_1 - x_0}}$
-\form#84:$ H(j \omega) $
-\form#85:$ H(j \omega)$
-\form#86:$ H(s) $
-\form#87:\[ H(s) = \frac {\sum_{k = 0}^{N} b_k s^k} {\sum_{m = 0}^{N} a_m s^m}, \]
-\form#88:$ N $
-\form#89:$ s = j \omega $
-\form#90:$ \omega $
-\form#91:$H(s)$
-\form#92:$ H \left(\mathrm{e}^{j\omega} \right) $
-\form#93:$ 2\pi $
-\form#94:$ \pi $
-\form#95:$ -\pi $
-\form#96:$ H \left(e^{j \omega} \right)$
-\form#97:\[ H(z) = \frac {\sum_{k = 0}^{N} b_k z^{-k}} {\sum_{m = 0}^{N} a_m z^{-m}}, \]
-\form#98:$N$
-\form#99:$z = e^{j \omega} $
-\form#100:$\omega$
-\form#101:$ 2 \pi-$
-\form#102:$2 \pi$
-\form#103:$-\pi$
-\form#104:$ \pi$
-\form#105:$ H \left(e^{j \omega} \right) = H^* \left(e^{-j \omega} \right)$
-\form#106:$\pi$
-\form#107:$ -R_p $
-\form#108:$ H(s)$
-\form#109:$-R_p$
-\form#110:$ R_p $
-\form#111:$-R_s$
-\form#112:$H(j\cdot 1) = -R_s$
-\form#113:\[ H(s) = \frac{\sum_{n = 0}^{N_z} b_n \cdot s^n}{\sum_{m = 0}^{N_p} a_m \cdot s^m} = \frac{\prod_{n = 0}^{N_z}(s-z_n)}{\prod_{m = 0}^{N_p} (s-p_m)} \]
-\form#114:\[ H(z) = \sum_{n = 0}^{ord} h_n z^{-n} \]
-\form#115:$ F(s) $
-\form#116:$F(s)$
-\form#117:$Y(s) = (H \circ F)(s) = H(F(s))$
-\form#118:\[ H(s) = \frac{\sum\limits_{m = 0}^{n} b_m s^m} {\sum\limits_{k = 0}^{n} a_k s^k}, \quad F(s) = \frac{\sum\limits_{m = 0}^{p} d_m s^m} {\sum\limits_{k = 0}^{p} c_k s^k}, \quad Y(s) = \frac{\sum\limits_{m = 0}^{n p} \beta_m s^m} {\sum\limits_{k = 0}^{n p} \alpha_k s^k} \]
-\form#119:$Y(s) = (H \circ F)(s)$
-\form#120:\[ s \leftarrow \frac{1 - z^{-1}}{1 - z^{-1}}. \]
-\form#121:$\Omega$
-\form#122:\[ \Omega = \tan(\omega / 2). \]
-\form#123:\[ s(t) = \sum\limits_{n = 0}^{n_{\omega}-1} S(\omega_n) \exp(j\omega_n t) \]
-\form#124:$\omega_n$
-\form#125:$S(\omega_n)$
-\form#126:$ I_0(x)$
-\form#127:$ x $
-\form#128:$[0 \ 3]$
-\form#129:$ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}$
-\form#130:\[ \textrm{Si}(x) = \int_{0}^{x} \frac{\sin(x)}{x} \, dx\]
-\form#131:$[-6\pi \ 6\pi]$
-\form#132:$P_N(x)$
-\form#133:$N-$
-\form#134:\[ P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N. \]
-\form#135:\[ P_N(x) = a_0 + x \cdot (a_1 + x \cdot (a_2 + \cdot ( \ldots x \cdot (a_{N-1} + x\cdot a_N) \ldots ))) \]
-\form#136:$\mu$
-\form#137:$\sigma$
-\form#138:$\sigma^2$
-\form#139:$\mu = 0$
-\form#140:$\sigma=1$
-\form#141:$\frac{P}{Q}$
-\form#142:$P$
-\form#143:$Q$
-\form#144:$1/F_{\textrm{s}}$
+\form#65:$n = n_0 \times n_1 \times n_2 \ldots \times n_p \times m$
+\form#66:$\frac{P}{Q}$
+\form#67:$P$
+\form#68:$Q$
+\form#69:$1/F_{\textrm{s}}$
+\form#70:\[ Y(k) = \frac{1}{N} \sum_{m = 0}^{n-1} x(m) \exp \left( j \frac{2\pi}{n} m k \right), \]
+\form#71:$n = n_0 \times n_1 \times n_2 \times n_3 \times \ldots \times n_p \times m$
+\form#72:$ n = 725760 $
+\form#73:$725760 = 2 \cdot 3 \cdot 4 \cdot 5 \cdot 6 \cdot 7 \cdot 9 \cdot 16 $
+\form#74:$ n = 172804 = 43201 \cdot 4 $
+\form#75:$ n = 13 \cdot 17 \cdot 23 \cdot 13 = 66079 $
+\form#76:$\sqrt{2^{31}} = 46340.95$
+\form#77:$x_0$
+\form#78:$x_1$
+\form#79:$x(k) = x_0 + k \cdot dx$
+\form#80:$dx = \frac{x_1 - x_0}{n-1}$
+\form#81:$k = 0 \ldots n-1.$
+\form#82:$dx = \frac{x_1 - x_0}{n}$
+\form#83:$10^{x_0}$
+\form#84:$10^{x_1}$
+\form#85:$x(k) = 10^{x_0} \cdot dx^k$
+\form#86:$dx = \sqrt[n-1]{10^{x_1 - x_0}}$
+\form#87:$dx = \sqrt[n]{10^{x_1 - x_0}}$
+\form#88:$ H(j \omega) $
+\form#89:$ H(j \omega)$
+\form#90:$ H(s) $
+\form#91:\[ H(s) = \frac {\sum_{k = 0}^{N} b_k s^k} {\sum_{m = 0}^{N} a_m s^m}, \]
+\form#92:$ N $
+\form#93:$ s = j \omega $
+\form#94:$ \omega $
+\form#95:$H(s)$
+\form#96:$ H \left(\mathrm{e}^{j\omega} \right) $
+\form#97:$ 2\pi $
+\form#98:$ \pi $
+\form#99:$ -\pi $
+\form#100:$ H \left(e^{j \omega} \right)$
+\form#101:\[ H(z) = \frac {\sum_{k = 0}^{N} b_k z^{-k}} {\sum_{m = 0}^{N} a_m z^{-m}}, \]
+\form#102:$N$
+\form#103:$z = e^{j \omega} $
+\form#104:$\omega$
+\form#105:$ 2 \pi-$
+\form#106:$2 \pi$
+\form#107:$-\pi$
+\form#108:$ \pi$
+\form#109:$ H \left(e^{j \omega} \right) = H^* \left(e^{-j \omega} \right)$
+\form#110:$\pi$
+\form#111:$ -R_p $
+\form#112:$ H(s)$
+\form#113:$-R_p$
+\form#114:$ R_p $
+\form#115:$-R_s$
+\form#116:$H(j\cdot 1) = -R_s$
+\form#117:\[ H(s) = \frac{\sum_{n = 0}^{N_z} b_n \cdot s^n}{\sum_{m = 0}^{N_p} a_m \cdot s^m} = \frac{\prod_{n = 0}^{N_z}(s-z_n)}{\prod_{m = 0}^{N_p} (s-p_m)} \]
+\form#118:\[ H(z) = \sum_{n = 0}^{ord} h_n z^{-n} \]
+\form#119:$ F(s) $
+\form#120:$F(s)$
+\form#121:$Y(s) = (H \circ F)(s) = H(F(s))$
+\form#122:\[ H(s) = \frac{\sum\limits_{m = 0}^{n} b_m s^m} {\sum\limits_{k = 0}^{n} a_k s^k}, \quad F(s) = \frac{\sum\limits_{m = 0}^{p} d_m s^m} {\sum\limits_{k = 0}^{p} c_k s^k}, \quad Y(s) = \frac{\sum\limits_{m = 0}^{n p} \beta_m s^m} {\sum\limits_{k = 0}^{n p} \alpha_k s^k} \]
+\form#123:$Y(s) = (H \circ F)(s)$
+\form#124:\[ s \leftarrow \frac{1 - z^{-1}}{1 - z^{-1}}. \]
+\form#125:$\Omega$
+\form#126:\[ \Omega = \tan(\omega / 2). \]
+\form#127:\[ s(t) = \sum\limits_{n = 0}^{n_{\omega}-1} S(\omega_n) \exp(j\omega_n t) \]
+\form#128:$\omega_n$
+\form#129:$S(\omega_n)$
+\form#130:$ I_0(x)$
+\form#131:$ x $
+\form#132:$[0 \ 3]$
+\form#133:$ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}$
+\form#134:\[ \textrm{Si}(x) = \int_{0}^{x} \frac{\sin(x)}{x} \, dx\]
+\form#135:$[-6\pi \ 6\pi]$
+\form#136:$P_N(x)$
+\form#137:$N-$
+\form#138:\[ P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N. \]
+\form#139:\[ P_N(x) = a_0 + x \cdot (a_1 + x \cdot (a_2 + \cdot ( \ldots x \cdot (a_{N-1} + x\cdot a_N) \ldots ))) \]
+\form#140:$\mu$
+\form#141:$\sigma$
+\form#142:$\sigma^2$
+\form#143:$\mu = 0$
+\form#144:$\sigma=1$
diff --git a/dspl/dox/ru/error_list.dox b/dspl/dox/ru/error_list.dox
index 6dd4e07..098f9b5 100644
--- a/dspl/dox/ru/error_list.dox
+++ b/dspl/dox/ru/error_list.dox
@@ -218,6 +218,15 @@
*/
+/*!
+\ingroup ERROR_CODE_GROUP
+\def ERROR_MALLOC
+\brief Ошибка динамического выделения памяти.
+Данная ошибка означает, что при динамическом выделении памяти произошла ошбика.
+В результате функция `malloc` в теле вызваемой функции вернула `NULL` указатель.
+Дальнейшая обработка функцией невозможна.
+*/
+
/*!
\ingroup ERROR_CODE_GROUP
@@ -226,7 +235,6 @@
*/
-
/*!
\ingroup ERROR_CODE_GROUP
\def ERROR_MIN_MAX
@@ -234,7 +242,6 @@
*/
-
/*!
\ingroup ERROR_CODE_GROUP
\def ERROR_NEGATIVE
@@ -245,6 +252,16 @@
+/*!
+\ingroup ERROR_CODE_GROUP
+\def ERROR_POLY_AN
+\brief Неверно задан старший коэффициент полинома.
+Например при вычислении кореней полинома степени \f$N\f$
+\f[ P_N(x) = a_0 + a_1 x + a_2 x^2 + \ldots a_N x^N \f]
+старший коэффициентом \f$a_N\f$ не может быть равным нулю.
+*/
+
+
/*!
\ingroup ERROR_CODE_GROUP
diff --git a/dspl/src/array.c b/dspl/src/array.c
index f51a539..ef27c4e 100644
--- a/dspl/src/array.c
+++ b/dspl/src/array.c
@@ -26,6 +26,36 @@
#include "blas.h"
+/******************************************************************************
+Vector linear transformation
+*******************************************************************************/
+int array_scale_lin(double* x, int n,
+ double xmin, double xmax, double dx,
+ double h, double* y)
+{
+ double kx;
+ int k;
+ if(!x)
+ return ERROR_PTR;
+ if(n<1)
+ return ERROR_SIZE;
+ if(h<0.0)
+ return ERROR_NEGATIVE;
+
+ if(xmin >= xmax)
+ return ERROR_MIN_MAX;
+
+ kx = h / (xmax - xmin);
+
+ for(k = 0; k < n; k++)
+ y[k] = (x[k] - xmin) * kx + dx;
+
+ return RES_OK;
+}
+
+
+
+
/******************************************************************************
\fn int concat(void* a, size_t na, void* b, size_t nb, void* c)
\brief
@@ -489,32 +519,19 @@ int DSPL_API logspace(double x0, double x1, int n, int type, double* x)
}
-
-/******************************************************************************
-Vector linear transformation
+/*******************************************************************************
+Oned double array
*******************************************************************************/
-int array_scale_lin(double* x, int n,
- double xmin, double xmax, double dx,
- double h, double* y)
+int DSPL_API ones(double* x, int n)
{
- double kx;
- int k;
+ int i;
if(!x)
return ERROR_PTR;
if(n<1)
return ERROR_SIZE;
- if(h<0.0)
- return ERROR_NEGATIVE;
-
- if(xmin >= xmax)
- return ERROR_MIN_MAX;
-
- kx = h / (xmax - xmin);
-
- for(k = 0; k < n; k++)
- y[k] = (x[k] - xmin) * kx + dx;
-
- return RES_OK;
+ for(i = 0; i < n; i++)
+ x[i] = 1.0;
+ return RES_OK;
}
diff --git a/dspl/src/polyval.c b/dspl/src/polyval.c
index ec39c49..12fd82a 100644
--- a/dspl/src/polyval.c
+++ b/dspl/src/polyval.c
@@ -63,6 +63,42 @@ int DSPL_API poly_z2a_cmplx(complex_t* z, int nz, int ord, complex_t* a)
+
+/******************************************************************************
+Real polynomial roots calculation
+*******************************************************************************/
+int DSPL_API polyroots(double* a, int ord, complex_t* r, int* info)
+{
+ complex_t *t = NULL;
+ int m;
+ int err;
+
+ if(!a || !r)
+ return ERROR_PTR;
+ if(ord<0)
+ return ERROR_POLY_ORD;
+ if(a[ord] == 0.0)
+ return ERROR_POLY_AN;
+
+ t = (complex_t*)malloc(ord * ord * sizeof(complex_t));
+ if(!t)
+ return ERROR_MALLOC;
+
+ for(m = 0; m < ord-1; m++)
+ {
+ RE(t[m * (ord+1) + 1]) = 1.0;
+ RE(t[m + ord * (ord - 1)]) = -a[m] / a[ord];
+ }
+ RE(t[ord * ord - 1]) = -a[ord-1] / a[ord];
+
+ err = matrix_eig_cmplx(t, ord, r, info);
+
+ return err;
+}
+
+
+
+
/******************************************************************************
Real polynomial evaluation
*******************************************************************************/
diff --git a/examples/src/polyroots_test.c b/examples/src/polyroots_test.c
new file mode 100644
index 0000000..f70b3d8
--- /dev/null
+++ b/examples/src/polyroots_test.c
@@ -0,0 +1,34 @@
+#include
+#include
+#include
+#include "dspl.h"
+
+#define N 2
+
+int main(int argc, char* argv[])
+{
+ void* hdspl; /* DSPL handle */
+ double a[N+1] = {2.0, 2.0, 1.0}; /* P(x) = 0.5 - 2x + x^2 */
+ complex_t r[N] = {0}; /* roots */
+ int err, n, info;
+ hdspl = dspl_load(); /* Load DSPL functions */
+ if(!hdspl)
+ {
+ printf("libdspl loading error!\n");
+ return -1;
+ }
+
+
+ /* roots calculation */
+ err = polyroots(a, N, r, &info);
+ printf("Error code: %.8x\n");
+
+ /* print roots */
+ for(n = 0; n < N; n++)
+ printf("r[%d] = % -8.5f% -8.5f j\n", n, RE(r[n]), IM(r[n]));
+
+ /* free dspl handle */
+ dspl_free(hdspl);
+ return 0;
+}
+
diff --git a/include/dspl.c b/include/dspl.c
index 1ccb19e..94672b1 100644
--- a/include/dspl.c
+++ b/include/dspl.c
@@ -139,7 +139,10 @@ p_matrix_transpose_cmplx matrix_transpose_cmplx ;
p_matrix_transpose_hermite matrix_transpose_hermite ;
p_minmax minmax ;
+p_ones ones ;
+
p_poly_z2a_cmplx poly_z2a_cmplx ;
+p_polyroots polyroots ;
p_polyval polyval ;
p_polyval_cmplx polyval_cmplx ;
@@ -337,8 +340,11 @@ void* dspl_load()
LOAD_FUNC(matrix_transpose_cmplx);
LOAD_FUNC(matrix_transpose_hermite);
LOAD_FUNC(minmax);
+
+ LOAD_FUNC(ones);
LOAD_FUNC(poly_z2a_cmplx);
+ LOAD_FUNC(polyroots);
LOAD_FUNC(polyval);
LOAD_FUNC(polyval_cmplx);
diff --git a/include/dspl.h b/include/dspl.h
index d9b55a1..1509321 100644
--- a/include/dspl.h
+++ b/include/dspl.h
@@ -130,12 +130,14 @@ typedef struct
/* L 0x12xxxxxx*/
#define ERROR_LAPACK 0x12011601
/* M 0x13xxxxxx*/
+#define ERROR_MALLOC 0x13011212
#define ERROR_MATRIX_SIZE 0x13011926
#define ERROR_MIN_MAX 0x13091413
/* N 0x14xxxxxx*/
#define ERROR_NEGATIVE 0x14050701
/* O 0x15xxxxxx*/
/* P 0x16xxxxxx*/
+#define ERROR_POLY_AN 0x16150114
#define ERROR_POLY_ORD 0x16151518
#define ERROR_PTR 0x16201800
/* Q 0x17xxxxxx*/
@@ -795,11 +797,19 @@ DECLARE_FUNC(int, minmax, double* x
COMMA double* xmin
COMMA double* xmax);
/*----------------------------------------------------------------------------*/
+DECLARE_FUNC(int, ones, double* x
+ COMMA int n);
+/*----------------------------------------------------------------------------*/
DECLARE_FUNC(int, poly_z2a_cmplx, complex_t*
COMMA int
COMMA int
COMMA complex_t*);
/*----------------------------------------------------------------------------*/
+DECLARE_FUNC(int, polyroots, double* a
+ COMMA int ord
+ COMMA complex_t* r
+ COMMA int* info);
+/*----------------------------------------------------------------------------*/
DECLARE_FUNC(int, polyval, double*
COMMA int
COMMA double*