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

Основы Maxima

2.7.4 Математические функции

В Maxima имеется достаточно большой набор встроенных математических функций. Перечень основных классов встроенных функций приведён ниже:

  • тригонометрические функции: sin (синус), cos (косинус), tan (тангенс), cot (котангенс);
  • обратные тригонометрические функции: asin (арксинус), acos (арккосинус), atan (арктангенс), acot (арккотангенс);
  • sec (секанс, sec (x) = \frac{1}{cos (x)}, csc (косеканс, csc (x) = \frac{1}{sin (x}));
  • sinh (гиперболический синус), cosh (гиперболический косинус), tanh (гиперболический тангенс), coth (гиперболический котангенс), sech (гиперболический секанс), cosh (гиперболический косеканс);
  • log (натуральный логарифм);
  • sqrt (квадратный корень);
  • mod (остаток от деления);
  • abs (модуль);
  • min(x_1,... ,x_n) и max(x_1,... ,x_n) — нахождение минимального и максимального значения в списке аргументов;
  • sign (определяет знак аргумента: pos — положительный, neg — отрицательный, pnz — не определён, zero — значение равно нулю);
  • Специальные функции — функции Бесселя, гамма-функция, гипергеометрическая функция и др.;
  • Эллиптические функции различных типов.

2.7.5 Вычисление и преобразование аналитических выражений

Функция ev является основной функцией, обрабатывающей выражения. Синтаксис вызова: ev(expr,arg_1,... ,arg_n)

Функция ev вычисляет выражение expr в окружении, определяемом аргументами arg_1,... ,arg_n. Аргументы могут быть ключами (булевскими флагами, присваиваниями, уравнениями и функциями. Функция ev возвращает результат (другое выражение).

Во многих случаях можно опускать имя функции ev (т.е. применять значения переменных к некоторому выражению)

expr,flag1,flag2,\dots\\
expr,x=val1,y=val2,\dots\\
expr,flag1,x=val1,y=val2,flag2,\dots

На выражение expr по умолчанию действует функция упрощения. Необходимость выполнения упрощения регулируется флагом simp (если установить simp = false, упрощение будет отключено). Кроме того, используют флаги float и numer, определяющие формат представления рациональных чисел (в виде дробей или с плавающей точкой) и результатов вычисления математических функций. Флаг pred определяет необходимость вычисления применительно к логическим выражениям.

Аргументами ev могут быть и встроенные функции, выполняющие упрощение или преобразование выражений (expand, factor, trigexpand, trigreduce) или функция diff.

Если указаны подстановки (в виде x = val1 или x : val2), то они выполняются.

При этом повторный вызов функции ev вполне способен ещё раз изменить выражение, т.е. обработка выражения не идёт до конца при однократном вызове функции ev.

Пример:

(%i1)	ev((a+b)^2,expand);
{b}^{2}+2\,a\,b+{a}^{2}\leqno{(\%o1) }
(%i2)	ev((a+b)^2,a=x);
{\left( x+b\right) }^{2}\leqno{(\%o2) }
(%i3)	ev((a+b)^2,a=x,expand,b=7)
{x}^{2}+14\,x+49\leqno{(\%o3) }

Другой пример показывает применение diff к отложенному вычислению производной:

(%i1)	sin(x) + cos(y) + (w+1)^2 + 'diff (sin(w), w);
cos\left( y\right) +sin\left( x\right) +\frac{d}{d\,w}\,sin\left( w\right) +{\left( w+1\right) }^{2}\leqno{(\%o1) }
(%i2)	ev (%, sin, expand, diff, x=2, y=1);
cos\left( w\right) +{w}^{2}+2\,w+cos\left( 1\right) +1.909297426825682\leqno{(\%o2) }

Флаг simp разрешает либо запрещает упрощение выражений. Изначально он равен true, если установить его равным false, то упрощения производиться не будут:

(%i1)	f:a+2*a+3*a+4*a;
10\,a\leqno{(\%o1) }
(%i2)	simp:false;
false\leqno{(\%o2) }
(%i3)	f:a+2*a+3*a+4*a;
a+2\,a+3\,a+4\,a\leqno{(\%o3) }

Функцию ev не обязательно указывать явно, например:

(%i3)	x+y, x: a+y, y: 2;
y+a+2\leqno{(\%o3) }

Оператор, принудительного вычисления, обозначенный двумя апострофами, является синонимом к функции ev(выражение). Сама функция ev предоставляет гораздо более широкие возможности, нежели простое принудительное вычисление заданного выражения: она может принимать произвольное число аргументов, первый из которых — вычисляемое выражение, а остальные — специальные опции, которые как раз и влияют на то, как именно будет производиться вычисление.

В терминологии Maxima невычисленная форма выражения называется "noun form", вычисленная — "verb form". Сохраняя лингвистические параллели, на русский это можно перевести как "несовершенная форма" и "совершённая форма". Значение вводимого выражения в Maxima закономерно сохраняется до его вычисления (т. е. в несовершенной форме), а значение выводимого выражения — после (т. е. в совершённой); другими словами, тут имеется естественный порядок "ввод — вычисление — вывод".

Функция factor факторизует (т.е. представляет в виде произведения некоторых сомножителей) заданное выражение (функция gfactor — аналогично, но на множестве комплексных чисел и выражений).

Пример:

(%i1)	x^3-1,factor;
\left( x-1\right) \,\left( {x}^{2}+x+1\right) \leqno{(\%o1) }
(%i2)	factor(x^3-1);
\left( x-1\right) \,\left( {x}^{2}+x+1\right) \leqno{(\%o2) }

Ещё примеры факторизации различных выражений:

(%i3)	factor (-8*y - 4*x + z^2*(2*y + x));
\left( 2\,y+x\right) \,\left( z-2\right) \,\left( z+2\right) \leqno{(\%o3) }
(%i4)	factor (2^63 - 1);
{7}^{2}\,73\,127\,337\,92737\,649657\leqno{(\%o4) }
(%i5)	factor (1 + %e^(3*x));
\left( {e}^{x}+1\right) \,\left( {e}^{2\,x}-{e}^{x}+1\right) \leqno{(\%o5) }

Пример использования функции gfactor:

(%i6)	gfactor(x^2+a^2);
\left( x-i\,a\right) \,\left( x+i\,a\right) \leqno{(\%o6) }
(%i7)	gfactor(x^2+2*%i*x*a-a^2);
{\left( x+i\,a\right) }^{2}\leqno{(\%o7) }

Функция factorsum факторизует отдельные слагаемые в выражении.

(%i8)	expand ((x + 1)*((u + v)^2 + a*(w + z)^2));
ax{z}^{2} + a{z}^{2} + 2awxz + 2awz + a{w}^{2}x + {v}^{2}x + 2uvx + {u}^{2}x + a{w}^{2} + {v}^{2} + 2uv + {u}^{2}\leqno{(\%o8) }
(%i9)	factorsum(%);
\left( x+1\right) \,\left( a\,{\left( z+w\right) }^{2}+{\left( v+u\right) }^{2}\right) \leqno{(\%o9) }

Функция gfactorsum отличается от factorsum тем же, чем gfactor отличается от factor:

(%i10)	gfactorsum( a^3+3*a^2*b+3*a*b^2+b^3+x^2+2*%i*x*y-y^2 );
{\left( b+a\right) }^{3}-{\left( y-i\,x\right) }^{2}\leqno{(\%o10) }

Функция expand раскрывает скобки, выполняет умножение, возведение в степень, например:

(%i1)	expand((x-a)^3);
{x}^{3}-3\,a\,{x}^{2}+3\,{a}^{2}\,x-{a}^{3}\leqno{(\%o1) }
(%i2)	expand((x-a)*(y-b)*(z-c));
x\,y\,z-a\,y\,z-b\,x\,z+a\,b\,z-c\,x\,y+a\,c\,y+b\,c\,x-a\,b\,c\leqno{(\%o2) }
(%i3)	expand((x-a)*(y-b)^2);
x\,{y}^{2}-a\,{y}^{2}-2\,b\,x\,y+2\,a\,b\,y+{b}^{2}\,x-a\,{b}^{2}\leqno{(\%o3) }

Функция combine объединяет слагаемые с идентичным знаменателем

(%i5)	combine(x/(1+x^2)+y/(1+x^2));
\frac{y+x}{{x}^{2}+1}\leqno{(\%o5) }

Функция xthru приводит выражение к общему знаменателю, не раскрывая скобок и не пытаясь факторизовать слагаемые

(%i6)	xthru( 1/(x+y)^10+1/(x+y)^12 );
\frac{{\left( y+x\right) }^{2}+1}{{\left( y+x\right) }^{12}}\leqno{(\%o6) }
(%i1)	((x+2)^20 - 2*y)/(x+y)^20 + (x+y)^(-19) - x/(x+y)^20;
\frac{1}{{\left( y+x\right) }^{19}}+\frac{{\left( x+2\right) }^{20}-2\,y}{{\left( y+x\right) }^{20}}-\frac{x}{{\left( y+x\right) }^{20}}\leqno{(\%o1) }
(%i2)	xthru (%);
\frac{{\left( x+2\right) }^{20}-y}{{\left( y+x\right) }^{20}}\leqno{(\%o2) }

Функция multthru умножает каждое слагаемое в сумме на множитель, причём при умножении скобки в выражении не раскрываются. Она допускает два варианта синтаксиса:

  • multthru(mult,sum);
  • multthru(expr);

В последнем случае выражение expr включает и множитель и сумму (см. (%i4) в примере ниже).

Пример:

(%i1)	x/(x-y)^2 - 1/(x-y) - f(x)/(x-y)^3;
-\frac{1}{x-y}+\frac{x}{{\left( x-y\right) }^{2}}-\frac{f\left( x\right) }{{\left( x-y\right) }^{3}}\leqno{(\%o1) }
(%i2)	multthru ((x-y)^3, %);
-{\left( x-y\right) }^{2}+x\,\left( x-y\right) -f\left( x\right) \leqno{(\%o2) }
(%i3)	((a+b)^10*s^2 + 2*a*b*s + (a*b)^2)/(a*b*s^2);
\frac{{\left( b+a\right) }^{10}\,{s}^{2}+2\,a\,b\,s+{a}^{2}\,{b}^{2}}{a\,b\,{s}^{2}}\leqno{(\%o3) }
(%i4)	multthru (%);
\frac{2}{s}+\frac{a\,b}{{s}^{2}}+\frac{{\left( b+a\right) }^{10}}{a\,b}\leqno{(\%o4) }

Функции assume (ввод ограничений) и forget (снятие ограничений) позволяют управлять условиями выполнения (контекстом) прочих функций и операторов.

Пример:

(%i20)	sqrt(х^2);
(%o20)		|x|
(%i21)	assume (x<0);
(%o21)		[ x< 0 ]
(%i22)	sqrt(х^2);
(%o22)		-x
(%i23)	forget(x<0);
(%o23)		[ x< 0 ]
(%i24)	sqrt (х^2) ;
(%o24)		|x|

Функция divide позволяет вычислить частное и остаток от деления одного многочлена на другой:

(%i1)	divide(x^3-2,x-1);
[{x}^{2}+x+1,-1]\leqno{(\%o1) }

Первый элемент полученного списка — частное, второй — остаток от деления.

Функция gcd позволяет найти наибольший общий делитель многочленов.

Подстановки осуществляются функцией subst. Вызов этой функции: subst(a,b,c) (подставляем a вместо b в выражении c).

Пример:

(%i1)	subst (a, x+y, x + (x+y)^2 + y);
y+x+{a}^{2}\leqno{(\%o1) }