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
int main(int argc, char* argv[])
{
void* handle; // DSPL handle
handle = dspl_load(); // Load DSPL function
double x[N], y[N];
linspace(0.0, 3.0, N, DSPL_SYMMETRIC, x);
bessel_i0(x, N, y);
writetxt(x, y, N, "dat/dat0.txt");
/* run GNUPLOT script */
gnuplot_script(argc, argv, "gnuplot/bessel_i0.plt");
dspl_free(handle); // free dspl handle
return 0;
}

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

bessel_i0.png

Скрипт GNUPLOT для построения графиков из текстовых файлов:

if(!exists("plotterm")) plotterm = 'wxt'
if(plotterm eq "pngcairo") set output 'img/bessel_i0.png'
set grid
set xlabel "x"
set lmargin at screen 0.10
set key left top
set terminal plotterm size 560,380 enhanced font 'Verdana,8'
set ylabel "I_0(x)"
set yrange [0:5]
plot 'dat/dat0.txt' with lines
Автор
Бахурин Сергей 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* handle; // DSPL handle
handle = 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);
}
/* run GNUPLOT script */
gnuplot_script(argc, argv, "gnuplot/cheby_poly1.plt");
dspl_free(handle); // 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

Скрипт GNUPLOT для построения графиков из текстовых файлов:

if(!exists("plotterm")) plotterm = 'wxt'
if(plotterm eq "pngcairo") set output 'img/cheby_poly1.png'
set terminal plotterm size 560,380 enhanced font 'Verdana,8'
set grid
set xlabel "x"
set lmargin at screen 0.10
set key left top
set ylabel "C_N(x)"
set yrange [-1.5:1.5]
plot 'dat/cheby_poly1_ord1.txt' with lines, \
'dat/cheby_poly1_ord2.txt' with lines, \
'dat/cheby_poly1_ord3.txt' with lines, \
'dat/cheby_poly1_ord4.txt' with lines
Автор
Бахурин Сергей 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* handle; // DSPL handle
handle = 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);
}
/* run GNUPLOT script */
gnuplot_script(argc, argv, "gnuplot/cheby_poly2.plt");
dspl_free(handle); // 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

Скрипт GNUPLOT для построения графиков из текстовых файлов:

if(!exists("plotterm")) plotterm = 'wxt'
if(plotterm eq "pngcairo") set output 'img/cheby_poly2.png'
set grid
set xlabel "x"
set lmargin at screen 0.10
set key left top
set terminal plotterm size 560,380 enhanced font 'Verdana,8'
set ylabel "C_N(x)"
set yrange [-3.5:3.5]
plot 'dat/cheby_poly2_ord1.txt' with lines, \
'dat/cheby_poly2_ord2.txt' with lines, \
'dat/cheby_poly2_ord3.txt' with lines, \
'dat/cheby_poly2_ord4.txt' with lines
Автор
Бахурин Сергей 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* handle; // DSPL handle
handle = 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");
gnuplot_script(argc, argv, "gnuplot/sine_int.plt");
dspl_free(handle); // free dspl handle
return 0;
}

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

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

sine_int.png

Скрипт GNUPLOT для построения графиков из текстовых файлов:

if(!exists("plotterm")) plotterm = 'wxt'
if(plotterm eq "pngcairo") set output 'img/sine_int.png'
set grid
set xlabel "x"
set lmargin at screen 0.10
set key left top
set terminal plotterm size 560,280 enhanced font 'Verdana,8'
set ylabel "Si(x), sinc(x)"
set yrange [-2:2]
plot 'dat/dat0.txt' with lines title "Si(x)", \
'dat/dat1.txt' with lines title "sinc(x)"
Автор
Бахурин Сергей www.dsplib.org

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