Текст подпрограммы и версий
qsf8r_c.zip  qsf8d_c.zip 
Тексты тестовых примеров
tqsf8r_c.zip  tqsf8d_c.zip 

Подпрограмма:  qsf8r_c

Назначение

Вычисление интеграла

             b
             ∫  f (x) sin( wx + φ ) dx
            a 

методом Лонгмана.

Математическое описание

B случае | w (b - a) | ≥ 2π по квадратурной формуле Гаусса с N узлами вычисляются интегралы по отрезкам [a, xa] и [xb, b], где xa и xb = xa + n0 π /|w| - соответственно наименьший и наибольший из n0 + 1 нулей функции sin (wx + φ) на отрезке [a, b]; затем вычисляются интегралы

                    xa + ( i+1 ) π / | w |
   Vi = (-1)i      ∫   f (x) sin( wx + φ ) dx
                   xa + i π / | w |

( i = 0, 1, ..., K - 1, n0 - K, n0 - K + 1, ..., n0 - 1), и за значение интеграла по отрезку [xa, xb] принимается сумма

           K-1
(1)       ∑ { [ (-1)i Δi V0 + (-1)n0 - 1 Δi Vn0 - i - 1 ] / 2 i + 1 }
           i=0 

B случае | w (b - a) | < 2π интеграл по отрезку [a, b] вычисляется с помощью квадратурной формулы Гаусса с N узлами.

Longman I.M. A Method for the Numerical Evaluation of Finite Integrals of Oscillatory Functions. - Math. Comput., 1960, Vol. 14, N 69, P. 53-59.

Кукаркин А.Б., Новикова Е.И. O вычислении интегралов от быстроосциллирующих функций методом Лонгмана. - Ж. вычисл.матем. и матем. физ., 1981, т. 21, N 5, 1091-1099.

Использование

    int qsf8r_c(real *rint, real *a, real *b, R_fp f, real *w,
        real *fi, integer *n, integer *k, real *ra, real *rb)

Параметры

rint - вещественная переменная, содержащая вычисленное значение интеграла;
a, b - заданные нижний и верхний пределы интегрирования соответственно (тип: вещественный);
f - имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию f (x);
w - заданное значение параметра  w (тип: вещественный);
fi - заданное значение параметра  φ (тип: вещественный);
n - заданное число узлов квадратурной формулы Гаусса для вычисления интегралов по отрезкам, внутри которых не содержатся нули функции sin (wx + φ); может принимать только следующие значения: 4, 6, 8, 12, 16, 24 (тип: целый);
k - целая переменная, задающая число членов суммы (1) (k ≥ 2);
ra, rb - вещественные векторы длины n, используемые как рабочие.

Версии

qsf8d_c - вычисление с удвоенной точностью интеграла
             b
             ∫  f (x) sin( wx + φ ) dx
            a 
методом Лонгмана.

Вызываемые подпрограммы: нет

Замечания по использованию

 

Если значение K больше n0, где n0 - вычисляемое в подпрограмме число отрезков, концами которых являются соседние нули функции sin (wx + φ), то в (1) K заменяется на n0. При выходе из подпрограммы значение K полагается равным min {K, n0}.

В подпрограмме qsf8d_c параметры rint, a, b, f, w, fi, ra, rb имеют тип double.

Пример использования

int main(void)
{
    /* Local variables */
    static float rint, a, b;
    extern int qsf8r_c(float *, float *, float *, R_fp, float *,
                       float *, int *, int *, float *, float *);
    extern float f_c();
    static int k, n;
    static float w, fi, ra[5], rb[5];

    a = 0.f;
    b = 1.f;
    w = 1e3f;
    fi = 0.f;
    n = 6;
    k = 5;
    qsf8r_c(&rint, &a, &b, (R_fp)f_c, &w, &fi, &n, &k, ra, rb);

    printf("\n %16.7e %5i \n",rint,k);
    return 0;
} /* main */

float f_c(float *x)
{
    /* System generated locals */
    float ret_val;

    /* Builtin functions */
    double sin(double);

    ret_val = (float)sin(*x);
    return ret_val;
} /* f_c */


Результат:   rint  =  -0.0004727794