Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Вычисление интегралов – команда 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 находит символьное значение интеграла, то символьное интегрирование по точности и быстродействию эффективнее численного интегрирования, и наоборот. |
Последнее изменение этой страницы: 2017-03-17; Просмотров: 379; Нарушение авторского права страницы