Сделай Сам Свою Работу на 5

Вычисление интегралов – команда int





 

В ряде случаев возникает необходимость вычисления неопределенных и определенных интегралов

I = dx и I = dx.

Здесь f(x) – подынтегральная функция независимой переменной x, a нижний и b верхний пределы интегрирования для определенного интеграла.

Командаint(f, x)возвращает неопределенный интеграл (первообразную функцию) от символьного выражения f по переменной x.

Командаint(f, x, a, b) возвращает значение определенного интеграла от символьного выражения f по переменной x с пределами от а до b.

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

Если f массив, то int(f, x) возвращает массив первообразных, а int(f, x, a, b) – массив значений определенных интегралов. Примеры:

>> syms x

>> f=[sin(x);1/x]

f =

[ sin(x)]

[ 1/x]

>> int(f,x)

ans =

[ -cos(x)]

[ log(x)]

>> int(f,x,1,2)

ans =

[ -cos(2)+cos(1)]

[ log(2)]

Пример:

Вычислить неопределенный интеграл

 

dx.

Решение:

>> syms x a

>> int(log(x+a)/sqrt(x+a),x)

ans =

2*log(x+a)*(x+a)^(1/2)-4*(x+a)^(1/2)

>> [m]=simple(ans)

m =

2*(x+a)^(1/2)*(log(x+a)-2)

Полученную первообразную 2(ln(x+a) - 2), зависящую от символьного параметра a, проверим дифференцированием по x:

>> diff(m,x)



ans =

1/(x+a)^(1/2)*(log(x+a)-2)+2/(x+a)^(1/2)

>> [m]=simple(ans)

m =

log(x+a)/(x+a)^(1/2)

>> pretty(m)

 

log(x + a)

-----------

1/2

(x + a)

В результате дифференцирования получена подынтегральная функция

,

т. е. выражение 2(ln(x+a) - 2) действительно является первообразной.

Пример:

Вычислить определенный интеграл

 

dx.

Решение:

Подынтегральная функция задана в аналитическом виде с символьными переменными a, b, x, а пределами интегрирования являются символьные переменные c, d. Интегрировать можно по любой из переменных a, b, x. Здесь интегрирование осуществляется по переменной x, поэтому int возвращает значение интеграла, выраженное через параметры a, b, c, d

>> syms x a b c d

>> int(x/(a+b*x^2),x,c,d)

ans =

1/2*(log(a+d^2*b)-log(a+c^2*b))/b

>> pretty(ans)

2 2

log(a + d b) - log(a + c b)

1/2 --------------------------------

b

Пример:

Вычислить определенный интеграл по переменной b

 

db.

Решение:

>> syms x a b c d

>> int(x/(a+b*x^2),b,c,d)

ans =

(log(a+d*x^2)-log(a+c*x^2))/x

>> pretty(ans)

 

2 2

log(a + d x ) - log(a + c x )

--------------------------------

x

От символьных параметров могут зависеть и кратные определенные интегралы.

Пример:



Вычислить тройной интеграл

 

(x2+y2)zdxdydz.

Решение:

Применив команду int трижды, получим символьный ответ:

>> syms a x y z

>> int(int(int((x^2+y^2)*z,x,0,a),y,0,a),z,0,a)

ans =

1/3*a^6

Команда int не позволяет получить неопределенный интеграл от произвольной функции.

Пример:

Вычислить неопределенный интеграл

dx.

Решение:

При вводе int выдается предупреждение об ошибке и команда возвращается без результата:

>> syms x

>> int(exp(abs(sin(x))),x)

Warning: Explicit integral could not be found.

> In C:\matlab6p5\toolbox\symbolic\@sym\int.m at line 58

ans =

int(exp(abs(sin(x))),x)

Это означает, что либо первообразной не существует либо система MATLAB не смогла ее найти.

В некоторых случаях int возвращает выражение для первообразной через специальные функции.

Пример:

