Текст подпрограммы и версий (Си) de55d_c.zip |
Тексты тестовых примеров (Си) tde55d1_c.zip , tde55d2_c.zip , tde55d3_c.zip , tde55d4_c.zip , tde55d5_c.zip , tde55d6_c.zip |
Вычисление коэффициентов разложения решения задачи Коши для обыкновенных дифференциальных уравнений первого порядка и его производной в ряд по смещенным многочленам Чебышёва первого рода (получение аналитического выражения для приближенного решения задачи Коши и его производной в виде частичной суммы смещенного ряда Чебышёва).
Решается задача Коши для системы M обыкновенных дифференциальных уравнений пepвoгo порядка
(1) Y ' = F (X, Y) , Y = ( y1, ... , yM ) , F = ( f1 (X, y1, ... , yM), ... , fM (X, y1, ... , yM) ) , XN ≤ X ≤ XKс начальными условиями, заданными в точке XN :
(2) Y(XN) = YN , YN = ( y10, ... , yM0 ) ,
при условии, что правая часть системы (1) имеет непрерывные ограниченные частные производные по переменным X, Y. Предполагается, что на отрезке [XN, XK] задача (1),(2) имеет единственное решение. Тогда решение задачи Коши и его производная Y'(XN + αΔ) = F(XN + αΔ, Y(XN + αΔ)) = Φ(α) разлагаются на промежутке интегрирования [XN, XK] в равномерно сходящиеся ряды по смещенным многочленам Чебышёва первого рода
∞ 1 (3) Y(XN + αΔ) = ∑ ' ai*[Y] Ti* (α), 0 ≤ α ≤ 1, ai*[Y] = 2/π ∫ Y(XN + αΔ) Ti* (α) / √ (α (1 - α) ) dα , i=0 0 ∞ 1 (4) Φ(α) = ∑ ' ai*[Φ] Ti* (α), 0 ≤ α ≤ 1, ai*[Φ] = 2/π ∫ Φ(α) Ti* (α) / √ (α (1 - α) ) dα . i=0 0
Здесь: штрих у знака суммы означает, что слагаемое с индексом 0 берется с дополнительным множителем 1/2; Ti* (α) - смещенный многочлен Чебышёва первого рода на [0, 1]: Ti* (α) = Ti (2α-1) ; Ti (t) - многочлен Чебышёва первого рода i-го порядка на [-1, 1]; Δ = XK - XN. Если ряд Чебышёва (3) (и ряд (4)) является быстросходящимся, то его сумма на [XN, XK] (и сумма ряда (4)) хорошо приближается частичной суммой некоторого порядка. Эта частичная сумма принимается в качестве приближенного аналитического решения задачи (1), (2) на промежутке [XN, XK]. В противном случае, т.е. при медленной сходимости ряда (3) на интервале [XN, XK], получение аналитического решения в виде одной частичной суммы на всем отрезке интегрирования [XN, XK] может быть затруднено. Поэтому целесообразно использовать разбиение промежутка интегрирования [XN, XK] на такие элементарные сегменты некоторой длины H: [xs, xs+H], x0 = XN, s = 0, 1, ... , на каждом из которых ряды Чебышёва для решения Y(X) и его производной Y'(X) будут сходиться значительно быстрее. На каждом подобном сегменте решение исходной задачи Коши приближенно представляется в виде (K + 1) - й частичной суммы смещенного ряда Чебышёва
K+1 1 (5) Y (xs + αH) ≈ ∑ ' ai*[Y] Ti*(α) , 0 ≤ α ≤ 1 , ai*[Y] = 2/π ∫ Y(xs + αH) Ti* (α) / √ (α (1 - α) ) dα , i=0 0 а его производная - в виде частичной суммы K-го порядка K 1 (6) Y' (xs + αH) ≈ ∑ ' ai*[Y ' ] Ti*(α) , 0 ≤ α ≤ 1 , ai*[Y ' ] = 2/π ∫ Y ' (xs + αH) Ti* (α) / √ (α (1 - α) ) dα . i=0 0
В этом случае аналитическое решение задачи (1),(2) состоит из совокупности частичных сумм рядов Чебышёва, построенных на этих элементарных сегментах. Порядок этих частичных сумм и длина элементарных сегментов задаются пользователем при обращении к подпрограмме. Число NX элементарных сегментов, на которые разбивается промежуток интегрирования, равно [(XK-XN) / H], если длина промежутка интегрирования является целым кратным H. Если длина интервала интегрирования не является целым кратным H, то число элементарных сегментов NX равно [(XK-XN) / H] + 1; в этом случае последний элементарный сегмент считается нестандартным (квадратные скобки означают целую часть числа).
При разбиении промежутка интегрирования на элементарные сегменты решение задачи сводится к определению нескольких наборов коэффициентов ai*[Y], i = 0, 1, ... , K + 1. Коэффициенты ai*[Y] ряда Чебышёва для решения на сегменте [xs, xs + H] выражаются через коэффициенты ai*[Φ] ряда Чебышёва его производной Φ(α) = F(xs + αH, Y(xs + αH)), 0 ≤ α ≤ 1, на [xs, xs + H], которые, в свою очередь, вычисляются приближенно итерационным способом, исходя из некоторого начального приближения. Вычисления выполняются с помощью квадратурной формулы Маркова на [xs, xs + H] с K + 1 узлом. При этом один из узлов квадратурной формулы совпадает с xs, а остальные K узлов лежат внутри интервала (xs, xs + H). Количество итераций, которое предписывается выполнить в этом итерационном процессе, одинаково для всех сегментов и задается при обращении к подпрограмме. Если при выбранном H ряды Чебышёва для Y(X) = Y(xs + αH), 0 ≤ α ≤ 1 , и его производной на элементарном сегменте [xs, xs + H] быстро сходятся, то для того, чтобы приближенное решение в конце одного такого сегмента имело максимальный порядок точности относительно H, необходимо выполнить не менее K итераций; при этом погрешность приближенного решения в конце элементарного сегмента является величиной порядка O(HK + 2) при H --> 0. Если H подобрано достаточно малым, то хорошая точность приближенного решения может быть получена и при меньшем числе итераций. Вообще, число итераций зависит от K и H. С увеличением H число итераций может также возрастать.
Начальное приближение коэффициентов ai*[Φ] ряда Чебышёва для производной на сегменте [xs, xs + H] может вычисляться двумя способами. В первом способе начальное приближение определяется только с использованием значения решения Y(X) в узле xs. При этом погрешность начального приближения для всех коэффициентов a0*[Φ], a1*[Φ], ..., aK*[Φ] является величиной O(H2) при H --> 0. Во втором способе начальное приближение определяется через коэффициенты ряда Чебышёва производной Φ(α) на предыдущем элементарном сегменте [xs - 1, xs]. В этом случае погрешности начального приближения для коэффициентов a0*[Φ], a1*[Φ], ... , aK*[Φ] имеют, соответственно, порядки O(H), O(H2), ..., O(HK + 1). Второй способ определения начального приближения в некоторых случаях может привести к более быстрой сходимости итерационного процесса и, тем самым, к меньшему числу выполняемых итераций. Второй способ может быть применен только начиная со второго элементарного сегмента [x0 + H, x0 + 2H]. На начальном элементарном сегменте [x0, x0 + H] всегда применяется исключительно первый способ. Способ выбора начального приближения задается пользователем при обращении к подпрограмме.
В дальнейшем при описании параметров подпрограммы коэффициенты ряда Чебышёва будем называть коэффициентами Чебышёва.
О.Б.Арушанян, С.Ф.Залеткин. Приближенное решение задачи Коши для обыкновенных дифференциальных уравнений методом рядов Чебышёва. Вычислительные методы и программирование: Новые вычислительные технологии (Электронный научный журнал) (17), 121 - 131, 2016.
О.Б.Арушанян, С.Ф.Залеткин. Использование рядов Чебышёва для приближенного аналитического решения обыкновенных дифференциальных уравнений. Вестник Московского университета. Серия 1: Математика. Механика. 5, 52 - 56, 2016.
О.Б.Арушанян, Н.И.Волченскова, С.Ф.Залеткин. Вычисление коэффициентов разложения решения задачи Коши в ряд по многочленам Чебышёва. Вестник Московского университета. Серия 1: Математика. Механика. 5, 24 - 30, 2012.
int de55d_c (U_fp f, int *m, double *xn, double *yn, double *xk, int *k, int *iniapr, int *imax, int *iordy, double *h, double *y, int *nx, double *xs, double *ay, double *ady, double *rab)
Параметры
f - |
имя функции вычисления значений правой
части дифференциального уравнения. Первый
оператор функции должен иметь вид: int f (double *x, double *y, double *dy, int *m) Здесь: x, y - значения независимой и зависимой переменных, соответственно. Вычисленное значение правой части должно быть помещено в dy. В случае системы уравнений, т.е. когда m ≠ 1 , параметры y и dy представляют массивы длины m (тип параметров x, y и dy: с двойной точностью); |
m - | количество уравнений в системе (тип: целый); |
xn, yn - | начальные значения аргумента и решения; в случае системы уравнений (т.е. когда m ≠ 1) yn представляет массив длины m (тип: с двойной точностью); |
xk - | конец интервала интегрирования. На отрезке [xn, xk] вычисляется приближенное аналитическое решение задачи Коши в виде одной частичной суммы ряда Чебышёва либо в виде совокупности частичных сумм. xk может быть больше, меньше или равно xn (тип: с двойной точностью); |
k - | порядок частичной суммы смещенного ряда Чебышёва, с помощью которой аппроксимируется производная решения задачи Коши на каждом элементарном сегменте разбиения интервала интегрирования; при этом само решение задачи Коши приближается на каждом элементарном сегменте частичной суммой (k + 1) - го порядка; k≥2 (см. "Математическое описание" и "Замечания по использованию"; тип: целый); |
iniapr - |
целый указатель способа выбора начального
приближения коэффициентов Чебышёва для производной
решения на каждом элементарном сегменте: |
iniapr=1 - |
для первого способа, когда начальное
приближение определяется только с
использованием значения решения в
начале каждого элементарного сегмента; |
iniapr=2 - | для второго способа, когда начальное приближение коэффициентов Чебышёва на текущем элементарном сегменте (начиная со второго) определяется через коэффициенты Чебышёва, вычисленные на предыдущем элементарном сегменте, т.е. путем экстраполяции коэффициентов с предыдущего сегмента на следующий (см. "Математическое описание"); |
imax - | целая переменная, задающая количество итераций, которое предполагается выполнить в итерационном процессе вычисления коэффициентов Чебышёва для производной решения задачи Коши на каждом элементарном сегменте, исходя из некоторого начального приближения, способ определения которого задается параметром iniapr; imax≥1. Для получения максимального порядка точности приближенного решения необходимо выполнить не менее k итераций (см. "Математическое описание" и "Замечания по использованию"); |
iordy - | целая переменная, принимающая следующие значения: |
iordy=0 - |
если требуется получить приближенное аналитическое представление в виде
частичной суммы ряда Чебышёва только для решения задачи Коши; в этом
случае вычисляются коэффициенты разложения только для решения задачи
Коши; |
iordy=1 - | если требуется получить аналитическое представление в виде частичной суммы как для решения задачи Коши, так и для его производной; в этом случае вычисляются коэффициенты разложения для решения и его производной; |
для решения Y(X) на каждом элементарном сегменте строится частичная сумма (k+1)-го порядка, а для его производной Y'(X) - частичная сумма k-го порядка; |
h - | переменная с двойной точностью, содержащая значение длины элементарных сегментов, на которые разбивается интервал интегрирования (диаметр разбиения промежутка интегрирования или аналог шага интегрирования для одношаговых методов). Предполагается, что на каждом элементарном сегменте ряды Чебышёва для решения и его производной являются быстросходящимися рядами. Может задаваться с учетом направления интегрирования, т.е. положительным, если xk > xn, отрицательным, если xk < xn , или без такого учета в виде абсолютной величины; |
y - | на выходе из функции содержит значение решения задачи Коши, вычисленное функцией при значении аргумента xk. Для системы уравнений (когда m ≠ 1) задается массивом длины m. В случае совпадения значений параметров xn и xk значение y полагается равным начальному значению yn (тип: с двойной точностью); |
nx - | целая переменная; на выходе из функции содержит число элементарных сегментов, на которые разбивается интервал интегрирования [xn, xk] (см. "Математическое описание"); |
xs - | одномерный массив длиной nx + 1. На выходе из функции содержит точки x0 = xn, xs = x0 + s*h, s = 1, ... , nx - 1, xnx = xk, задающие разбиение интервала [xn, xk] интегрирования и являющиеся границами элементарных сегментов. При этом xs(s + 1) = x0 + s*h, s=0,1, ... , nx - 1, xs(nx + 1) = xk. Если xn < xk, то h > 0 и в массиве xs точки деления располагаются в порядке возрастания. Если xk < xn, то при работе функции значение h будет выбрано отрицательным; в этом случае нумерация точек разбиения интервала интегрирования ведется справа налево и в массиве xs точки деления будут расположены в порядке убывания: xs(1) = xn, xs(s+1) = x0 - s*|h|, s=1, ... , nx - 1, xs(nx + 1) = xk (тип: с двойной точностью); |
ay - |
двумерный массив с измерениями m, (k + 2) * nx. На выходе из
функции содержит коэффициенты Чебышёва для решения Y(X). При этом переменная с
индексом ay (n, (s - 1) * (k + 2) + i + 1)
содержит i-й коэффициент Чебышёва для N-й компоненты решения yN(X)
на s-м элементарном сегменте, i = 0, 1, ... , k + 1;
s = 1, 2, ... , nx. Массив представляет последовательность групп
столбцов по k + 2 столбца в каждой группе; число групп равно nx, а длина всех
столбцов одинакова и равна m. Номер группы - это номер элементарного сегмента, на которые
разбивается интервал интегрирования, а номер столбца в каждой группе (уменьшенный на
единицу) - это номер коэффициента Чебышёва для решения y(x) на элементарном сегменте,
соответствующем этой группе. Заметим, что удобно передавать функции de55d_c в качестве
фактического параметра, соответствующего данному формальному параметру ay,
массив, описываемый в вызывающей программной единице как трехмерный массив by с
измерениями m, k + 2, nx. При этом переменная с индексом by (n, i + 1, s)
будет содержать i-й коэффициент Чебышёва N-й компоненты решения yN(X)
на s-м элементарном сегменте [xs-1, xs]. Другими словами, индексы этого
массива (индексные выражения n, i+ 1, s) имеют следующие значения: n - номер компоненты решения, n = 1, 2, ... , m; i - номер коэффициента Чебышёва, i = 0, 1, ... , k + 1; s - номер элементарного сегмента, s = 1, 2, ... , nx. Если интегрируется одно скалярное уравнение (т.е. m = 1), то первое измерение массива by равно 1 и в описании массива его можно опустить. В этом случае переменная с индексом, служащая для обращения к элементам массива by, имеет вид by (i + 1, s) и представляет i-й коэффициент Чебышёва решения Y(X) на s-м элементарном сегменте [xs-1, xs]. Если интервал интегрирования [xn, xk] не разбивается на элементарные сегменты (т.е. h = xk - xn), то третье измерение массива by равно 1 и в описании массива его можно опустить. В этом случае переменная с индексом, служащая для обращения к элементам массива by, имеет вид by (n, i + 1) и представляет i-й коэффициент Чебышёва для N-й компоненты решения yN(X) на сегменте [xn, xk]. Если интегрируется одно скалярное уравнение и интервал интегрирования [xn, xk] не разбивается на элементарные сегменты (т.е. m = 1 и h = xk - xn), то одновременно первое и третье измерения массива by равны 1 и эти измерения в описании массива можно опустить. В этом случае переменная с индексом, служащая для обращения к элементам массива by, имеет вид by (i + 1) и представляет i-й коэффициент Чебышёва решения Y(X) на [xn, xk] (см. "Математическое описание", "Замечания по использованию" и "Примеры использования"; тип: с двойной точностью); |
ady - |
двумерный массив с измерениями m, (k + 1) * nx. На выходе из функции содержит коэффициенты
Чебышёва для производной решения Y'(X). При этом переменная с индексом
ady (n, (s - 1) * (k + 1) + i + 1)
содержит i-й коэффициент Чебышёва для n-й компоненты производной решения y'N(X) на s-м
элементарном сегменте, i = 0, 1, ... , k; s = 1, 2, ... , nx.
Массив представляет последовательность групп столбцов по k + 1 столбцу в каждой группе; число
групп равно nx, а длина всех столбцов одинакова и равна m. Номер группы - это номер элементарного сегмента, на
которые разбивается интервал интегрирования, а номер столбца в каждой группе (уменьшенный на единицу) - это
номер коэффициента Чебышёва для производной решения Y'(X) на элементарном сегменте, соответствующем этой
группе. Как и для формального параметра ay, удобно передавать функции de55d_c в качестве фактического
параметра, соответствующего данному формальному параметру ady, массив, описываемый в вызывающей
программной единице, как трехмерный bdy с измерениями m, k + 1, nx. При этом
переменная с индексом bdy (n, i + 1, s) будет содержать i-й коэффициент Чебышёва
N-й компоненты производной решения y'N(X) на s-м элементарном сегменте [xs-1, xs].
Другими словами, индексы этого массива (индексные выражения n, i + 1, s) имеют следующие значения: n - номер компоненты производной решения, n = 1, 2, ... , m; i - номер коэффициента Чебышёва, i = 0, 1, ... , k; s - номер элементарного сегмента, s = 1, 2, ... , nx. Если при обращении к функции параметр iordy принимает нулевое значение (iordy = 0), т.е. когда требуется получить аналитическое представление для решения Y(X) и не требуется аналитическое решение для производной Y'(X), то массив ady, представляющий собой массив переменной длины, является рабочим массивом и может иметь размер m * (k + 1). Обращение с массивом bdy при интегрировании скалярных уравнений (m = 1) или при интегрировании уравнений без разбиения интервала интегрирования на элементарные сегменты (h = xk - xn) полностью аналогично обращению с массивом by (соответствующим формальному параметру ay) и изложено в описании параметра ay (см. "Математическое описание", "Замечания по использованию" и "Примеры использования"; тип: с двойной точностью); |
rab - | одномерный рабочий массив длины 2 * k2 + 7 * k + 3 * m * k + 5 * m + 1. (тип: с удвоенной точностью). |
Версии: нет
Вызываемые подпрограммы
de44d_c - | выполнение одного шага приближенного интегрирования системы обыкновенных дифференциальных уравнений первого порядка методом рядов Чебышёва |
Кроме того, используются рабочие функции de70dk_c, de70dh_c, de70d0_c, de70di_c, de70df_c, de70dq_c, de71de_c, de70dp_c, de71dt_c, de71dp_c, de71di_c, de71df_c, de71ds_c, de70da_c, de70dc_c. |
Замечания по использованию
Разбиение промежутка интегрирования на элементарные сегменты (шаги) выполняется для того, чтобы на каждом таком сегменте ряды Чебышёва для решения и его производной были быстросходящимися рядами. Другими словами, длина элементарных сегментов, задаваемая параметром h, подбирается таким образом, чтобы убывание коэффициентов этих рядов Чебышёва на элементарном сегменте происходило достаточно быстро, вследствие чего можно было бы считать частичные суммы этих рядов близкими к многочленам наилучшего равномерного приближения на элементарном сегменте для решения и его производной. Порядок этих частичных сумм задается параметром k. Если начальное приближение для коэффициентов Чебышёва функции Φ(α) определяется первым способом (т.е. при iniapr = 1), то для получения максимального порядка точности приближенного решения в конце элементарного сегмента необходимо выполнить в итерационном процессе не менее k итераций; тогда imax≥k. Если начальное приближение коэффициентов Чебышёва функции Φ(α) определяется вторым способом (т.е. при iniapr = 2), то для получения максимального порядка точности приближенного решения необходимо выполнить в итерационном процессе не менее k + 1 итераций; в этом случае imax≥k + 1. Однако в некоторых случаях при втором способе определения начального приближения итерационный процесс может сойтись за значительно меньшее число итераций. Если диаметр разбиения h подобран достаточно малым, то хорошая точность приближенного решения может быть получена и с существенно меньшим числом итераций при любом способе выбора начального приближения. Вообще, число итераций зависит от k и h. С увеличением h число итераций может также возрастать. Если правая часть дифференциального уравнения не зависит от переменной Y, т.е. дифференциальное уравнение имеет вид Y'= F(X), то число итераций можно положить равным 1 при любых h и k, удовлетворяющих описанным выше условиям. В этом случае параметр imax = 1. Как следует из вышеописанного, управлять точностью приближенного решения задачи Коши можно с помощью четырех параметров h, k, imax, iniapr, подбирая для каждой конкретной задачи наиболее подходящий набор их значений. Для вычисления решения при заданном значении аргумента X∈ [xn, xk] необходимо найти такой элементарный сегмент [xS-1, xS], чтобы X ∈ [xS-1, xS], и определить нормализованный аргумент α по формуле α = (X - xS-1) / H = (X - xS-1) / (xS - xS-1). Далее, зная α и S и пользуясь соответствующим набором коэффициентов из массива BY, найти значение решения Y(X) по формуле: K+1 Y(X) = (y1(X), ... , yM(X)), yN(X) = yN (xS-1 + αH) = ∑ ' BY (N, I + 1, S) * TI*(α), I=0 N = 1, 2, ... , M. Аналогично можно вычислить производную решения Y'(X) = F (X, Y(X)): K Y'(X) = (y'1(X), ... , y'M(X)), y'N(X) = y'N (xS-1 + αH) = ∑ ' BDY (N, I + 1, S) * TI*(α), I=0 N = 1, 2, ... , M. При работе функции значения параметров m, xn, yn, xk, k, iniapr, imax, iordy сохраняются. Значение параметра h сохраняется, если он задан с учетом направления интегрирования, иначе его знак меняется на противоположный. Если после работы функции нет необходимости иметь начальное значение решения, то параметры yn и y при обращении к ней можно совместить. При интегрировании системы уравнений с помощью функции de55d_c используется внешняя структура, элементы которой нельзя портить: struct { double wc1, wc2, wc3; double hd2, hd4, hold; int lasn; }com70d_; |
Вычисления во всех шести примерах на Си проводились с 15-16 значащими цифрами.
1) Решается задача Коши
y'1 = -2q (y2-1) + (1 -e1-y1+cos q(2x-1) ) / (x+1), y1(0) = 1+ cos q, 0 ≤ x ≤ xf, xf = 1,
y'2 = 2q (y1-1) + ( 1 -e1-y2+sin q(2x-1) ) / (x+1), y2(0) = 1- sin q, q = 0,5.
Точное решение системы
y1(x) = 1 + cos q(2x - 1), y2(x) = 1 + sin q(2x - 1).
Функции y1(x), y2(x) разлагаются на отрезке [0, 1] в смещенные ряды Чебышёва, коэффициенты которых выражаются через цилиндрические функции:
∞ (7) y1(x) = 1 + J0 (q) + 2 ∑ (-1)i J2i (q) T2i* (x), i=1 ∞ (8) y2(x) = 1 + 2 ∑ (-1)i J2i+1 (q) T2i+1* (x). i=0
Интервал интегрирования не разбивается на элементарные сегменты, поэтому параметр h полагается равным 1. Вычисляются коэффициенты Чебышёва обеих компонент решения системы y1(x), y2(x) и коэффициенты Чебышёва их производных y'1(x), y'2(x) на отрезке [0, 1]. Определяется также решение y системы в конце интервала интегрирования xf. Приводятся функции вычисления значений правой части системы и фрагмент вызывающей программы, а также результаты счета, включая точное значение yt решения в точке xf, абсолютную погрешность dely приближенного решения y, вычисленного в точке xf, значения параметров h, k, iniapr, imax, iordy, nx и xs. Даются также точные значения коэффициентов Чебышёва для компонент решения y1(x), y2(x) в (7), (8) и абсолютные погрешности их приближенных значений, вычисленных программой de55d_c.
int main(void) { /* Builtin functions */ double cos(double), sin(double); /* Local variables */ extern int f_c(); static double h__; static int k, m, n; static double q, y[2], h0, ay[26] /* was [2][13] */, xk, xn, yn[2]; static int nx; static double xs[5], yt[2]; static double rab[396], ady[24] /* was [2][12] */; extern int de55d_c( ); static double dely[2]; static int imax, iordy, iniapr; m = 2; q = .5; xn = 0.f; yn[0] = cos(q) + 1.; yn[1] = -sin(q) + 1.; xk = 1.; iordy = 1; h0 = 1.; yt[0] = cos(q * (xk * 2. - 1.)) + 1.; yt[1] = sin(q * (xk * 2. - 1.)) + 1.; k = 11; imax = 16; iniapr = 1; h__ = h0; de55d_c((U_fp)f_c, &m, &xn, yn, &xk, &k, &iniapr, &imax, &iordy, &h__, y, &nx, xs, ay, ady, rab); dely[0] = yt[0] - y[0]; dely[1] = yt[1] - y[1]; /* Операторы вывода на печать: nx, xs, h0, k, iniapr, imax, iordy, y, yt, dely, ay, ady */ . . . . . . . . . . . . . . . . . . . . . . . . . . return 0; } /* main */ /*..........................................................................*/ int f_c(double *x, double *y, double *z__, int *m) { /* Builtin functions */ double cos(double), exp(double), sin(double); /* Local variables */ static double q, r__; /* Parameter adjustments */ --z__; --y; /* Function Body */ q = .5; r__ = *x * 2. - 1.; z__[1] = q * -2. * (y[2] - 1.) + (1. - exp(1. - y[1] + cos(q * r__))) / (*x + 1.); z__[2] = q * 2. * (y[1] - 1.) + (1. - exp(1. - y[2] + sin(q * r__))) / (*x + 1.); return 0; } /* f_c */ Результаты: -------------- nx= 1 xs[0]= 0.00000000000000e+000 xs[1]= 1.00000000000000e+000 h0= 1.00000000000000e+000 k= 11 iniapr= 1 imax= 16 iordy= 1 y[0]= 1.87758256189037e+000 y[1]=1.47942553860420e+000 yt[0]= 1.87758256189037e+000 y[1]= 1.47942553860420e+000 dely= 2.22044604925031e-016 0.00000000000000e+000 COEFFICIENTS AY AND ADY ON 1 SEGMENT Chebyshev coefficients for 1 component for Y for Y' ----------------------------------------------------------------- 0 3.87693961448163e+000 -8.09184127039189e-016 1 -6.03383919976601e-017 -4.84536915349749e-001 2 -6.12080469173653e-002 -5.67830559048549e-016 3 -2.09171962881292e-017 5.12745998917409e-003 4 3.21472952728558e-004 -3.16824203590999e-016 5 -2.00321597959748e-017 -1.61072544828346e-005 6 -6.72136925722845e-007 8.38189923284965e-017 7 -2.58599158796738e-018 2.40317345136563e-008 8 7.51644633159019e-010 1.56226756791583e-016 9 7.64287239784747e-018 -2.08937474323345e-011 10 -5.22637730246682e-013 -1.18916649530926e-016 11 -2.70265112570286e-018 1.17617775328288e-014 12 2.45037031933934e-016 Chebyshev coefficients for 2 component for Y for Y' ----------------------------------------------------------------- 0 2.00000000000000e+000 1.87693961448163e+000 1 4.84536915349748e-001 -2.27784100175626e-016 2 -6.03426271623964e-018 -6.12080469173658e-002 3 -5.12745998917450e-003 -1.79509998445709e-016 4 -9.05054704141220e-018 3.21472952728181e-004 5 1.61072544826871e-005 -3.47012457831142e-017 6 1.76993181215101e-017 -6.72136925560432e-007 7 -2.40317346609178e-008 -4.59484880699357e-016 8 1.65929519202381e-017 7.51644945266308e-010 9 2.08935515158725e-011 -9.90459342146977e-016 10 -2.09977773558447e-017 -5.22909305103198e-013 11 -1.18843023887090e-014 -1.50548247913190e-016 12 -3.13642183152480e-018
2) Решается задача Коши из примера 1 с разбиением интервала интегрирования [0, 1] на два элементарных сегмента длиной h = 0,5. Так как значение h здесь уменьшено по сравнению с примером 1, то и число итераций imax также уменьшается. Приводятся фрагмент вызывающей программы и результаты счета, включающие те же данные, что и в примере 1, а именно: значения параметров nx, xs, h, k, iniapr, imax, iordy, точное значение yt решения в точке xf, абсолютную погрешность dely приближенного решения y, вычисленного подпрограммой de55d_c в точке xf. Далее для каждого из двух элементарных сегментов приводятся коэффициенты Чебышёва для обеих компонент решения y1(x), y2(x) и коэффициенты Чебышёва для их производных y'1(x), y'2(x). Все перечисленные данные приводятся при двух способах определения начального приближения коэффициентов Чебышёва производной решения, т.е. при iniapr = 1 и при iniapr = 2.
int main(void) { /* Builtin functions */ double cos(double), sin(double); /* Local variables */ extern int f_c(); static double h__; static int i__, j, k, l, m; static double q, y[2], h0, ay[52] /* was [2][13][2] */, xk, xn, yn[2]; static int nx; static double xs[5], yt[2]; static int kp1, kp2; static double rab[396], ady[48] /* was [2][12][2] */; static int nxp1; extern int de55d_c( ); static double dely[2]; static int imax, iordy, iniap0, iniapr; int i__1, i__2, i__3, i__4; m = 2; q = .5; xn = 0.f; yn[0] = cos(q) + 1.; yn[1] = -sin(q) + 1.; xk = 1.; iordy = 1; h0 = .5; yt[0] = cos(q * (xk * 2. - 1.)) + 1.; yt[1] = sin(q * (xk * 2. - 1.)) + 1.; k = 11; imax = 13; for (iniap0 = 1; iniap0 <= 2; ++iniap0) { iniapr = iniap0; h__ = h0; de55d_c((U_fp)f_c, &m, &xn, yn, &xk, &k, &iniapr, &imax, &iordy, &h__, y, &nx, xs, ay, ady, rab); dely[0] = yt[0] - y[0]; dely[1] = yt[1] - y[1]; nxp1 = nx + 1; /* Операторы вывода на печать: nx, xs, h0, k, iniapr, imax, iordy, y, yt, dely, ay, ady */ . . . . . . . . . . . . . . . . . . . . . . . . . . return 0; } /* main */ /*..........................................................................*/ int f_c(double *x, double *y, double *z__, int *m) { /* Builtin functions */ double cos(double), exp(double), sin(double); /* Local variables */ static double q, r__; /* Parameter adjustments */ --z__; --y; /* Function Body */ q = .5; r__ = *x * 2. - 1.; z__[1] = q * -2. * (y[2] - 1.) + (1. - exp(1. - y[1] + cos(q * r__))) / (*x + 1.); z__[2] = q * 2. * (y[1] - 1.) + (1. - exp(1. - y[2] + sin(q * r__))) / (*x + 1.); return 0; } /* f_c */ Результаты: -------------- nx= 2 xs= 0.00000000000000e+000 5.00000000000000e-001 1.00000000000000e+000 h0=5.00000000000000e-001 k= 11 iniapr= 1 imax= 13 iordy= 1 y[0]= 1.87758256189037e+000 y[1]=1.47942553860420e+000 yt[0]= 1.87758256189037e+000 y[1]= 1.47942553860420e+000 dely= 0.00000000000000e+000 0.00000000000000e+000 COEFFICIENTS AY AND ADY ON 1 SEGMENT Chebyshev coefficients for Y for Y' FOR 1 COMPONENT 0 3.90766440054603e+000 4.87106693080399e-001 1 6.13690356801086e-002 -2.40340620085586e-001 2 -1.50605601386582e-002 -3.84559236046984e-003 3 -1.60442087410513e-004 6.28342132945954e-004 4 1.96510520421465e-005 5.01773738245725e-006 5 1.25508828074456e-007 -4.91532402733373e-007 6 -1.02440704881216e-008 -2.61574052097324e-009 7 -4.67226947263059e-011 1.82980696465326e-010 8 2.85969964497412e-012 7.30383699891089e-013 9 1.01480150204011e-014 -4.00808130174984e-014 10 -5.00565809234601e-016 -2.73381577792220e-016 11 -3.10660883854795e-018 -3.55482787303685e-017 12 -3.70294570108005e-019 FOR 2 COMPONENT 0 1.51289330691960e+000 1.90766440054603e+000 1 2.40340620085586e-001 6.13690356801088e-002 2 3.84559236046995e-003 -1.50605601386584e-002 3 -6.28342132945851e-004 -1.60442087410362e-004 4 -5.01773738245519e-006 1.96510520420718e-005 5 4.91532402808844e-007 1.25508828203872e-007 6 2.61574065406908e-009 -1.02440702819581e-008 7 -1.82980898893858e-010 -4.67231914440323e-011 8 -7.30192778241261e-013 2.86005609793178e-012 9 3.97340507167311e-014 9.14636340840561e-015 10 1.12470474692436e-016 -7.95553672851973e-016 11 -9.04038264604515e-018 1.48725433010699e-016 12 1.54922326052812e-018 COEFFICIENTS AY AND ADY ON 2 SEGMENT Chebyshev coefficients for Y for Y' FOR 1 COMPONENT 0 3.90766440054603e+000 -4.87106693080399e-001 1 -6.13690356801086e-002 -2.40340620085586e-001 2 -1.50605601386582e-002 3.84559236046996e-003 3 1.60442087410518e-004 6.28342132945810e-004 4 1.96510520421438e-005 -5.01773738247782e-006 5 -1.25508828079410e-007 -4.91532402791218e-007 6 -1.02440704953297e-008 2.61574069858536e-009 7 4.67226941925040e-011 1.82980984607816e-010 8 2.85969623678284e-012 -7.30176194864496e-013 9 -1.01429241017564e-014 -3.95745462861571e-014 10 -4.94180644706201e-016 1.14340461964586e-016 11 1.29932343141575e-018 -4.00947096609962e-017 12 -4.17653225635377e-019 FOR 2 COMPONENT 0 2.48710669308040e+000 1.90766440054603e+000 1 2.40340620085586e-001 -6.13690356801084e-002 2 -3.84559236046994e-003 -1.50605601386584e-002 3 -6.28342132945852e-004 1.60442087410646e-004 4 5.01773738245700e-006 1.96510520420564e-005 5 4.91532402806672e-007 -1.25508827977917e-007 6 -2.61574062872712e-009 -1.02440702104685e-008 7 -1.82980898204373e-010 4.67222009846902e-011 8 7.30209069543573e-013 2.86008897636266e-012 9 3.97349893233514e-014 -1.11794660985140e-014 10 -1.40950094071378e-016 -8.30254918635087e-016 11 -9.43471498448963e-018 9.65414271962561e-017 12 1.00563986662767e-018 nx= 2 xs= 0.00000000000000e+000 5.00000000000000e-001 1.00000000000000e+000 h0=5.00000000000000e-001 k= 11 iniapr= 2 imax= 13 iordy= 1 y[0]= 1.87758256189037e+000 y[1]=1.47942553860420e+000 yt[0]=1.87758256189037e+000 y[1]= 1.47942553860420e+000 dely= 0.00000000000000e+000 0.00000000000000e+000 COEFFICIENTS AY AND ADY ON 1 SEGMENT Chebyshev coefficients for Y for Y' FOR 1 COMPONENT 0 3.90766440054603e+000 4.87106693080399e-001 1 6.13690356801086e-002 -2.40340620085586e-001 2 -1.50605601386582e-002 -3.84559236046984e-003 3 -1.60442087410513e-004 6.28342132945954e-004 4 1.96510520421465e-005 5.01773738245725e-006 5 1.25508828074456e-007 -4.91532402733373e-007 6 -1.02440704881216e-008 -2.61574052097324e-009 7 -4.67226947263059e-011 1.82980696465326e-010 8 2.85969964497412e-012 7.30383699891089e-013 9 1.01480150204011e-014 -4.00808130174984e-014 10 -5.00565809234601e-016 -2.73381577792220e-016 11 -3.10660883854795e-018 -3.55482787303685e-017 12 -3.70294570108005e-019 FOR 2 COMPONENT 0 1.51289330691960e+000 1.90766440054603e+000 1 2.40340620085586e-001 6.13690356801088e-002 2 3.84559236046995e-003 -1.50605601386584e-002 3 -6.28342132945851e-004 -1.60442087410362e-004 4 -5.01773738245519e-006 1.96510520420718e-005 5 4.91532402808844e-007 1.25508828203872e-007 6 2.61574065406908e-009 -1.02440702819581e-008 7 -1.82980898893858e-010 -4.67231914440323e-011 8 -7.30192778241261e-013 2.86005609793178e-012 9 3.97340507167311e-014 9.14636340840561e-015 10 1.12470474692436e-016 -7.95553672851973e-016 11 -9.04038264604515e-018 1.48725433010699e-016 12 1.54922326052812e-018 COEFFICIENTS AY AND ADY ON 2 SEGMENT Chebyshev coefficients for Y for Y' FOR 1 COMPONENT 0 3.90766440054603e+000 -4.87106693080399e-001 1 -6.13690356801086e-002 -2.40340620085586e-001 2 -1.50605601386582e-002 3.84559236046991e-003 3 1.60442087410517e-004 6.28342132945817e-004 4 1.96510520421444e-005 -5.01773738250524e-006 5 -1.25508828079679e-007 -4.91532402802669e-007 6 -1.02440704950977e-008 2.61574068191242e-009 7 4.67226936695002e-011 1.82980962021866e-010 8 2.85969642735029e-012 -7.30163579597710e-013 9 -1.01431737831314e-014 -3.96093285524830e-014 10 -4.94137214012519e-016 1.44932787748089e-016 11 1.64696349713737e-018 -7.83514314814895e-017 12 -8.16160744598849e-019 FOR 2 COMPONENT 0 2.48710669308040e+000 1.90766440054603e+000 1 2.40340620085586e-001 -6.13690356801084e-002 2 -3.84559236046994e-003 -1.50605601386584e-002 3 -6.28342132945851e-004 1.60442087410608e-004 4 5.01773738245640e-006 1.96510520420275e-005 5 4.91532402806431e-007 -1.25508827997223e-007 6 -2.61574062872712e-009 -1.02440702297741e-008 7 -1.82980898031941e-010 4.67221816791152e-011 8 7.30208767893965e-013 2.86006001461213e-012 9 3.97348552098014e-014 -1.11794660985140e-014 10 -1.41191413758051e-016 -8.49560493568907e-016 11 -9.65409651782849e-018 1.15847002130076e-016 12 1.20673960552163e-018 ---------------------------------------------------------------------
3) Решается задача Коши
(9) y' = 2q / (1+tg2 y), y(0) = - arctg q, 0 ≤ x ≤ xf, xf = 1, q = 1 / 16.
Точное решение задачи y(x) = arctg (q (2x -1)) = arctg (x / 8 - 1 /16) раскладывается на отрезке [0, 1] в смещенный ряд Чебышёва
∞ (10) y(x) = arctg (q (2x - 1)) = 2 ∑ (-1)i (p2i+1) / (2i+1) T*2i+1 (x), p = (√(1+q2) - 1) / q, q ≠ 0. i=0
Интервал интегрирования не разбивается на элементарные сегменты, поэтому параметр h полагается равным 1. Вычисляются коэффициенты Чебышёва решения y(x) и коэффициенты Чебышёва его производной y'(x) на отрезке [0, 1]. Определяется также решение y задачи в конце интервала интегрирования xf. Приводятся функция вычисления значений правой части и фрагмент вызывающей функции, а также результаты счета, включая точное значение yt решения в точке xf, абсолютную погрешность dely приближенного решения Y, вычисленного в точке xf, значения параметров nx, xs, h, k, iniapr, imax, iordy. Даются также точные значения коэффициентов Чебышёва решения y(x) в (10) и абсолютные погрешности их приближенных значений, вычисленных функцией de55d_c.
/* Common Block Declarations */ struct { double q; } blockq_; /*..........................................................................*/ int main(void) { /* Builtin functions */ double atan(double); /* Local variables */ extern int f_c(); static double h__; static int k, m; static double y, h0, ay[10], xk, xn, yn; static int nx; static double xs[2], yt; static double rab[214], ady[9]; static int n; extern int de55d_c( ); static double dely; static int imax, iordy, iniapr; blockq_1.q = .0625; m = 1; xn = 0.; yn = -atan(blockq_1.q); iordy = 1; h0 = 1.; xk = xn + h0; yt = atan(blockq_1.q); k = 8; imax = 5; iniapr = 1; h__ = h0; de55d_c((U_fp)f_c, &m, &xn, &yn, &xk, &k, &iniapr, &imax, &iordy, &h__, &y, &nx, xs, ay, ady, rab); dely = yt - y; /* Операторы вывода на печать: nx, xs, h0, k, iniapr, imax, iordy, y, yt, dely, ay, ady */ . . . . . . . . . . . . . . . . . . . . . . . . . . return 0; } /* main */ /*..........................................................................*/ int f_c(double *x, double *y, double *z__, int *m) { /* System generated locals */ double d__1; /* Builtin functions */ double tan(double); /* Computing 2nd power */ d__1 = tan(*y); *z__ = blockq_1.q * 2. / (d__1 * d__1 + 1.); return 0; } /* f_c */ Результаты: -------------- nx= 1 xs[0]= 0.00000000000000e+000 xs[1]= 1.00000000000000e+000 h0= 1.00000000000000e+000 k= 8 iniapr= 1 imax= 5 iordy= 1 y = 6.24188099959573e-002 yt = 6.24188099959574e-002 dely = 2.08166817117217e-017 COEFFICIENTS ON 1 SEGMENT ay ady ---------------------------------------------------------------- 0 -1.22718133398203e-017 2.49513144620722e-001 1 6.24390837627947e-002 4.89923856691887e-018 2 -5.71429602041432e-018 -2.43190430456795e-004 3 -2.02856215326650e-005 5.06136067302335e-017 4 5.40825242865950e-018 2.37027935184547e-007 5 1.18629478386015e-008 -3.59184321283186e-017 6 -8.43553053562664e-018 -2.31021587481929e-010 7 -8.25881397582985e-012 1.66534300726721e-016 8 5.20419689771002e-018 2.25203841306646e-013 9 6.25566225851795e-015
4) Решается обыкновенное дифференциальное уравнение из примера 3, но начальное условие задается в точке XN = xf = 1:
(11) y' = 2q / (1+tg2y), y(1) = arctg q, q = 1 / 16,
а концом интервала интегрирования теперь является точка XK = 0. В силу указанных в (9) и (11) начальных условий решение задачи Коши (11) совпадает с решением задачи Коши (9); решением этих двух задач на [0, 1] является одна и та же функция
(12) y(x) = arctg (x / 8 - 1 / 16), 0 ≤ x ≤ 1.
Заметим, что коэффициенты Чебышёва функции y(x) = y(1 - α), x = 1 - α, на [0, 1] отличаются знаком от коэффициентов Чебышёва функции y(x) = y(α), x = α, на том же отрезке [0, 1] и равны им по абсолютной величине. Кроме того, функция y(x) = y(α), x = α, 0 ≤ α ≤ 1, (определяемая по формуле (12)) и функция y(x) = y(1 - α), x = 1 - α, 0 ≤ α ≤ 1, имеют одинаковые коэффициенты Чебышёва для производных (по x) этих функций на [0, 1]:
a*i {[y (1 - α)]'x=1-α} = a*i {[y (α)]'x=α}, i = 0, 1, ... .
В примере 4 интегрирование выполняется справа налево без разбиения интервала интегрирования [xn, xk] на элементарные сегменты, поэтому параметр h = - 1. При этом вычисляются коэффициенты Чебышёва функции y(x) = y(1 - α), x = 1 - α, на [0, 1] и коэффициенты Чебышёва ее производной y'(x). Определяется также решение y задачи (11) в конце интервала интегрирования xk. Приводятся фрагмент вызывающей программы и результаты счета, включая точное значение yt решения в точке xk = 0, абсолютную погрешность dely приближенного решения y, вычисленного в точке xk = 0, значения параметров nx, xs, h, k, iniapr, imax, iordy.
/* Common Block Declarations */ struct { double q; } blockq_; /*..........................................................................*/ int main(void) { /* Builtin functions */ double atan(double); /* Local variables */ extern int f_c(); static double h__; static int k, m; static double y, h0, ay[10], xk, xn, yn; static int nx, n; static double xs[2], yt; static double rab[214], ady[9]; extern int de55d_c( ); static double dely; static int imax, iordy, iniapr; blockq_1.q = .0625; m = 1; xn = 1.; yn = atan(blockq_1.q); iordy = 1; h0 = -1.; xk = xn + h0; yt = -atan(blockq_1.q); k = 8; imax = 5; iniapr = 1; h__ = h0; de55d_c((U_fp)f_c, &m, &xn, &yn, &xk, &k, &iniapr, &imax, &iordy, &h__, &y, &nx, xs, ay, ady, rab); dely = yt - y; /* Операторы вывода на печать: nx, xs, h0, k, iniapr, imax, iordy, y, yt, dely, ay, ady */ . . . . . . . . . . . . . . . . . . . . . . . . . . return 0; } /* main */ /*..........................................................................*/ int f_c(double *x, double *y, double *z__, int *m) { /* System generated locals */ double d__1; /* Builtin functions */ double tan(double); /* Computing 2nd power */ d__1 = tan(*y); *z__ = blockq_1.q * 2. / (d__1 * d__1 + 1.); return 0; } /* f_c */ Результаты: -------------- nx= 1 xs[0]= 1.00000000000000e+000 xs[1]= 0.00000000000000e+000 h0= -1.00000000000000e+000 k= 8 iniapr= 1 imax= 5 iordy= 1 y = -6.24188099959573e-002 yt = -6.24188099959574e-002 dely = -2.08166817117217e-017 COEFFICIENTS ON 1 SEGMENT ay ady ---------------------------------------------------------------- 0 1.22718133398203e-017 2.49513144620722e-001 1 -6.24390837627947e-002 4.89923856691887e-018 2 5.71429602041432e-018 -2.43190430456795e-004 3 2.02856215326650e-005 5.06136067302335e-017 4 -5.40825242865950e-018 2.37027935184547e-007 5 -1.18629478386015e-008 -3.59184321283186e-017 6 8.43553053562664e-018 -2.31021587481929e-010 7 8.25881397582985e-012 1.66534300726721e-016 8 -5.20419689771002e-018 2.25203841306646e-013 9 -6.25566225851795e-015
Из приведенных результатов видно, что на выходе из функции de55d_c в массиве xs точки xn, xk располагаются в порядке убывания. Вычисленные подпрограммой коэффициенты Чебышёва функции y(x) = y(1 - α), x = 1 - α, на [0, 1] отличаются знаком (как и должно быть) от коэффициентов Чебышёва функции y(x) из примера 3, а коэффициенты Чебышёва производной функции y'(x) совпадают с коэффициентами Чебышёва производной функции y'(x) из примера 3 (как и должно быть).
5) Решается задача Коши
(13) y'(x) = 192x2 - 176x + 24, y(0) = 8, 0 ≤ x ≤ 1.
Точное решение задачи y(x) = 64x3 - 88x2 +24x + 8 = 7 - 2T*1(x) + T*2(x) + 2T*3(x). Интервал интегрирования не разбивается на элементарные сегменты, поэтому параметр h полагается равным 1. Вычисляются коэффициенты Чебышёва решения y(x) и коэффициенты Чебышёва его производной y'(x) = 8 + 8T*1(x) + 24T*2(x) на [0, 1]. Приводятся функция вычисления значений правой части, фрагмент вызывающей программы и результаты счета, аналогичные результатам из примеров 1-4. Поскольку правая часть дифференциального уравнения не зависит от y, то параметр imax можно положить равным 1.
int main(void) { /* Local variables */ extern int f_c(); static double h__; static int k, m; static double y, h0, ay[4], xk, xn, yn; static int nx, n; static double xs[2], yt; static double rab[34], ady[3]; extern int de55d_c( ); static double dely; static int imax, iordy, iniapr; m = 1; xn = 0.; yn = 8.; iordy = 1; h0 = 1.; xk = xn + h0; yt = 8.; k = 2; imax = 1; iniapr = 1; h__ = h0; de55d_c((U_fp)f_c, &m, &xn, &yn, &xk, &k, &iniapr, &imax, &iordy, &h__, &y, &nx, xs, ay, ady, rab); dely = yt - y; /* Операторы вывода на печать: nx, xs, h0, k, iniapr, imax, iordy, y, yt, dely, ay, ady */ . . . . . . . . . . . . . . . . . . . . . . . . . . return 0; } /* main */ /*..........................................................................*/ int f_c(double *x, double *y, double *z__, int *m) { *z__ = *x * 192. * *x - *x * 176. + 24.; return 0; } /* f_c */ Результаты: -------------- nx= 1 xs[0]= 0.00000000000000e+000 xs[1]= 1.00000000000000e+000 h0= 1.00000000000000e+000 k= 2 iniapr= 1 imax= 1 iordy= 1 y = 8.00000000000000e+000 yt= 8.00000000000000e+000 dely = 8.88178419700125e-016 COEFFICIENTS ON 1 SEGMENT Chebyshev coefficients for Y for Y' ----------------------------------------------------------------- 0 1.40000000000000e+001 1.60000000000000e+001 1 -2.00000000000000e+000 8.00000000000000e+000 2 1.00000000000000e+000 2.40000000000000e+001 3 2.00000000000000e+000
6) Решается обыкновенное дифференциальное уравнение из примера 5, но начальное условие задается в точке XN = 1:
(14) y'(x) = 192x2 - 176x + 24, y(1) = 8, 0 ≤ x ≤ 1,
а концом интервала интегрирования является точка XK = 0. В силу указанных в (13) и (14) начальных условий решение задачи Коши (14) совпадает с решением задачи Коши (13); решением этих двух задач является одна и та же функция
y(x) = 7 - 2T*1(x) + T*2(x) + 2T*3(x), y'(x) = 8 + 8T*1(x) + 24T*2(x).
Так как T*i (1-α) = - T*i (α), если i - нечетное, и T*i (1-α) = T*i (α), если i - четное (0 ≤ α ≤ 1), то коэффициенты Чебышёва функции y(x) = y(1 - α), x = 1 - α, легко получаются из коэффициентов Чебышёва функции y(x) = y(α), x = α, на [0, 1], а коэффициенты Чебышёва ее производной (по x) y'(x) = y'x=1-α(1 - α) легко получаются из коэффициентов Чебышёва производной функции y(x) = y(α), x = α, 0 ≤ α ≤ 1:
(15) y(x) = y(1-α) = 7 + 2T*1(α) + T*2(α) - 2T*3(α),
(16) y'(x) = y'(1 - α) = 8 - 8T*1(α) + 24T*2(α).
В примере 6 интегрирование выполняется справа налево без разбиения интервала интегрирования [xn, xk] на элементарные сегменты, поэтому параметр h = - 1. При этом вычисляются коэффициенты Чебышёва функции y(x) = y(1 - α), x = 1 - α, на [0, 1] и коэффициенты Чебышёва ее производной y'(x). Приводятся фрагмент вызывающей программы и результат счета, аналогичные результатам счета из примера 5. Поскольку правая часть дифференциального уравнения не зависит от y, то параметр imax (как и в примере 5) можно положить равным 1.
int main(void) { /* Local variables */ extern int f_c(); static double h__; static int k, m; static double y, h0, ay[4], xk, xn, yn; static int nx,n; static double xs[2], yt; static double rab[34], ady[3]; extern int de55d_c( ); static double dely; static int imax, iordy, iniapr; m = 1; xn = 1.; yn = 8.; iordy = 1; h0 = -1.; xk = xn + h0; yt = 8.; k = 2; imax = 1; iniapr = 1; h__ = h0; de55d_c((U_fp)f_c, &m, &xn, &yn, &xk, &k, &iniapr, &imax, &iordy, &h__, &y, &nx, xs, ay, ady, rab); dely = yt - y; /* Операторы вывода на печать: nx, xs, h0, k, iniapr, imax, iordy, y, yt, dely, ay, ady */ . . . . . . . . . . . . . . . . . . . . . . . . . . return 0; } /* main */ /*..........................................................................*/ int f_c(double *x, double *y, double *z__, int *m) { *z__ = *x * 192. * *x - *x * 176. + 24.; return 0; } /* f_c */ Результаты: -------------- nx= 1 xs[0]= 1.00000000000000e+000 xs[1]= 0.00000000000000e+000 h0= -1.00000000000000e+000 k= 2 iniapr= 1 imax= 1 iordy= 1 y = 8.00000000000000e+000 yt= 8.00000000000000e+000 dely = 8.88178419700125e-016 COEFFICIENTS ON 1 SEGMENT Chebyshev coefficients for Y for Y' ------------------------------------------------------- 0 1.40000000000000e+001 1.60000000000000e+001 1 2.00000000000000e+000 -8.00000000000000e+000 2 1.00000000000000e+000 2.40000000000000e+001 3 -2.00000000000000e+000
Из приведенных результатов видно, что на выходе из функции de55d_c в массиве xs точки xn, xk располагаются в порядке убывания. Вычисленные подпрограммой коэффициенты Чебышёва функции y(x) = y(1 - α), x = 1 - α, и коэффициенты Чебышёва ее производной y'(x) находятся в полном согласии с представлениями (15) и (16) (как и должно быть).