Компания ALT Linux
Опубликован: 24.03.2015 | Доступ: свободный | Студентов: 553 / 138 | Длительность: 19:00:00
Лекция 2:

Основы Maxima

2.7.7 Преобразование тригонометрических выражений

Функция trigexpand раскладывает все тригонометрические и гиперболические функции от сумм и произведений в комбинации соответствующих функций единичных углов и аргументов. Для усиления пользовательского контроля один вызов trigexpand выполняет упрощение на одном уровне. Для управления вычислением имеется флаг trigexpand. Изначально флаг trigexpand установлен в false. Если флаг trigexpand установить в true, то функция trigexpand будет работать до тех пор, пока выражение не перестанет меняться.

(%i1)	x+sin(3*x)/sin(x),trigexpand=true,expand;
-{sin\left( x\right) }^{2}+3\,{cos\left( x\right) }^{2}+x\leqno{(\%o1) }
(%i2)	trigexpand(sin(10*x+y));
cos\left( 10\,x\right) \,sin\left( y\right) +sin\left( 10\,x\right) \,cos\left( y\right) \leqno{(\%o2) }
(%i3)	trigexpand(sin(3*x)+cos(4*x));
{sin\left( x\right) }^{4}-{sin\left( x\right) }^{3}-6\,{cos\left( x\right) }^{2}\,{sin\left( x\right) }^{2}+3\,{cos\left( x\right) }^{2}\,sin\left( x\right) +{cos\left( x\right) }^{4}\leqno{(\%o3) }

Функция trigreduce свёртывает все произведения тригонометрических и гиперболических функций в комбинации соответствующих функции от сумм. Функция работает не до конца, так что повторный вызов может изменить выражение. При вызове функции в формате trigreduce(expr,x) преобразования осуществляются относительно функций x.

Примеры:

(%i8)	trigreduce(cos(x)^4 + cos(x)^3 + cos(x)^2 + cos(x) + 1);
\frac{cos\left( 4\,x\right) +4\,cos\left( 2\,x\right) +3}{8}+\frac{cos\left( 3\,x\right) +3\,cos\left( x\right) }{4}+\frac{cos\left( 2\,x\right) +1}{2}+cos\left( x\right) +1\leqno{(\%o8) }
(%i9)	trigreduce(-sin(x)^2+3*cos(x)^2+x);
\frac{cos\left( 2\,x\right) }{2}+3\,\left( \frac{cos\left( 2\,x\right) }{2}+\frac{1}{2}\right) +x-\frac{1}{2}\leqno{(\%o9) }

Функция trigsimp упрощает тригонометрические и и гиперболические выражения, применяя к ним правила sin(x)^2 + cos(x)^2 = 1 и cosh(x)^2 - sinh(x)^2 = 1.

Пример:

(%i1)	trigsimp(sin(x)^2+3*cos(x)^2);
2\,{cos\left( x\right) }^{2}+1\leqno{(\%o1) }
(%i2)	trigsimp(sinh(x)^2+3*cosh(x)^2);
4\,{cosh\left( x\right) }^{2}-1\leqno{(\%o2) }

Функция trigrat (синтаксис вызова trigrat(expr)) приводит заданное тригонометрическое выражение expr к канонической упрощённой квазилинейной форме. Это выражение рассматривается как рациональное, содержащее sin, cos, tan, аргументы которых линейные формы некоторых переменных и \frac{\pi}{n} (n — целое). Всегда, когда возможно, заданное выражение линеаризуется.

Пример:

(%i1) trigrat((1+sin(2*b)-cos(2*b))/sin(b));

2\,sin\left( b\right) +2\,cos\left( b\right) \leqno{(\%o1) }

2.7.8 Преобразование степенных и логарифмических выражений

Функция radcan упрощает выражения, содержащие экспоненты, логарифмы и радикалы, путём преобразования к форме, которая является канонической для широкого класса выражений. Переменные в выражении упорядочиваются. Эквивалентные выражения в этом классе не обязательно одинаковы, но их разность упрощается применением radcan до нуля.

Примеры:

