Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод. указания для ККР 3 сем.doc
Скачиваний:
1
Добавлен:
15.07.2019
Размер:
123.39 Кб
Скачать
  1. Задание.

Для N значений независимой переменной, равномерно распределенных на отрезке [a..b], построить таблицу значений функции Бесселя первого рода целого порядка, используя ее представление в виде степенного ряда и интеграла.

Значения N, a, b ввести с клавиатуры. Организовать дружественный интерфейс и контроль вводимых значений.

На экран вывести таблицу следующей структуры: «аргумент функции – значение функции»

  1. Математическая постановка задачи.

Функция Бесселя первого рода может быть определена как сумма степенного ряда:

, (1)

где - Гамма- функция.

Для целых значений аргумента Гамма-функция имеет вид:

(2)

Также функция Бесселя первого рода может быть представлена в виде интеграла:

. (3)

Необходимо определить значения функции Бесселя, используя выражения (1) и (3).

  1. Теоретическая справка по конструкциям языка Pascal.

  1. Описание структуры и работа программы.

При решении задачи созданы следующие подпрограммы:

  1. function Fact(n:integer):extended; - подпрограмма определения значения факториала числа n;

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

Критерием остановки рекурсивной процедуры служит условие

  1. function Gamma(n:integer):extended; - подпрограмма определения значения Гамма-функции целого аргумента n;

Из формулы (2) следует, что нахождение значений Гамма-функции целого аргумента сводится к нахождению факториала числа . Функция Gamma обращается к функции Fact с аргументом, уменьшенным на единицу.

  1. function Power(x:real;n:integer):extended; - подпрограмма определения целой степени числа. Здесь x – основание степени, n – показатель степени;

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

Критерием остановки рекурсивной процедуры служит условие

  1. function Sign(n:integer):integer; - подпрограмма возведения числа (-1) в целую степень n

Подпрограмма оценивает четность или нечетность числа n и возвращает соответственно 1 или -1. Оценка четности проводится сравнением остатка от деления числа n на 2 с нулем:

n mod 2 = 0 – условие четности числа ;

  1. function Bessel(x:real;n,M:integer):real; - подпрограмма определения значения функции Бесселя на основании формулы (1). Параметры функции: x – аргумент функции, n – порядок функции Бесселя, M – число членов ряда;

В подпрограмме реализован алгоритм нахождения суммы M членов ряда. Переменной Result присваивается значение 0. Далее в цикле к переменной Result добавляются значения членов ряда. Для нахождения значений каждого из членов ряда вызываются функции Sign, Power, Gamma с соответствующими аргументами.

  1. function Bessel_Int(x:real;n,M:integer):real; - подпрограмма определения значения функции Бесселя на основании формулы (3). Параметры функции: x – аргумент функции, n – порядок функции Бесселя, M – число членов ряда;

Использование формулы (3) предполагает нахождение определенного интеграла в пределах от 0 до . Для численного нахождения величины определенного интеграла используется метод средних прямоугольников. Диапазон изменения переменной, по которой проводится интегрирование, разбивается на N отрезков. В силу аддитивности определенного интеграла, искомый интеграл равен сумме интегралов по каждому из отрезков. На каждом отрезке определенный интеграл равен площади под графиком подынтегральной функции, а потому может быть с некоторой степенью точности заменен площадью прямоугольника, одна сторона которого равна длине интервала изменения переменной интегрирования, а высота равна значению подынтегральной функции в середине интервала:

В реализуемом алгоритме выполняется равномерное разбиение интервала от 0 до , поэтому предыдущая формула примет вид:

Таким образом, в алгоритм нахождения определенного интеграла сводится к нахождению суммы значений подынтегральной функции в N точках, равномерно распределенных по диапазону интегрирования.

  1. function Init_values:boolean; - подпрограмма для ввода пользователем исходных данных, их контроля. Если данные введены корректно, то функция возвращает true, в противном случае false. Функция не имеет параметров. Вводимые пользователем значения присваиваются к глобальным переменным, описанным в разделе var основной программы.

Исходными данными в программе являются:

границы интервала, на котором определяются значения функции Бесселя – переменные x_left и x_right вещественного типа. Количество выводимых значений – переменная N целого типа. Порядок функции Бесселя – переменная B_order целого типа.

Переменные x_left, x_right, N, B_order описываются как глобальные переменные программы. Подпрограмма обращается к этим переменным непосредственно.

  1. procedure View_Result; - подпрограмма для вывода на экран таблицы результатов. Процедура не имеет параметров, оперирует с глобальными переменными.

