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 bessel_i0 (double *x, int n, double *y)
 Модифицированная функция Бесселя первого рода $ I_0(x)$. Подробнее...
 
int sine_int (double *x, int n, double *si)
 Функция интегрального синуса Подробнее...
 

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

Функции

◆ bessel_i0()

int bessel_i0 ( double *  x,
int  n,
double *  y 
)

Модифицированная функция Бесселя первого рода $ I_0(x)$.


Функция рассчитывает значения функции для вещественного вектора x, который должен принимать неотрицательные значения.

Аргументы
[in]xУказатель на вектор переменной $ x $.
Размер вектора [n x 1].
Память должна быть выделена.

[in]nРазмер входного вектора x.

[out]yУказатель на вектор значений функции $ I_0(x)$.
Размер вектора [n x 1].
Память должна быть выделена.

Возвращает
RES_OK Расчет произведен успешно.
В противном случае код ошибки.
Заметки
Для расчета используется аппроксимация приведенная в статье:
Rational Approximations for the Modified Bessel Function of the First Kind – I0(x) for Computations with Double Precision by PAVEL HOLOBORODKO on NOVEMBER 11, 2015

Пример использования функции bessel_i0:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 50
/******************************************************************************
* Main function
******************************************************************************/
int main(int argc, char* argv[])
{
void* hdspl; /* DSPL handle */
void* hplot; /* GNUPLOT handle */
double x[N], y[N];
/* Load DSPL function */
hdspl = dspl_load();
/* x in [0, 3] */
linspace(0.0, 3.0, N, DSPL_SYMMETRIC, x);
/* Bessel I0(x) function */
bessel_i0(x, N, y);
/* Write calculated values to the dat/dat0.txt file */
writetxt(x, y, N, "dat/dat0.txt");
/* plotting by GNUPLOT */
gnuplot_create(argc, argv, 560, 380, "img/bessel_i0.png", &hplot);
gnuplot_cmd(hplot, "set grid");
gnuplot_cmd(hplot, "set xlabel 'x'");
gnuplot_cmd(hplot, "set key left top");
gnuplot_cmd(hplot, "set ylabel 'I_0(x)'");
gnuplot_cmd(hplot, "set yrange [0:5]");
gnuplot_cmd(hplot, "plot 'dat/dat0.txt' with lines");
gnuplot_close(hplot);
/* free dspl handle */
dspl_free(hdspl);
return 0;
}

Данная программа рассчитывает значения функции $ I_0(x)$ переменной x в интервале $[0 \ 3]$. Рассчитанные данные сохраняются в текстовый файл dat/dat0.txt и выводятся на график img/bessel_i0.png

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

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

◆ 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 */
hdspl = dspl_load(); // Load DSPL function
double x[N], y[N];
int ord;
char fn[64];
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 произведет построение следующих графиков по сохраненным в файлах данным:

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

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

◆ 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 */
hdspl = dspl_load(); // Load DSPL function
double x[N], y[N];
int ord;
char fn[64];
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 произведет построение следующих графиков по сохраненным в файлах данным:

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

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

◆ sine_int()

int sine_int ( double *  x,
int  n,
double *  si 
)

Функция интегрального синуса


\[ \textrm{Si}(x) = \int_{0}^{x} \frac{\sin(x)}{x} \, dx\]

Функция рассчитывает значения функции для интегрального синуса для произвольного вещественного вектора x.

Аргументы
[in]xУказатель на вектор переменной $ x $.
Размер вектора [n x 1].
Память должна быть выделена.

[in]nРазмер входного вектора x.

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

Возвращает
RES_OK Расчет произведен успешно.
В противном случае код ошибки.
Пример использования функции sine_int:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 400
int main(int argc, char* argv[])
{
void* hdspl; /* DSPL handle */
void* hplot; /* GNUPLOT handle */
hdspl = dspl_load(); /* Load DSPL function */
double x[N], y[N];
linspace(-6*M_PI, 6*M_PI, N, DSPL_PERIODIC, x);
sine_int(x, N, y);
writetxt(x, y, N, "dat/dat0.txt");
sinc(x, N, 1.0, y);
writetxt(x, y, N, "dat/dat1.txt");
/* plotting by GNUPLOT */
gnuplot_create(argc, argv, 560, 280, "img/sine_int.png", &hplot);
gnuplot_cmd(hplot, "set grid");
gnuplot_cmd(hplot, "set xlabel 'x'");
gnuplot_cmd(hplot, "set lmargin at screen 0.10");
gnuplot_cmd(hplot, "set key left top");
gnuplot_cmd(hplot, "set ylabel 'Si(x), sinc(x)'");
gnuplot_cmd(hplot, "set yrange [-2:2]");
gnuplot_cmd(hplot, "plot 'dat/dat0.txt' with lines title 'Si(x)', \\");
gnuplot_cmd(hplot, " 'dat/dat1.txt' with lines title 'sinc(x)'");
gnuplot_close(hplot);
dspl_free(hdspl); // free dspl handle
return 0;
}

Данная программа рассчитывает значения функции интегрального синуса и функции sinc для вектора переменной x в интервале $[-6\pi \ 6\pi]$. Рассчитанные данные сохраняются в текстовые файлы dat/dat0.txt и dat/dat1.txt

и выводятся на график img/sine_int.png

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

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