Символьные операции математического анализа
Вычисления производных
Для вычисления в символьном виде производных от выражения S служит функция diff, записываемая в формате diff (S, ' v') или diff (S, sym ('v') ) . Она возвращает символьное значение первой (п=1) производной от символьного выражения или массива символьных выражений s по переменной v. Эта функция возвращает
с-// ч dS
S (v) = —.
av
- • diff (S,n) — возвращает n-ю (n — целое число) производную от символьного выражения или массива символьных выражений S по переменной v.
- • diff(S,'v’,n) и diff(S,n,'v') — возвращает n-ю производную S по переменной v, то есть значение
Примеры:
» x=sym('х');y=sym('у');
» diff(xAy)
ans =
хАу*у/х
>> diff(хАу,х)
ans =
хлу*у/х
>> simplify(ans)
ans =
хл(y-1)*y
>> diff(sin(y*x),x,3)
ans =
-cos (y*x)*yA3
>> diff([xA3 sin(x) exp(x)],x) ans =
[ 3*хл2, cos (x), exp(x)]
Вычисления интегралов
В практической работе часто возникает необходимость вычисления неопределенных и определенных интегралов вида
h
I = [f(x)dx и / =
а
Здесь Дх) — подынтегральная функция независимой переменной х, а — нижний и b — верхний пределы интегрирования для определенного интеграла.
- • int(S) — возвращает символьное значение неопределенного интеграла от символьного выражения или массива символьных выражений s по переменной, которая автоматически определяется функцией findsym. Если s — скаляр или матрица, то вычисляется интеграл по переменной ' х'.
- • int (S, v) — возвращает неопределенный интеграл от s по переменной v.
- • int (S,a,b) — возвращает определенный интеграл от S с пределами интегрирования от а до Ь, причем пределы интегрирования могут быть как символьными, так и числовыми.
- • int (S, v, а,Ь) — возвращает определенный интеграл от S по переменной v с пределами от а до ь.
Примеры применения этой функции приводятся ниже:
>> x=sym ( 'х');
» int(хЛ2,х)
ans =
1/3*хлЗ
>> int(sin(х)л3,х)
ans =
-l/3*sin(х)A2*cos(х)-2/3*cos(х)
» int(log (2*х),х)
ans =
log (2*х)*х-х
>> int((хл2-2)/(хлЗ-1),х,1,2)
ans =
-inf
» int( (хл2-2)/(хлЗ-1),х,2,5)
ans =
- -2/3*log (2)+2/3*log (31)+2/3*Зл(1/2)*atan (11/3*Зл (1/2))-. . .
- 2/3*log(7)-2/3*Зл(1/2)*atan (5/3*Зл (1/2))
>> int([xA3 sin(x) exp(x)],x) ans =
[ 1/4*хл4, -cos (x), exp(x)]
С помощью функции int можно вычислять имеющие аналитическое решение сложные интегралы, например с бесконечными пределами (или одним из пределов), а также кратные интегралы. Ниже представлен пример вычисления одного из таких интегралов:
J xe~xdx.
о
>> syms а х у z
>> int(х*ехр(-х),х,0,inf) ans =
1
Аппарат точной арифметики позволяет вычислять определенные интегралы, в вычислении которых существуют трудности из-за вычислений больших чисел. К примеру, интеграл
1
J х20 exp(-x)Jx о часто дает нулевое значение вместо 0,01835... MATLAB, правда, честно сообщает, что такой интеграл он вычислить не в состоянии из-за отсутствия соответствующего метода:
>> int(exp(1)Л20*ехр (-х),х,0,1)
??? No appropriate methods for function int.
Попробуем выяснить, в чем тут дело. Вычислим для этого неопределенный интеграл
|х20 exp(-x)Jx,
используя функцию int, но в символьном виде:
>> syms х
» int (хЛ20*ехр(—х),х)
ans =
- -хЛ20*ехр (—х)-20*хл19*ехр (-х)-380*хл18*ехр (-х) -
- 6840*хл17*ехр(-х)-116280*хл16*ехр(-х)-1860480*хл15*ехр(-х) -
- 27907200*хл14*ехр(-х)-390700800*хл13*ехр(-х)-
- 5079110400*хл12*ехр(-х)-60949324800*хл11*ехр(-х) -
- 670442572800*хл10*ехр(-х)-6704425728000*хл9*ехр(-х)-
- 60339831552000*хл8*ехр(-х)-482718652416000*хл7*ехр(-х) -
- 3379030566912000*хл6*ехр(-х)-20274183401472000*хл5*ехр(-х) -
- 101370917007360000*хл4*ехр(-х)-4 054 83 66802 94 4 00 00*хлЗ*ехр (-х)-1216451004088320000*хл2*ехр(-х)-2432902008176640000*х*ехр (-х)-2432902008176640000*ехр (-х)
Нетрудно заметить, что интеграл представлен рядом экспонент с большими множителями перед ними. При обычной точности вычислений погрешности велики и приводят к нулевому результату из-за вычитания больших близких чисел в условиях ограничения разрядности. Но MATLAB с пакетом Symbolic Math благополучно выдает точное и приближенное значение нашего интеграла:
» a=int(хЛ20*ехр(-х),х,0,1)
а =
-6613313319248080001*ехр(-1)+2432902008176640000
» double(а)
ans =
0.0184
Следующий пример относится к вычислению тройного интеграла:
0 0 0
Здесь можно трижды использовать функцию int:
» syms х у z а
>> int(int(int((хЛ2+уЛ2)*z,x,0, a), у,0,a),z,0,a)
ans =
1/3*ал6
Итак, один из приведенных примеров вычисляет интеграл с бесконечным верхним пределом, другой — довольно «каверзный» интеграл, а третий — тройной интеграл.