Подпрограмма разбивает интервал изменения независимой переменной [x_left…x_right] на N одинаковых отрезков. Координата левой границы -го отрезка определяется из выражения:

,

Для каждой точки определяются значения функции Бесселя первого рода порядка Order функциями Bessel и Bessel_Int.

Основная программа вызывает функцию Init_values, проверяет возвращаемое ей значение. В случае, если данные введены корректно (возвращено значение true), то вызывается подпрограмма View_Result, осуществляющая вывод на экран значений функции Бесселя в заданном диапазоне изменения независимого аргумента.

  1. Анализ полученного решения.

Значения, полученные по формулам (1) и (3) тем более совпадают, чем большее число членов ряда учитывается в разложении (1). Сходимость ряда (1) ухудшается при удалении от начала координат, таким образом, формула (3) является предпочтительной при нахождении значений функции Бесселя для аргументов, больших 10.

ПРИЛОЖЕНИЕ 1. Текст программы.

program BESSEL_FUNCT;

{$APPTYPE CONSOLE}

uses

SysUtils;

const Pi = 3.14; // описание глобальных констант

var x_left,x_right:real; // описание лобальных переменных

N,B_order:integer;

function Fact(n:integer):extended; // подпрограмма нахождения факториала числа n

begin

if n<=0 then Fact:=1 // условие выхода из рекурсивного алгоритма

else

Fact:=n*Fact(n-1); // рекурсия

end;

function Gamma(n:integer):extended; // подпрограмма нахождения значения Гамма-функции

//целого аргумента n

begin

Gamma:=Fact(n-1); // формула (2) математической постановки

end;

function Power(x:real;n:integer):extended;

begin

if n=0 then Power:=1

else

Power:=x*Power(x,n-1);

end;

function Sign(n:integer):integer;

begin

if n mod 2 =0 then Sign:=1

else

Sign:=-1;

end;

function Bessel(x:real;n,M:integer):real;

var k:integer;

begin

Result:=0;

for k:=0 to M do

Result := Result // формула (1) математической постановки

+ Sign(k)*Power(x/2,n+2*k)/Gamma(k+1)/Gamma(n+k+1); // k-й член ряда

end;

function Bessel_Int(x:real;n,M:integer):real;

var i:integer; delta,t:real; // описание локальных переменных

begin

Result:=0;

delta:=Pi/M; // определение длины каждого

//интервала разбиения

for i:=1 to M do

begin

t:=delta*(i-1)+delta/2; // определение середины i-го

//интервала разбиения

Result := Result + cos(x*sin(t)-n*t); // нахождение суммы значений

//подынтегральной функции

end;

Result:=Result*delta/Pi;

end;

function Init_values:boolean;

begin

Result := true;

write('Input left point: '); readln(x_left); //ввод с клавиатуры значения

//переменной x_left

write('Input rigth point: '); readln(x_right); //ввод с клавиатуры значения

//переменной x_right

write('Input count of points: ');readln(N); //ввод с клавиатуры значения

//переменной N

write('Input order of function: ');readln(B_order); //ввод с клавиатуры значения

//переменной B_order

if N<1 then Result:=false; //контроль условия N>0

if x_right<=x_left then Result:=false; //контроль условия x_left<x_right

if x_left<0 then Result:=false; //контроль условия x_left>0

end;

procedure View_Result;

var i,a:integer; delta,t,BS,BI:real;

begin

delta:=(x_right-x_left)/N; //расстояние между соседними

//значениями независимой переменной

writeln;

writeln;

writeln('----------------------------------------------'); //вывод заголовка таблицы

writeln('| x | Bessel_series | Bessel_Int |');

writeln('----------------------------------------------');

for i:=0 to N do

begin

t:=x_left+delta*i; //определение границы i-го интервала

BS:=Bessel(t,B_order,20); //определение значения функции Бесселя по формуле (1)

BI:=Bessel_Int(t,B_order,20); //определение значения функции Бесселя по формуле (3)

if BS>0 then a:=10 else a:=9; //определение знака результата, если отрицательный, то

//число займет на экране на 1 символ больше

writeln('| ',t:4:4,' | ',BS:5:a,' | ',BI:5:a,' |') //вывод на экран строки таблицы

end;

writeln('----------------------------------------------');

end;

begin // начало основной программы

if Init_values then //ввод начальных данных и проверка их корректрости

View_Result //расчет значений функции Бесселя и вывод их на экран

else

writeln('Input values is not valid');

readln;

end.