libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
Функции полиномов и их анализ.

Функции

int cheby_poly1 (double *x, int n, int ord, double *y)
 Многочлен Чебышева первого рода порядка ord Подробнее...
 
int cheby_poly2 (double *x, int n, int ord, double *y)
 Многочлен Чебышева второго рода порядка ord Подробнее...
 
int polyroots (double *a, int ord, complex_t *r, int *info)
 Расчет корней вещественного полинома Подробнее...
 
int polyval (double *a, int ord, double *x, int n, double *y)
 Расчет вещественного полинома Подробнее...
 
int polyval_cmplx (complex_t *a, int ord, complex_t *x, int n, complex_t *y)
 Расчет комплексного полинома Подробнее...
 

Подробное описание

Функции

◆ cheby_poly1()

int cheby_poly1 ( double *  x,
int  n,
int  ord,
double *  y 
)

Многочлен Чебышева первого рода порядка ord


Функция производит расчет многочлена Чебышева первого рода \( C_{ord}(x)\) для вещественного вектора x длины nна основе рекуррентной формулы

\[ C_{ord}(x) = 2 x C_{ord-1}(x) - C_{ord-2}(x), \]

где \( C_0(x) = 1 \), \( C_1(x) = x\)

Аргументы
[in]xУказатель на вектор x аргумента полинома Чебышева первого рода.
Размер вектора [n x 1].

[in]nРазмер векторов x и y.

[in]ordПорядок полинома Чебышева первого рода.

[out]yУказатель на вектор значений полинома Чебышева, соответствующих аргументу x.
Размер вектора [n x 1].
Память должна быть выделена.

Возвращает
RES_OK Расчет произведен успешно.
В противном случае код ошибки.
Пример использования функции:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 250
int main(int argc, char* argv[])
{
void* hdspl; /* DSPL handle */
void* hplot; /* GNUPLOT handle */
double x[N], y[N];
int ord;
char fn[64];
hdspl = dspl_load(); /* Load DSPL function */
linspace(-1.0, 1.0, N, DSPL_SYMMETRIC, x);
for(ord = 1; ord < 5; ord++)
{
cheby_poly1(x, N, ord, y);
sprintf(fn, "dat/cheby_poly1_ord%d.txt", ord);
writetxt(x,y,N,fn);
}
/* plotting by GNUPLOT */
gnuplot_create(argc, argv, 560, 380, "img/cheby_poly1.png", &hplot);
gnuplot_cmd(hplot, "set grid");
gnuplot_cmd(hplot, "set key left top");
gnuplot_cmd(hplot, "set xlabel 'x'");
gnuplot_cmd(hplot, "set ylabel 'C_N(x)'");
gnuplot_cmd(hplot, "set yrange [-1.5:1.5]");
gnuplot_cmd(hplot, "plot 'dat/cheby_poly1_ord1.txt' with lines, \\");
gnuplot_cmd(hplot, " 'dat/cheby_poly1_ord2.txt' with lines, \\");
gnuplot_cmd(hplot, " 'dat/cheby_poly1_ord3.txt' with lines, \\");
gnuplot_cmd(hplot, " 'dat/cheby_poly1_ord4.txt' with lines");
gnuplot_close(hplot);
dspl_free(hdspl); /* free dspl handle */
return 0;
}

В каталоге dat будут созданы текстовые файлы значений полиномов порядка 1-4:

cheby_poly1_ord1.txt
cheby_poly1_ord2.txt
cheby_poly1_ord3.txt
cheby_poly1_ord4.txt

Кроме того программа GNUPLOT произведет построение следующих графиков по сохраненным в файлах данным:

Автор
Бахурин Сергей www.dsplib.org

См. определение в файле cheby_poly1.c строка 136

◆ cheby_poly2()

int cheby_poly2 ( double *  x,
int  n,
int  ord,
double *  y 
)

Многочлен Чебышева второго рода порядка ord


Функция производит расчет многочлена Чебышева второго рода \( U_{ord}(x)\) для вещественного вектора x длины nна основе рекуррентной формулы

\[ U_{ord}(x) = 2 x U_{ord-1}(x) - U_{ord-2}(x), \]

где \( U_0(x) = 1 \), \( U_1(x) = 2x\)

