Файл: Эксперименты лаба5,6(2курс).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 06.04.2021

Просмотров: 163

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

# i, j — переменные циклов
# xp — середины частичных отрезков
# n — количество частичных отрезков
# x — массив узлов
# h — длины частичных отрезков

n:=1; x[1]:=a;
for i from 1 while (x[i]<=b) do

n:=n+1;
x[i+1]:=x[1]+sh*i; # заполнение массива узлов

end do;
if x[n]<b then x[n]:=b; end if;
for i from 1 to n-1 do

# вычисление длин частичных отрезков

h[i]:=abs(x[i+1]-x[i]);

# нахождение середин частичных отрезков

xp[i]:=h[i]/2+x[i];

end do;
slog:=0;
for j from 1 to n-1 do

slog:=slog+simplify(h[j]*f(xp[j])); # формула прямоугольников

end do;
slog:=evalf(slog);
return slog; # вывод результата
end proc;

Проверим результат работы процедуры
> prl(0,1,0.0001);

0.5222818376

> evalf(int((sin(x))-xˆ 3*ln(x),x=0..1));

0.5221976941

4.9.2.

Метод трапеций

> restart;
> f:=x-> evalf(sin(x)-xˆ 3*ln(x));

# вычисление определенного интеграла методом трапеций
> trp:=proc(a,b,sh)

11


background image

# b, a — верхний и нижний пределы интегрирования соответственно
# sh — шаг разбиения отрезка [a,b]

local i,j,n,x,y,h,slog;

# i, j — переменные циклов
# n — количество частичных отрезков
# x — массив узлов
# y — массив значений функции в полученных узлах
# h — длины частичных отрезков

n:=1; x[1]:=a; y[1]:=f(x[1]);
for i from 1 while (x[i]<=b) do

n:=n+1;
x[i+1]:=x[1]+sh*i; # заполнение массива узлов

# заполнение массива значений функции в полученных узлах

y[i+1]:=f(x[i+1]);

end do;
if x[n]<b then x[n]:=b; y[n]:=f(x[n]); end if;
for i from 1 to n-1 do

h[i]:=abs(x[i+1]-x[i]); # вычисление длин частичных отрезков

end do;
slog:=0;
for j from 1 to n-1 do

slog:=slog+evalf(h[j]*(y[j]+y[j+1])); # формула трапеций

end do;
slog:=evalf(1/2*slog);
return slog; # вывод результата
end proc;

Проверим работу процедуры
> trp(0.001,1,0.001);

0.5230383120

> evalf(int((sin(x))-xˆ 3*ln(x),x=0..1));

0.5221976941

4.9.3.

Метод Симпсона

> restart;
> f:=x-> evalf(sin(x)+ln(x)*xˆ 3);

12


background image

> Simpson:=proc(a,b,n)
# b, a — верхний и нижний пределы интегрирования соответственно
# n — количество частичных отрезков
local i,h,x,y,slog,slogn,slogch;
# i — переменная циклов
# h — шаг
# x — массив узлов
# y — массив значений функции в полученных узлах
# slogn — сумма всех значений функции в узлах с нечетным номером
# slogch — сумма всех значений функции в узлах с четным номером

(кроме x[0] и x[n])

if (n mod 2 = 1) then print(’n-нечетное_число’); exit; end if;

h:=abs(evalf(b)-evalf(a))/n; # определение шага, для заполнения

массива узлов

for i from 0 to n do

x[i]:=evalf(a)+i*h; # заполнение массива узлов

# заполнение массива значений функции в полученных узлах

y[i]:=f(x[i]);

end do;
slog:=0; slogn:=0; slogch:=0;
for i from 1 by 2 to (n-1) do

# вычисление суммы всех значений функции в узлах с нечетным

номером

slogn:=slogn+y[i];

end do;
for i from 2 by 2 to (n-2) do

# вычисление суммы всех значений функции в узлах с четным номе-

ром (кроме x[0] и x[n])

slogch:=slogch+y[i];