Вычислить неопределенный интеграл

dx.

Решение:

>> syms x

>> int(sin(x)/x)

ans =

sinint(x)

Ответ содержит функцию интегральный синус, которая определяется интегралом с переменным верхним пределом:

Si(x) = dt.

Вычисление несобственных интегралов, зависящих от параметров, имеет некоторые особенности.

Пример:

Вычислить несобственный интеграл

 

dt.

Решение:

Команда int возвращается без результата:

>> syms a n t

>> int(t^n*exp(-a*t),t,0,inf)

ans =

int(t^n*exp(-a*t),t = 0 .. inf)

Система MATLAB не смогла вычислить интеграл потому, что величина интеграла зависит от знака параметра n, который при определении n остается незаданным. При инициализации символьной переменной n укажем ее знак, например:

>> syms a t

>> n=sym('n','positive');

>> int(t^n*exp(-a*t),t,0,inf)

ans =

1/(a^n)/a*gamma(n)*n

Значение интеграла выражается через гамма - функцию, информацию о которой можно получить с помощью команды doc gamma. Если n целое, то gamma(n)×n = n!, и в таком случае



 

dt = .

Далее на конкретных примерах сравним эффективность символьного и численного интегрирования.

Пример:

Вычислить определенный интеграл

 

dx.

Решение:

Команда int возвращает символьное значение определенного интеграла, выраженное через функцию арксинус:

>> syms x

>> format long

>> int(asin(x),x,0,pi/4)

ans =

1/4*pi*asin(1/4*pi)+1/4*(16-pi^2)^(1/2)-1

Для получения решения в естественной форме достаточно активизировать с помощью мыши строку ответа и нажать клавишу <Enter>. Будет получен следующий ответ (в установленном формате вывода):

ans =

0.32847177096777

Команда vpa (см. разд. 7.2) позволяет вывести на экран результат вычислений с любым числом текущих цифр, например, с 20:

>> int(asin(x),x,0,pi/4)

ans =

1/4*pi*asin(1/4*pi)+1/4*(16-pi^2)^(1/2)-1

>> vpa(ans,20)

ans =

.3284717709677653169

В разделе 6.5 командами quad и quadl вычислялись определенные интегралы

 

I1 = dx = 1, I2 = dx = 2, I3 = dx = 4.

 

Только интеграл I1 был вычислен успешно.

Вычислим эти интегралы командой int и замерим время вычислений:

>> syms x

>> tic,I1=int(1/sqrt(abs(x-2)),x,1,1.75),toc

I1 =

elapsed_time =

1.17100000000000

>> tic,I2=int(1/sqrt(abs(x-2)),x,1,2),toc

I2 =

elapsed_time =

1.13200000000001

>> tic,I3=int(1/sqrt(abs(x-2)),x,1,3),toc

I3 =

elapsed_time =

0.95200000000000

Команда int вычислила каждый из интегралов точно приблизительно за 1 с.:

В разделе 6.5 команды quad и quadl не смогли вычислить несобственный интеграл

 

dx = 1.

Команда int находит точный результат:

>> syms x

>> int(x*exp(-x),x,0,inf)

ans =

Ранее система MATLAB не смогла найти первообразную от функции e|sinx|.

Но она позволяет вычислить определенный интеграл от этой функции.

Пример:

Вычислить определенный интеграл

 

I = dx.

Решение:

При обращении к int выдается предупреждение об ошибке и команда возвращается без результата:

>> syms x

>> I=int(exp(abs(sin(x))),x,0,2*pi)

I =

int(exp(abs(sin(x))),x = 0 .. 2*pi)

Это означает, что команда int символьное решение не нашла. Воспользуемся теперь командой vpa. При интегрировании с 15 текущими цифрами получим:

>> vpa(I,15)

ans =

12.4175160714222

Такой же результат был получен в разделе 6. 5 численным нтегрированием командами quad и quadl.

Замерим время вычисления интеграла с разным числом текущих цифр:

 