(%i1)	(log(x+x^2)-log(x))^a/log(1+x)^(a/2);
\frac{{\left( log\left( {x}^{2}+x\right) -log\left( x\right) \right) }^{a}}{{log\left( x+1\right) }^{\frac{a}{2}}}\leqno{(\%o1) }
(%i2)	radcan(%);
{log\left( x+1\right) }^{\frac{a}{2}}\leqno{(\%o2) }
(%i10)	(%e^x-1)/(1+%e^(x/2));
\frac{{e}^{x}-1}{{e}^{\frac{x}{2}}+1}\leqno{(\%o10) }
(%i11)	radcan(%);
{e}^{\frac{x}{2}}-1\leqno{(\%o11) }

Функция logcontract(expr) рекурсивно сканирует выражение expr, преобразуя выражения вида a1*log(b1) + a2*log(b2) + c к форме log(ratsimp(b1^{a1} * b2^{a2})) + c.

Пример:

(%i1)	2*(a*log(x)+3*b*log(y));
2\,\left( 3\,b\,log\left( y\right) +a\,log\left( x\right) \right) \leqno{(\%o1) }
(%i2)	logcontract(%);
b\,log\left( {y}^{6}\right) +a\,log\left( {x}^{2}\right) \leqno{(\%o2) }

Если объявить переменную n целой (используя declare(n,integer)), функция logcontract позволяет включить эту переменную в показатель степени:

(%i1)	declare(n,integer);
done\leqno{(\%o1) }
(%i2)	logcontract(3*a*n*log(x));
a\,log\left( {x}^{3\,n}\right) \leqno{(\%o2) }

2.7.9 Пользовательские функции

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

Пример:

sin(x);
integrate(sin(x),x,-5,5);
plot2d([sin(x)+3,cos(x)],[x,-%pi,%pi],[y,-5,5]);

Пользователь может задать собственные функции. Для этого сначала указывается название функции, в скобках перечисляются названия аргументов, после знаков := (двоеточие и равно) следует описание функции. После задания пользовательская функция вызывается точно так, как и встроенные функции Maxima.

Пример:

(%i44)	f(x):=x^2;
f(x):=x^2\leqno{(\%o44) }
(%i45)	f(3 + 7);
100\leqno{(\%o45) }

Не следует использовать для функций названия, зарезервированные для встроенных функций Maxima. Для создания функций используется также встроенная функция define, которая позволяет преобразовать выражение в функцию. Синтаксис вызова define довольно многообразен:

  • define(f(x_1,... ,x_n),expr)
  • define(f[x_1,... ,x_n],expr)
  • define(funmake(f, [x_1,... ,x_n]),expr)
  • define(arraymake(f, [x_1,... ,x_n]),expr)
  • define(ev(expr_1),expr_2)

Варианты вызова функции define различаются, какой именно объект создаётся: ординарная функция (аргументы в круглых скобках) или массив (аргументы в квадратных скобках). Если первый аргумент — операторы funmake, arraymake, то функция создаётся и вычисляется (аналогично и ev).

Примеры:

Ординарная функция:

(%i1)	expr : cos(y) - sin(x);
cos\left( y\right) -sin\left( x\right) \leqno{(\%o1) }
(%i2)	define (F1 (x, y), expr);
F1\left( x,y\right) :=cos\left( y\right) -sin\left( x\right) \leqno{(\%o2) }
(%i3)	factor(F1(a,b));
cos\left( b\right) -sin\left( a\right) \leqno{(\%o3) }

Создание функции-массива:

(%i1)	define (G2 [x, y], x.y - y.x);
{G2}_{x,y}:=x.y-y.x\leqno{(\%o1) }

Создание массива:

(%i2)	define (arraymake (F, [u]), cos(u) + 1);
{F}_{u}:=cos\left( u\right) +1\leqno{(\%o2) }

Использование функции ev для задания пользовательской функции:

(%i3)	define (ev (foo (x, y)), sin(x) - cos(y));
foo\left(x,y\right) :=sin\left(x\right) - cos\left(y\right) \leqno{(\%o3) }