end do;
slog:=(y[0]+4*slogn+2*slogch+y[n])*h/3; # формула Симпсона
return slog; # вывод результата
end proc;

Проверим работу процедуры
> Simpson(0.0001,Pi,22);

23.78877518

> int(f(x),x=0.0001..Pi);

23.78870622

13


background image

4.9.4.

Метод Гаусса

Таблица узлов и коэффициентов формулы Гаусса для n=1..6

n

x

i

A

i

1

x

1

= 0

A

1

= 2

2

x

2

=

x

1

= 0

.

5773502692

A

1

=

A

2

= 1

3

x

2

= 0

A

2

= 0

.

8888888889

x

3

=

x

1

= 0

.

7745966692

A

1

=

A

3

= 0

.

5555555556

4

x

3

=

x

2

= 0

.

3399810436

A

2

=

A

3

= 0

.

6521451549

x

4

=

x

1

= 0

.

8611363116

A

1

=

A

4

= 0

.

3478548451

5

x

3

= 0

A

3

= 0

.

5688888899

x

4

=

x

2

= 0

.

53384693101

A

2

=

A

4

= 0

.

4786286705

x

5

=

x

1

= 0

.

9061798459

A

1

=

A

5

= 0

.

2369268851

6

x

6

=

x

1

= 0

.

9324695142

A

1

=

A

6

= 0

.

1713244924

x

5

=

x

2

= 0

.

6612093865

A

2

=

A

5

= 0

.

3607615730

x

4

=

x

3

= 0

.

2386191861

A

3

=

A

4

= 0

.

4679139346

> restart;
> n:=6:
# табличные значения узлов формулы Гаусса для n=6
> x[1]:=-0.9324695142:
> x[2]:=-0.6612093865:
> x[3]:=-0.2386191861:
> x[4]:=-x[3]:
> x[5]:=-x[2]:
> x[6]:=-x[1]:

# табличные значения коэффициентов формулы Гаусса для n=6
> A[1]:=0.1713244924:
> A[2]:=0.3607615730:
> A[3]:=0.4679139346:
> A[4]:=A[3]:
> A[5]:=A[2]:
> A[6]:=A[1]:

# процедура для вычисления интеграла методом Гаусса с 6 узлами
> Gauss6:=proc(a,b)
# b, a — верхний и нижний пределы интегрирования

local i,sl,t;

# i — переменная циклов

14


background image

# sl — переменная для накопления суммы слагаемых
# t — массив узлов

for i from 1 to n do
t[i]:=(b+a)/2+((b-a)/2)*x[i]; # заполнение массива узлов
end do;
sl:=0;
for i from 1 to n do
sl:=sl+evalf(A[i]*f(t[i])); # формула Гаусса
end do;
sl:=evalf((b-a)/2*sl); # вывод результата
end proc;

# процедура для вычисления определенного интеграла (метод Гаус-

са) с заданной точностью eps

> Gauss:=proc(a,b,eps)
# b, a — верхний и нижний пределы интегрирования
# eps — точность интегрирования

local int1,int2,int,i,j,c,k,r,l;

# int1, int2 — два последовательных приближения к точному реше-

нию интеграла

# int — приближения к точному решению интеграла
# i, j — переменные циклов
# c — точки разбиения промежутка интегрирования
# k — количество частичных отрезков
# r, l — правые и левые границы частичных отрезков
# вычисление определенного интеграла (метод Гаусса n=6)

int1:=Gauss6(a,b);
c:=(b-a)/2; # точка разбиения промежутка интегрирования

# вычисление определенного интеграла (метод Гаусса n=11)

int2:=Gauss6(a,c)+Gauss6(c,b);

# количество частичных отрезков, на которое рабивается отрезок

[a,b]

k:=2;
for j from 1 while abs(int1-int2)>eps do

int:=0;
c:=(b-a)/(2*k);
for i from 0 to 2*k-1 do

# вычисление границ каждого частичного отрезка

l:=a+c*i; r:=a+c*(i+1);

# вычисление определенного интеграла (n=6+2*k-1)

15