Аргументы
[in]xУказатель на вектор x аргумента полинома Чебышева второго рода.
Размер вектора [n x 1].

[in]nРазмер векторов x и y.

[in]ordПорядок полинома Чебышева второго рода.

[out]yУказатель на вектор значений полинома Чебышева, соответствующих аргументу x.
Размер вектора [n x 1].
Память должна быть выделена.

Возвращает
RES_OK Расчет произведен успешно.
В противном случае код ошибки.
Пример использования функции:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 250
int main(int argc, char* argv[])
{
void* hdspl; /* DSPL handle */
void* hplot; /* GNUPLOT handle */
double x[N], y[N];
int ord;
char fn[64];
hdspl = dspl_load(); /* Load DSPL function */
linspace(-1.0, 1.0, N, DSPL_SYMMETRIC, x);
for(ord = 1; ord < 5; ord++)
{
cheby_poly2(x, N, ord, y);
sprintf(fn, "dat/cheby_poly2_ord%d.txt", ord);
writetxt(x,y,N,fn);
}
/* plotting by GNUPLOT */
gnuplot_create(argc, argv, 560, 380, "img/cheby_poly2.png", &hplot);
gnuplot_cmd(hplot, "set grid");
gnuplot_cmd(hplot, "set key left top");
gnuplot_cmd(hplot, "set xlabel 'x'");
gnuplot_cmd(hplot, "set ylabel 'U_N (x)'");
gnuplot_cmd(hplot, "set yrange [-3.5:3.5]");
gnuplot_cmd(hplot, "plot 'dat/cheby_poly2_ord1.txt' with lines, \\");
gnuplot_cmd(hplot, " 'dat/cheby_poly2_ord2.txt' with lines, \\");
gnuplot_cmd(hplot, " 'dat/cheby_poly2_ord3.txt' with lines, \\");
gnuplot_cmd(hplot, " 'dat/cheby_poly2_ord4.txt' with lines");
gnuplot_close(hplot);
dspl_free(hdspl); /* free dspl handle */
return 0;
}

В каталоге dat будут созданы текстовые файлы значений полиномов порядка 1-4:

cheby_poly2_ord1.txt
cheby_poly2_ord2.txt
cheby_poly2_ord3.txt
cheby_poly2_ord4.txt

Кроме того программа GNUPLOT произведет построение следующих графиков по сохраненным в файлах данным:

Автор
Бахурин Сергей www.dsplib.org

См. определение в файле cheby_poly2.c строка 133

◆ polyroots()

int polyroots ( double *  a,
int  ord,
complex_t r,
int *  info 
)

Расчет корней вещественного полинома


Функция рассчитывает корни полинома \(P_N(x)\) \(N-\)ого порядка, заданного вектором коэффициентов a.

\[ P_N(x) = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + ... a_N x^N. \]

Корни полинома рассчитываются как собственные числа характеристической матрицы полинома. Для расчета собственных чисел используется подпрограмма пакета LAPACK.

Аргументы
[in]aУказатель на вектор вещественных коэффициентов полинома.
Размер вектора [ord+1 x 1].
Коэффициент a[0] соответствует коэффициенту полинома \(a_0\).
Коэффициент a[ord] не должен быть равен нулю.

[in]ordПорядок полинома \(N\).

[out]rУказатель на вектор комплексных корней полинома.
Размер вектора [ord x 1].
Память должна быть выделена.
Корни вещественного полинома могут быть как вещественными, так и образовывать простые или кратные комплексно-сопряженные пары корней. Поэтому выходной вектор корней имеет комплексный тип данных.

[out]infoУказатель наа код возврата пакета LAPACK.
Данный код возвращается подпрограммой LAPACK и транслируется через данную переменную для возможности анализа.

Возвращает
RES_OK — корни полинома рассчитаны успешно.

В противном случае код ошибки.

