libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
Высшие трансцендентные функции

Функции

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

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

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

◆ 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

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

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

int sine_int(double *x, int n, double *si)
Функция интегрального синуса
Definition: sine_int.c:114
void gnuplot_close(void *h)
Закрыть хэндл GNUPLOT.
Definition: gnuplot_close.c:80
void * dspl_load()
Произвести динамическую линковку и загрузить функции libdspl-2.0.
void gnuplot_cmd(void *h, char *cmd)
Функция посылает команду cmd пакету GNUPLOT, для построения или оформления графика,...
Definition: gnuplot_cmd.c:82
int writetxt(double *x, double *y, int n, char *fn)
Сохранить вещественные данные в текстовый файл
Definition: writetxt.c:122
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
int bessel_i0(double *x, int n, double *y)
Модифицированная функция Бесселя первого рода .
Definition: bessel_i0.c:116
int sinc(double *x, int n, double a, double *y)
Функция .
Definition: sinc.c:88
int gnuplot_create(int argc, char *argv[], int w, int h, char *fn_png, void **hplot)
Создать график GNUPLOT.