Текст подпрограммы и версий
qsazc_c.zip  qsazp_c.zip 
Тексты тестовых примеров
tqsazc_c.zip  tqsazp_c.zip 

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

Назначение

Вычисление криволинейного интеграла от комплекснозначной функции

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

Подпрограмма qsazc_c вычисляет криволинейный интеграл от комплекснозначной функции  f (z) ,  z = z (t)  по участку кривой Г, для которого a ≤ t ≤ b. Вычисленное значение интеграла полагается равным конечной сумме Римана - Стилтьеса.

            n 
           ∑   f ( zk )  ( zi  -  zi-1 )     ,
           i=1 

где  n - число подынтервалов, на которые должен быть разбит исходный отрезок [ a, b ],
а  zk ( zi - 1, zi )

Лаврентьев М.А., Шабат Б.В. Методы теории функций комплексного переменного. М.: Физматгиз, 1965.

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

    int qsazc_c (real *a, real *b, S_fp f, S_fp g, integer *n,
            real *rint1, real *rint2)

Параметры

a, b - заданные границы отрезка изменения параметра  t  (тип: вещественный);
f - имя подпрограммы вычисления значения  f (z) в текущей точке  z (t) кривой Г; заголовок подпрограммы f имеет вид:

int f(float *z, float *fz),

где z - вещественный одномерный массив длины 2, в первой компоненте которого задается вещественная часть аргумента  z (t), а во второй - мнимая часть аргумента  z (t);
fz - вещественный одномерный массив длины 2, в первой компоненте которого должна быть помещена вещественная часть  f ( z (t) ), а во второй компоненте - мнимая часть  f ( z (t) )
g - имя подпрограммы вычисления значения текущей точки  z (t)  кривой Г; заголовок подпрограммы g имеет вид:

int g(float *t, float *zt),

где t - значение параметра  t , определяющее положение текущей точки  z (t) на кривой Г;
zt - вещественный одномерный массив длины 2, в первой компоненте которого должна быть помещена вещественная часть вычисленного значения  z (t), а во второй компоненте - мнимая часть вычисленного значения  z (t).
n - заданное число подынтервалов, на которые должен быть разбит исходный отрезок [ a, b ] (тип: целый);
rint1 -
rint2  
вещественные переменные, содержащие на выходе соответственно вещественную и мнимую части вычисленного значения интеграла.

Версии

qsazp_c - вычисление криволинейного интеграла от комплекснозначной функции в режиме удвоенной точности; при этом параметры a, b, rint1 и rint2, а также z, fz, t и zt должны иметь тип double.

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

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

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

Пусть требуется вычислить интеграл

          ∫    z 2  dz   =   - 2/3     ,

где z = z (1) + i z (2), по полуокружности | z | = 1, 0 ≤ arg (z) ≤ π  с началом пути в точке  z = 1 . Данная полуокружность (участок кривой Г) описывается уравнениями:

          z(1)   =   cos  t
          z(2)   =   sin  t     ,  

где a ≤ t ≤ b, a = 0, b = π .
Выражения для fz(1) и fz(2) следуют из соотношений:

           z2    =    ( z(1)   +   i z(2) )2    =    z(1)2   -   z(2)2   +   2 i z(1) z(2)   =
                 =    cos2 t   -   sin2 t   +   2 i cos t  sin t    =    1   -   2 sin2 t   +   2 i cos t  sin t    = 
                 =    1   -   2 z(2)2   +   2 i z(1) z(2)     .

Отсюда следует, что

          fz(1)   =   1  -  2 z(2)2  ;       fz(2)   =   2 z(1) z(2) 

int main(void)
{
    /* Local variables */
    static float rint1, rint2, a, b;
    extern int f_c(), g_c();
    static int n;
    extern int qsazc_c(float *, float *, U_fp, U_fp, int *, float *, float *);

    a = 0.f;
    b = 3.14159265f;
    n = 250;
    qsazc_c(&a, &b, (U_fp)f_c, (U_fp)g_c, &n, &rint1, &rint2);

    printf("\n %16.7e  %16.7e \n", rint1, rint2);
    return 0;
} /* main */

int f_c(float *z__, float *fz)
{
    /* System generated locals */
    float r__1;

    /* Parameter adjustments */
    --fz;
    --z__;

    /* Function Body */
/* Computing 2nd power */
    r__1 = z__[2];
    fz[1] = 1 - r__1 * r__1 * 2;
    fz[2] = z__[1] * 2 * z__[2];
    return 0;
} /* f_c */

int g_c(float *t, float *zt)
{
    /* Builtin functions */
    double cos(double), sin(double);

    /* Parameter adjustments */
    --zt;

    /* Function Body */
    zt[1] = (float)cos(*t);
    zt[2] = (float)sin(*t);
    return 0;
} /* g_c */
 

Результаты:      rint1   =   -0.6667545    ,       rint2   =   -0.1329556e-4