Пример расчета корней полинома:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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) = 2 + 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: 0x%.8x\n", err);
/* 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;
}

Данная программа производит расчет корней полинома

\[ P(x) = 2 + 2x + x^2 \]

и выводит рассчитанные корни на печать. Результат работы программы:

Error code: 0x00000000
r[0] = -1.00000 1.00000 j
r[1] = -1.00000-1.00000 j

Получили пару комплексно-сопряженных корней полинома.

Автор
Бахурин Сергей. www.dsplib.org

См. определение в файле polyroots.c строка 157

◆ polyval()

int polyval ( double *  a,
int  ord,
double *  x,
int  n,
double *  y 
)

Расчет вещественного полинома


Функция рассчитывает полином \(P_N(x)\) \(N-\)ого порядка для вещественного аргумента, заданного вектором x.

\[ P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N. \]

Для расчета используется формула Горнера:

\[ 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 ))) \]

Аргументы
[in]aУказатель на вектор вещественных коэффициентов полинома.
Размер вектора [ord+1 x 1].
Коэффициент a[0] соответствует коэффициенту полинома \(a_0\).

[in]ordПорядок полинома \(N\).

[in]xУказатель на вектор аргумента полинома.
Размер вектора [n x 1].
Значения полинома будут расчитаны для всех значений аргумента вектора x.

[in]nРазмер вектора агрумента полинома.

[out]yУказатель на значения полинома для аргумента x.
Размер вектора [n x 1].
Память должна быть выделена.

Возвращает
RES_OK — полином рассчитан успешно.

В противном случае код ошибки.
Автор
Бахурин Сергей. www.dsplib.org

См. определение в файле polyval.c строка 77

Используется в bessel_i0(), farrow_lagrange() и farrow_spline().

◆ polyval_cmplx()

int polyval_cmplx ( complex_t a,
int  ord,
complex_t x,
int  n,
complex_t y 
)

Расчет комплексного полинома


Функция рассчитывает полином \(P_N(x)\) \(N\)-го порядка комплексного аргумента, заданного вектором x.

\[ P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N. \]

Для расчета используется формула Горнера:

\[ 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 ))) \]

Аргументы
[in]aУказатель на вектор комплексных коэффициентов полинома.
Размер вектора [ord+1 x 1].
Коэффициент a[0] соответствует коэффициенту полинома \(a_0\).

[in]ordПорядок полинома \(N\).

[in]xУказатель на вектор аргумента полинома.
Размер вектора [n x 1].
Значения полинома будут расчитаны для всех значений аргумента вектора x.

[in]nРазмер вектора агрумента полинома.

[out]yУказатель вектор значения полинома для аргумента x.
Размер вектора [n x 1].
Память должна быть выделена.

Возвращает
RES_OK — полином расчитан успешно.
В противном случае код ошибки.
Автор
Бахурин Сергей. www.dsplib.org

См. определение в файле polyval_cmplx.c строка 80

Используется в freqs() и freqz().

#define RE(x)
Макрос определяющий реальную часть комплексного числа.
Definition: dspl.h:420
int cheby_poly2(double *x, int n, int ord, double *y)
Многочлен Чебышева второго рода порядка ord
Definition: cheby_poly2.c:133
void gnuplot_close(void *h)
Закрыть хэндл GNUPLOT.
Definition: gnuplot_close.c:80
int polyroots(double *a, int ord, complex_t *r, int *info)
Расчет корней вещественного полинома
Definition: polyroots.c:157
void * dspl_load()
Произвести динамическую линковку и загрузить функции libdspl-2.0.
void gnuplot_cmd(void *h, char *cmd)
Функция посылает команду cmd пакету GNUPLOT, для построения или оформления графика,...
Definition: gnuplot_cmd.c:82
int cheby_poly1(double *x, int n, int ord, double *y)
Многочлен Чебышева первого рода порядка ord
Definition: cheby_poly1.c:136
int writetxt(double *x, double *y, int n, char *fn)
Сохранить вещественные данные в текстовый файл
Definition: writetxt.c:122
double complex_t[2]
Описание комплексного типа данных.
Definition: dspl.h:86
void dspl_free(void *handle)
Очищает связанную ранее динамическую библиотеку DSPL-2.0.
int linspace(double x0, double x1, int n, int type, double *x)
Функция заполняет массив линейно-нарастающими, равноотстоящими значениями от x0 до x1
Definition: linspace.c:169
#define IM(x)
Макрос определяющий мнимую часть комплексного числа.
Definition: dspl.h:478
int gnuplot_create(int argc, char *argv[], int w, int h, char *fn_png, void **hplot)
Создать график GNUPLOT.