Текст подпрограммы и версий qsazc_c.zip qsazp_c.zip |
Тексты тестовых примеров tqsazc_c.zip tqsazp_c.zip |
Вычисление криволинейного интеграла от комплекснозначной функции
Подпрограмма 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