vpa(I,10) I=12,41751607, t=1,89 с.

vpa(I,15) I=12,4175160714222, t=2,15 с.

vpa(I,20) I=12,417516071422220393, t=2,30 с.

vpa(I,25) I=12,41751607142222039272708, t=2,31 с.

Пример:

Вычислить двойной интеграл

I = esin(x²+y²)dxdy.

Решение:

Двойное применение int выдает предупреждение об ошибке и команда возвращается без результата:

>> syms x y

>> I=int(int(exp(sin(x^2+y^2)),x,0,pi),y,0,pi)

I =

int(int(exp(sin(x^2+y^2)),x = 0 .. pi),y = 0 .. pi)

Символьное решение не найдено. Совместное применение int и vpa возвращает приближенное значение интеграла. При вычислениях с 10 текущими цифрами получим:

>> tic,vpa(int(int(exp(sin(x^2+y^2)),x,0,pi),y,0,pi),10),toc

ans =

13.44629794

elapsed_time =

8.762300000000000e+002

Приведем результаты интегрирования с разным числом текущих цифр:

 

vpa(I,6) I=13,4463, t=55 с.

vpa(I,7) I=13,44630, t=65 с.

vpa(I,8) I=13,446298, t=105 с.

vpa(I,9) I=13,4462979, t=89 с.

vpa(I,10) I=13,44629794, t=876 с.

vpa(I,11) I=13,446297937, t=1263 с.

vpa(I,12) I=13,4462979373, t=170 с.

vpa(I,13) I=13,44629793734, t=185 с.

vpa(I,14) I=13,446297937338, t=2250 с.

vpa(I,15) I=13,4462979373383, t=2730 с.

 

Более точный результат I = 13,44629793733828 (16 верных цифр) получен в разделе 6. 5 интегрированием с dblquad приблизительно за 206 с. В данном случае численное интегрирование эффективнее символьного по точности и быстродействию.

Пример:

Вычислить тройной интеграл

 

I = sin(x2+y2+z2)dxdydz.

Решение:

Тройное обращение к int возвращает символьное решение, выраженное через гипергеометрическую функцию и интегралы Френеля:

>> syms x y z

>> I=int(int(int(sin(x^2+y^2+z^2),x,0,pi),y,0,pi),z,0,pi);

>> [R]=simple(I)

R =

1/18*pi^(5/2)*2^(1/2)*(6*pi^2*hypergeom([3/4],[3/2, 7/4],-1/4*pi^4)*FresnelC(2^(1/2)*pi^(1/2))*hypergeom([1/4],[1/2, 5/4],-1/4*pi^4)-pi^4*hypergeom([3/4],[3/2, 7/4],-1/4*pi^4)^2*FresnelS(2^(1/2)*pi^(1/2))+9*hypergeom([1/4],[1/2, 5/4],-1/4*pi^4)^2*FresnelS(2^(1/2)*pi^(1/2)))

Вычислим интеграл командами int и vpa с 15 текущими цифрами:

>>tic,vpa(int(int(int(sin(x^2+y^2+z^2),x,0,pi),y,0,pi),z,0,pi),15),toc

ans =

.280500993612534

elapsed_time =

1.90200000000000

Интегрирование с разным числом текущих цифр дает следующие результаты:

 

vpa(I,15) I=0,280500993612534, t=1,90 с.

vpa(I,23) I=0,28050099361253569211437, t=1,93 с.

vpa(I,25) I=0,2805009936125356921143730, t=2,00 с.

 

Менее точный результат I=0,2805009936 (11 верных цифр) получен в разделе 6. 5 интегрированием с triplequad приблизительно за 4165 с. В этом случае символьное интегрирование эффективнее численного.

Вывод: команда int вычислила все рассмотренные несобственные интегралы; если команда int находит символьное значение интеграла, то символьное интегрирование по точности и быстродействию эффективнее численного интегрирования, и наоборот.

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.