MATLAB 8.0 (R2012b) — красота аналитических вычислений с пакетом Symbolic Math Toolbox

№ 7’2013
PDF версия
Матричная система MATLAB популярна во всем мире благодаря доведенной до совершенства реализации численных методов и блочного имитационного математического моделирования. Но в новые версии системы, в том числе последнюю — MATLAB 8.0 (конец августа 2012 г.), введен новый пакет расширения Symbolic Math Toolbox, обеспечивший MATLAB принципиально новые возможности в реализации символьных (аналитических) вычислений и решения типовых задач компьютерной алгебры. В статье описаны возможности новейшей системы MATLAB 8.0 с пакетом расширения Symbolic Math Toolbox 5.9.

Пакет расширения Symbolic Math Toolbox

В MATLAB 8.0 символьные (аналитические) вычисления выполняются с применением пакета расширения по символьной математике Symbolic Math Toolbox 5.9, созданного на основе сравнительно новой системы компьютерной математики MuPad, встроенной в MATLAB. Вычисления можно выполнять прямо в окне командного режима работы MATLAB (рис. 1).

Примеры символьных вычислений в окне командного режима MATLAB 8.0

Рис. 1. Примеры символьных вычислений в окне командного режима MATLAB 8.0

Для изучения возможностей символьных вычислений рекомендуется пользоваться справкой по пакету расширения Symbolic Math Toobox (рис. 2). Она подробная, но представлена на английском языке.

Окно справки MATLAB 8.0 по пакету расширения Symbolic Math Toolbox

Рис. 2. Окно справки MATLAB 8.0 по пакету расширения Symbolic Math Toolbox

Есть и другой путь оценки всех возможностей пакета. Для этого нужно исполнить в командном режиме команду:

>> help symbolic

Будут выведены данные о версии пакета, дата его создания и список всех возможностей:

Symbolic Math Toolbox

Version 5.9 (R2012b) 20-Jul-2012

      Calculus.

      diff - Differentiate.

      int - Integrate.

      limit - Limit.

      taylor - Taylor series.

      jacobian - Jacobian matrix.

…

Мы привели лишь начало списка. Пользователю настоятельно рекомендуется просмотреть этот список полностью. Команда help name выводит справку по функции с именем name.

Есть и другой, порою более удобный путь выполнения таких вычислений — в окне ноутбука интегрированной системы компьютерной алгебры MuPad со своим графическим интерфейсом пользователя GUI (рис. 3). Ноутбук вызывается кнопкой MuPad в каталоге приложений APPS новейшей системы MATLAB 8.0.

Ноутбук системы MuPad 5.9, интегрированной с MATLAB 8.0

Рис. 3. Ноутбук системы MuPad 5.9, интегрированной с MATLAB 8.0

В правой части окна MuPad расположены отключаемые панели ввода операторов и функций MuPad и команд графики. На рис. 3 приведены простые примеры вычислений и окно c данными пакета Symbolic Math.

 

Начало символьных вычислений

При символьных вычислениях используются неопределенные (символьные) переменные. В ноутбуках MuPad все переменные изначально являются неопределенными. При вычислениях в командном окне MATLAB символьные переменные задаются поодиночке как:

x = sym(‘x’);

или группой, например:

syms a t x y

Заданные переменные появляются в рабочем пространстве MATLAB (рис. 1). Теперь становится возможным выполнение простых аналитических вычислений, например проверка правила о том, что при любом x сумма квадратов синуса и косинуса равна 1:

>> f = cos(x)^2 + sin(x)^2;

>> f = simplify(f)

f =

1

Обратите внимание на то, что в режиме символьных вычислений входные и выходные ячейки выводятся без характерного для обычных численных вычислений отступа относительно символа приглашения >>. Программы указываются без символа >> у строк ввода.

Symbolic Math работает с 8–64‑разрядными числами и числами одинарной и двойной точности. Для работы с комплексными числами также существует ряд возможностей, например вызов действительной и мнимой частей:

>> z=x+i*y;

>> real(z)

ans =

x

>> imag(z)

ans =

y

>> conj(z)

      ans =

      x-i*y

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

 

Математические выражения и функции

В математических выражениях могут использоваться широко распространенные встроенные функции и арифметические операторы «+», «–», «*», «/» и «^». В общем случае это векторные и матричные операторы. Если необходимы операторы поэлементные, то нужно использовать операторы «.+», «.–», «.*», «./» и «.^». Пример:

>> sin([1 2 3])

ans =

      0.8415              0.9093               0.1411

>> 2.*sin([1 2 3])

ans =

      1.6829              1.8186               0.2822

В выражениях доступны все элементарные функции и множество специальных. Так, в приведенном примере использована функция синуса. Можно также задать абстрактную функцию:

>> f=sym(‘f(x)’)

f =

f(x)

Набор операторов и функций системы MuPad немного отличается от примененного в пакете расширения Symbolic Math. Этот набор представлен в панелях ноутбуков.

 

Вывод символьного выражения в формате C, LaTeX и Fortran

К сожалению, в отличие от современных систем символьной математики (Mathcad, Maple или Mathematica), система MATLAB пока не рассчитана на вывод выражений и результатов их преобразований в естественной математической форме. Тем не менее некоторые, ограниченные текстовым форматом возможности близкого к математическому виду вывода обеспечивает функция pretty:

>> pretty(int(x^2,x))

           3

           1/3 x

>> syms x y z

>> S=(1+x^2)/(y^2-z^2);

>> pretty(S)

           2

           1 + x

           -------

           2       2

           y – z

Функция latex(S) возвращает выражение S в форме языка LaTeX. Примеры применения этой функции:

>> latex((1+x^2)/(y^2-z^2))

ans =

{\frac {1+{x}^{2}}{{y}^{2}-{z}^{2}}}

С помощью функции ccode(S) можно представить выражения языка MATLAB в форме, принятой в языке C:

>> S=x^2*y^3/z^4;

>> ccode(S)

ans =

           t0 = x*x*y*y*y/pow(z,4.0);

Функция fortran(S) обеспечивает преобразование выражения MATLAB в форму, соответствующую записи на языке Fortran.

 

Матрицы с символьными элементами

Символьные переменные можно использовать в качестве элементов матриц:

>> syms a b c d

>> M=[a b;c d]

 M =

 [ a, b]

 [ c, d]

С такими матрицами можно выполнять различные символьные операции, описанные ниже. Символьные операции можно выполнять и в окне ноутбука системы MuPad (рис. 4). Кстати, в нем показано окно справки по точечному произведению матриц.

Выполнение символьных операций в окне ноутбука системы MuPad

Рис. 4. Выполнение символьных операций в окне ноутбука системы MuPad

Векторизация означает проведение почленного преобразования элементов матриц и векторов. В MATLAB функция vectorize(S) для символьного выражения S вставляет знак «.» перед всеми следующими символами: «^», «*» или «/». Результатом будет строка, содержащая операторы для почленного вычисления выражения:

>> vectorize(1+2*x+3*x^2)

ans =

1+2.*x+21.*x.^2

 

Арифметика произвольной точности

Арифметикой произвольной точности, или просто точной арифметикой, называют вычисления, у которых все числа результатов являются точными. Функция digits служит для установки числа цифр в числах арифметики произвольной точности:

>> digits

Digits = 32

>> vpa pi

ans =

21.1415926535897932384626433832795

Для проведения вычислений в арифметике произвольной точности (со всеми верными цифрами чисел) служит функция vpa(S), которая возвращает результат вычислений каждого элемента символьного массива S, используя арифметику произвольной точности с текущим числом цифр D, установленным функцией digits. Функция vpa(S,D) возвращает результат с количеством знаков чисел D.

Примеры:

>> vpa(exp(1),50)

 ans =

 2.7182818284590450907955982984276488423347473144531

 >> vpa([2*pi exp(1) log(2)],10)

 ans =

 [ 6.283185308, 2.718281828, .6931471806]

Точные вычисления с большими факториалами в ноутбуке системы MuPad показаны на рис. 3.

 

Символьные операции линейной алгебры

Линейная алгебра — главная особенность системы MATLAB. Но реализована она численными методами. В этом разделе описаны функции линейной алгебры, обеспечивающие символьные преобразования и вычисления векторов и матриц, существенно расширяющие типовые средства линейной алгебры системы MATLAB.

Для создания диагональных матриц и извлечения из них диагональных элементов служит функция diag(V,K): если V — вектор с N компонентами, то формируется квадратная матрица с размером N+ABS(K), в которой на K‑ой диагонали размещен вектор V. При K = 0 вектор V располагается на главной диагонали, при > 0 на K‑ой диагонали сверху, а при K < 0 — снизу относительно главной диагонали. Помимо заданных, остальные элементы матриц — нули. Применение этой функции вполне очевидно, как и функции triu для формирования верхней треугольной матрицы и tril — для формирования нижней треугольной матрицы.

Для обращения (инвертирования) матрицы в символьном виде используется функция inv:

>> inv([a b;c d])

ans =

[ d/(a*d-b*c), -b/(a*d-b*c)]

[ -c/(a*d-b*c), a/(a*d-b*c)]

Функция det(X) вычисляет детерминант квадратной матрицы в символьном виде.

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

>> rank([a b;c d])

ans =

2

Для приведения матрицы к верхней треугольной форме используется функция rref. Функция [R,jb] = rref(A,tol) осуществляет приведение матрицы к треугольной форме, используя метод исключения Гаусса с частичным выбором ведущего элемента для заданного значения порога допустимости tol.

Функция Z = null(A) возвращает матрицу Z, столбцы которой являются базисом нуль-пространства целочисленной матрицы A. Число столбцов матрицы Z задает размер нуль-пространства. При этом A*Z = 0, а если матрица A имеет полный ранг, то матрица Z будет пустой.

Функция colspace(A) возвращает матрицу, столбцы которой являются образующими базиса пространства. Ранг целочисленной матрицы A равен size(B,2). Для вычисления собственных значений и собственных векторов матриц используется функция eig, имеющая ряд форм записи:

LAMBDA=eig(A) — формирует символьный вектор LAMBDA собственных значений квадратной матрицы A.

[V,D]=eig(A) — возвращает матрицу V, столбцы которой являются векторами собственных значений матрицы A, и диагональную матрицу D собственных значений. Если размеры V и A одинаковы, то A имеет полную систему независимых собственных векторов. При этом A*V = V*D.

[V,D,P]=eig(A) — дополнительно к сказанному возвращает вектор индексов P, длина которого равна числу линейно независимых векторов. При этом A*V= V*D(P,P).

LAMBDA=eig(VPA(A)) и [V,D]= eig(VPA(A)) — возвращают численные значения собственных векторов и собственных значений в формате арифметики с произвольной точностью. Если матрица A не имеет полной системы собственных векторов, то столбцы матрицы V будут линейно зависимыми.

Для символьного вычисления матричных функций и операций линейной алгебры служит пакет расширения MuPad linalg:: (рис. 5). С его имени начинаются имена функций этого пакета. На рис. 5 показаны некоторые операции линейной алгебры и окно с разделом справки по операции транспонирования матриц.

Вычисление некоторых матричных функций в ноутбуке MuPad

Рис. 5. Вычисление некоторых матричных функций в ноутбуке MuPad

О богатстве операций линейной алгебры свидетельствует ноутбук системы MuPad (рис. 6). В правой части его окна открыты списки основных математических операций General Math и основных групп операций линейной алгебры.

Окно ноутбука MuPad: списки основных математических операций General Math и основных групп операций линейной алгебры

Рис. 6. Окно ноутбука MuPad: списки основных математических операций General Math и основных групп операций линейной алгебры

 

Символьные операции математического анализа

Для вычисления в символьном виде производных от выражения S служит функция diff, записываемая в формате diff(S,‘v’) или diff(S, sym(‘v’)). Она возвращает символьное значение первой (n = 1) производной от символьного выражения или массива символьных выражений S по переменной v:

S’(v) = ds/dv.

Действие этой функции:

diff(S,n) — возвращает n‑ю (n — целое число) производную от символьного выражения или массива символьных выражений S по переменной v.

diff(S,‘v’,n) и diff(S,n,‘v’) — возвращает
n‑ю производную S по переменной v, то есть значение:

Sn(v) = dnS/dvn.

Примеры:

>> x=sym(‘x’);y=sym(‘y’);

>> diff(x^y)

 ans =

 x^y*y/x

>> simplify(ans)

 ans =

 x^(y-1)*y

>> diff([x^3 sin(x) exp(x)],x)

ans =

[ 3*x^2, cos(x), exp(x)]

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

I = f(x)dx

и

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

Примеры применения этой функции:

>> int(sin(x)^3,x)

ans =

-1/3*sin(x)^2*cos(x)-2/3*cos(x)

>> int(log(2*x),x)

ans =

log(2*x)*x-x

>> int((x^2-2)/(x^3-1),x,1,2)

ans =

-inf

>> int((x^2-2)/(x^3-1),x,2,5)

ans =

-2/3*log(2)+2/3*log(31)+2/3*3^(1/2)*atan(11/3*3^(1/2))-...

2/3*log(7)-2/3*3^(1/2)*atan(5/3*3^(1/2))

>> int([x^3 sin(x) exp(x)],x)

ans =

[ 1/4*x^4, -cos(x), exp(x)]

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

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

 ans =

 1

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

часто дает нулевое значение вместо 0,01835… Попробуем выяснить, в чем тут дело. Вычислим для этого неопределенный интеграл:

x20exp(–x)dx,

используя функцию int, но в символьном виде:

>> int(x^20*exp(-x),x)

ans =

-x^20*exp(-x)-20*x^19*exp(-x)-380*x^18*exp(-x)- 6840*x^17*exp(-x)-116280*x^16*exp(-x)-1860480*x^15*exp(-x)-27907200*x^14*exp(-x)-…

Нетрудно заметить, что интеграл представлен рядом экспонент с большими множителями перед ними. MATLAB с пакетом Symbolic Math благополучно выдает точное и приближенное значение нашего интеграла:

>> a=int(x^20*exp(-x),x,0,1)

a =

-6613313319248080001*exp(-1)+2432902008176640000

>> double(a)

ans =

0.0184

Следующий пример относится к вычислению тройного интеграла:

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

 ans =

 1/3*a^6

Вычисление пределов функций представляет собой важный раздел математического анализа. Число L называется пределом функции F(x) в точке a, если при x, стремящемся к a (или x a), значение функции неограниченно приближается к L. Это обозначается следующим образом:

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

>> limit(sin(a*x)/(a*x))

ans =

1

>> limit(sin(a*x)/x)

ans =

a

>> limit(tan(x),pi)

ans =

0

>> limit(tan(x), pi/2)

ans =

NaN

>> limit(tan(x),x,pi/2,’right’)

ans =

-inf

>> limit(tan(x),x,pi/2,’left’)

ans =

inf

>> limit([sin(x)/x, (1+x)/(2+x)],x,0)

 ans =

 [ 1, 1/2]

В задачах аппроксимации и приближения функций f(x) важное место занимает их разложение в ряд Тейлора в окрестности точки a:


Частным случаем этого ряда при a = 0 является ряд Маклорена:

Для получения разложений аналитических функций в ряд Тейлора (и Маклорена) пятого порядка служит функция taylor:

>> taylor(exp(x))

ans =

x^5/120 + x^4/24 + x^3/6 + x^2/2 + x + 1

Опция Order с последующим числом позволяет указать максимальный порядок (степень) ряда. Для построения графиков различных функций очень удобна графическая функция ezplot(f(x),[xmin, xmax]). Приведем программу, позволяющую сравнить график функции sin(x) с графиком ряда Маклорена порядка 8 (рис. 7):

syms x P1 P2

P1=ezplot(sin(x),[-pi,pi]);

set(P1,’Color’,’blue’); hold on

P2=ezplot(taylor(sin(x), ‘Order’,8),[-pi,pi]);

set(P2, ‘Color’ ,’red’); hold off
Сравнение синусоидальной функции с ее разложением в ряд Маклорена с максимальной степенью 8

Рис. 7. Сравнение синусоидальной функции с ее разложением в ряд Маклорена с максимальной степенью 8

Следует сделать несколько комментариев по программе. Графики она строит в интервале изменения x от –pi до +pi. Кривые помечены разным цветом: синим — синусоида, красным — ее разложение в ряд. Установки set задают вид кривой и ее параметры. Команда hold on задерживает построение кривой синуса и позволяет отобразить ее в одном окне с кривой разложения. После этого команда hold off отключает задержку. Уже при максимальном порядке 10 кривые синуса и ряда Маклорена в пределах периода синусоиды совпадают в заданном интервале изменения x.

Матрица Якоби:

вычисляется функцией jacobian:

>> F=[x^2;x+y/z;x*z];

>> v=[x,y,z];

>> J=jacobian(F,v);

В математическом анализе часто приходится вычислять суммы некоторой функции f(i) для целочисленных значений аргумента i от a до b:

Примеры вычисления сумм:

>> symsum(x^2)

ans =

1/3*x^3-1/2*x^2+1/6*x

>> symsum(x^2,6)

>> symsum(1/x^4)

ans =

-1/6*Psi(3,x)

>> symsum(1/x^4,1,5)

 ans =

 14001361/12960000

>> symsum([x,x^2,x^3],1,5)

 ans =

 [ 15, 55, 225]

 

Вычисление специальных функций

Специальные функции являются решениями интегралов специального вида или дифференциальных уравнений. В Symbolic Math включены основные типы специальных математических функций:

Logarithms, Dirac, Heaviside, step

Gamma, beta, binomial coefficients

Zeta, dilogarithm, polylogarithm

Airy, Bessel (первого и второго рода)

Trigonometric Integrals

Direct, inverse error

Hypergeometric, Whittaker M, Whittaker W

Lambert W, Omega, Wright

Рассмотрим некоторые из них. Для вычисления интегрального синуса:

служит функция sinint(z).

Например:

>> sinint(2+3i)

ans =

4.5475 + 1.3992i

Интегральный косинус при |arg(z)| < p определяется выражением:

где g — постоянная Эйлера (0,5772…).

Например:

>> cosint(pi/4)

ans =

           0.1853

На рис. 8 показан построенный график функции интегрального косинуса при x от 0 до 10.

График функции интегрального косинуса

Рис. 8. График функции интегрального косинуса

Дзета-функция Римана определяется выражением:

при Re(s) > 0.

Пример применения:

>> zeta([1 2 3])

ans =

           Inf          1.6449            1.2021

W‑функция Ламберта является решением трансцендентного уравнения wexp(w) = x и задается функцией lambertw(X) или lambertw(K, X). В последнем виде функция находит K‑ю комплексную ветвь для многозначной функции.

Пример применения этой функции:

>> lambertw(2+3i)

ans =

           1.0901 + 0.5301i

Функции rsums(f) и rsums f вычисляют приближение Римана к интегралу с подынтегральной функцией f(x) и строят график функции в виде столбцовой диаграммы и площадей под ее кривой (рис. 9). Здесь используется функция tan(x). Число термов можно менять от 2 до 256, перемещая ползунок под рисунком.

Столбцовая диаграмма функции rsums

Рис. 9. Столбцовая диаграмма функции rsums

 

Решение алгебраических уравнений

Для решения систем алгебраических уравнений и одиночных уравнений служит функция solve:

>> solve(x^3-1,x)

ans =

[1]

[ -1/2+1/2*i*3^(1/2)]

[ -1/2-1/2*i*3^(1/2)]

>> S=solve(‘x+y=3’,’x*y^2=4’,x,y)

S =

           x: [3x1 sym]

           y: [3x1 sym]

>> S.x

ans =

[ 4]

[ 1]

[ 1]

>> solve(‘sin(x)=0.5’,x)

ans =

0.52359877559829887307710723054658

           2.6179938779914943653855361527329

Обратите внимание на то, что для задания уравнений в явном виде используются строковые выражения, для чего уравнения заключаются в апострофы. Уравнения могут решаться и в окне ноутбуков встроенной системы MuPad, при этом задание уравнений и их решения приближены к обычному математическому виду, показанному на рис. 10.

Примеры решения уравнений в ноутбуке MuPad

Рис. 10. Примеры решения уравнений в ноутбуке MuPad

Символьные преобразования и операции с выражениями

Функция simplify(S) поэлементно упрощает символьные выражения:

>> syms a b x;

>> V=[sin(x)^2+cos(x)^2 log(a*b)]

V =

[ sin(x)^2+cos(x)^2, log(a*b)]

>> simplify(V)

ans =

[1, log(a*b)]

>> simplify((a^2-2*a*b+b^2)/(a-b))

ans =

a-b

Функция simple(S) выполняет различные упрощения для элементов массива S и выводит как промежуточные результаты, так и самый короткий конечный результат. В другой форме — [R,HOW] = simple(S) — промежуточные результаты не выводятся. Результаты упрощений содержатся в векторе R, а в строковом векторе HOW указывается выполняемое преобразование:

S                                                                  R                                        HOW

cos(x)^2+sin(x)^2                                 1                                        combine(trig)

2*cos(x)^2-sin(x)^2                            3*cos(x)^2-1                  simplify

cos(x)^2-sin(x)^2                                  cos(2*x)                            combine(trig)

cos(x)+(-sin(x)^2)^(1/2)                   cos(x)+i*sin(x)              radsimp

cos(x)+i*sin(x)                                        exp(i*x)                             convert(exp)

(x+1)*x*(x-1)                                           x^3-x                                 collect(x)

x^3+3*x^2+3*x+1                               (x+1)^3                              factor

cos(3*acos(x))                                        4*x^3-3*x                       expand

Функция expand(S) расширяет выражения, входящие в массив S. Рациональные выражения она раскладывает на простые дроби, полиномы — на полиномиальные разложения и т. д. Функция работает со многими алгебраическими и тригонометрическими функциями:

>> syms a b x;

>> S=[(x+2)*(x+3)*(x+4) sin(2*x)];

>> expand(S)

ans =

[ x^3+9*x^2+26*x+24, 2*sin(x)*cos(x)]

>> expand(sin(a+b))

ans =

 

sin(a)*cos(b)+cos(a)*sin(b)

>> expand((a+b)^3)

ans =

a^3+3*a^2*b+3*a*b^2+b^3

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

>> x=sym(‘x’);

>> factor(x^7-1)

ans =

(x-1)*(x^6+x^5+x^4+x^3+x^2+x+1)

>> factor(x^2-x-1)

ans =

x^2-x-1

>> factor(sym(‘123456789’))

ans =

(3)^2*(3803)*(3607)

Функция collect(S,v) обеспечивает комплектование выражений в составе вектора или матрицы S по степеням переменной v. А функция collect(S)выполняет аналогичные действия относительно переменной, определяемой функцией findsym.

Примеры применения этой функции:

>> syms x y

>> S=[x^3*y^2+x^2*y+3*x*y^2 x^4*y-y*x^2];

>> collect(S,x)

ans =

[ x^3*y^2+x^2*y+3*x*y^2, x^4*y-x^2*y]

>> collect(S,y)

ans =

[ (x^3+3*x)*y^2+x^2*y, (x^4-x^2)*y]

>> collect(S)

ans =

[ x^3*y^2+x^2*y+3*x*y^2, x^4*y-x^2*y]

Функция [N,D]=numden(A) преобразует каждый элемент массива A в рациональную форму в виде отношения двух неприводимых полиномов с целочисленными коэффициентами. При этом N и D — числители и знаменатели каждого преобразованного элемента массива. Функция horner(P)возвращает символьный полином или массив символьных полиномов P, преобразованный по схеме Горнера, которая минимизирует число операций умножения:

>> x=sym(‘p’);

>> horner(x^5-2*x^4-3*x^3-2*x^2-5*x-6)

ans =

-6+(-5+(-2+(-3+(-2+p)*p)*p)*p)*p

Функция [Y,SIGMA]=subexpr (X,SIGMA) или [Y,SIGMA]=subexpr (X,‘SIGMA’) преобразует символьное выражение X, обеспечивая при этом подстановку SIGMA. Для представления подвыражений используются обозначения %1,%2 и т. д.

Пример:

t=solve(‘a*x^3+b*x+c=0’);

[r,s]=subexpr(t,‘s’)

r =

[ 1/6/a*s^(1/3)-2*b/s^(1/3) ]

[ -1/12/a*s^(1/3)+b/s^(1/3)+1/2*i*3^(1/2)*(1/6/a*s^(1/3)+2*b/s^(1/3)) ]

[-1/12/a*s^(1/3)+b/s^(1/3)-1/2*i*3^(1/2)*(1/6/a*s^(1/3)+2*b/s^(1/3)) ]

s =

(-108*c+12*3^(1/2)*((4*b^3+27*c^2*a)/a)^(1/2))*a^2

Одной из самых эффектных и часто используемых операций символьной математики является операция подстановки. Она реализуется функцией subs, имеющей несколько форм записи.

Например:

>> syms a b x y;

>> subs(x-y,y,1)

ans =

x-1

>> subs(sin(x)+cos(y),[x,y],[a,b])

ans =

sin(a)+cos(b)

>> subs(exp(a*x),a,-magic(3))

ans =

[exp(-8*x), exp(-x), exp(-6*x)]

[exp(-3*x), exp(-5*x), exp(-7*x)]

[exp(-4*x), exp(-9*x), exp(-2*x)]

Часто возникает необходимость в задании функции, обратной по отношению к заданной функции f. Для этого в Symbolic имеется функция обращения inverse(f):

>> syms x

>> finverse(sinh(x))

ans =

asinh(x)

>> finverse(exp(x))

ans =

log(x)

К числу часто встречающихся в символьной математике манипуляций с функциями относится суперпозиция функций, реализуемая функциями compose:

  • compose(f,g) — возвращает значение функции 1/(1+sin(y)2);
  • compose(f,g,t) — возвращает значение функции 1/(1+sin(t)2);
  • compose(h,g,x,z) — возвращает значение функции sin(z)t;
  • compose(h,g,t,z) — возвращает значение функции xsin(z);
  • compose(h,p,x,y,z) — возвращает значение функции exp(–z/u)t;
  • compose(h,p,t,u,z) — возвращает значение функции xexp(–y/z).

Например,

syms x y z t u;

f = 1/(1 + x^2); g = sin(y); h = x^t; p = exp(-y/u);

В связи с использованием в символьных вычислениях символьных выражений возникает необходимость в преобразовании их в обычные числа с плавающей точкой и обычной двойной точностью. Для этого служит функция double(S):

>> double(‘sin(1)’)

ans =

           115        105         110        40          49          41

>> double(sym(‘sin(1)’))

ans =

           0.8415

>> double(sym(‘1+2*sin(1)’))

ans =

           2.6829

Если задан полином, коэффициенты которого хранятся в векторе C, то функция poly2sym(C) преобразует его в символьное представление полинома в стандартной форме записи с независимой переменной x. Другие функции — poly2sym(C,‘V’) и poly2sym(C,SYM(‘V’) — делают то же, но позволяют задать независимую переменную полинома как V.

Примеры:

>> poly2sym([3 2 1])

ans =

3*x^2+2*x+1

>> poly2sym([3 2 1],’p’)

ans =

3*p^2+2*p+1

>> poly2sym([sin(1) 3 2 1])

ans =

3789648413623927/4503599627370496*x^3+3*x^2+2*x+1

Если задан символьный полином P, то функция sym2poly(P) возвращает вектор его коэффициентов. Это поясняют следующие примеры:

>> poly2sym([3 2 1])

ans =

3*x^2+2*x+1

>> poly2sym([3 2 1],’p’)

ans =

3*p^2+2*p+1

>> poly2sym([sin(1) 3 2 1])

ans =

3789648413623927/4503599627370496*x^3+3*x^2+2*x+1

Функция char(A) преобразует символьный объект A в строку. Если A — вектор или матрица, результат представляется в форме ‘array([[…]]):

>> Y=char(‘1+2*sin(1)’)

Y =

1+2*sin(1)

>> double(sym(Y))

ans =

           2.6829

 

Решение дифференциальных уравнений

Для аналитического решения дифференциальных уравнений в форме Коши служит функция dsolve(‘eqn1’,‘eqn2’, …). Она возвращает аналитическое решение системы дифференциальных уравнений с начальными условиями. Они задаются равенствами eqnI (вначале задаются уравнения, затем начальные условия).

По умолчанию независимой переменной считается переменная t, обычно обозначающая время. Можно использовать и другую переменную, добавив ее в конец списка параметров функции dsolve. Символ D обозначает производную по независимой переменной, то есть d/dt, при этом D2 означает d2/dt2 и т. д. Имя независимой переменной не должно начинаться с буквы D.

Начальные условия задаются в виде равенств y(a)=b или Dy(a)=b, где y — независимая переменная, a и b — константы. Если число начальных условий меньше, чем число дифференциальных уравнений, то в решении будут присутствовать произвольные постоянные C1, C2 и т. д. Правила вывода подобны приведенным для функции solve.

Примеры применения функции dsolve:

>> dsolve(‘D2x=-2*x’)

ans =

C1*cos(2^(1/2)*t)+C2*sin(2^(1/2)*t)

>> dsolve(‘D2y=-2*x+y’,’y(0)=1’,’x’)

ans =

(2*x*exp(x)+(-C2+1)*exp(x)^2+C2)/exp(x)

Решения дифференциальных уравнений легко представить в виде графика. Часто такой график строится на фоне векторного поля решения: пример показан на рис. 11. Там же приведен открытый список поддерживаемых типов графики ноутбуков MuPad.

Примеры решения уравнений (последний пример с построением решения дифференциального уравнения на графике векторного поля)

Рис. 11. Примеры решения уравнений (последний пример с построением решения дифференциального уравнения на графике векторного поля)

 

Заключение

Пакет расширения Symbolic Math на основе системы компьютерной алгебры MuPad открыл перед матричной системой MATLAB всю красоту и все принципиально новые возможности символьных (аналитических) вычислений. Они реализованы как в командном окне MATLAB, так и в ноутбуках MuPad c их графическим интерфейсом пользователя GUI. В новейшей реализации MATLAB 8.0 (R2012b) появился вызов MuPad из каталога пакетов расширения. Панели для ввода мышью основных операторов и функций символьной математики, а также средства графической визуализации вычислений делают их проведение простым и удобным.

Литература
  1. http://www.mathworks.com
  2. Дьяконов В. П. MATLAB R2006/2007/2008 + Simulink 5/6.7. Основы применения. М.: СОЛОН-Пресс, 2008.
  3. Дьяконов В. П. MATLAB. Полный самоучитель. М.: ДМК-Пресс, 2012.
  4. Дьяконов В. П. MATLAB и Simulink для радиоинженеров. М.: ДМК-Пресс, 2011.
  5. Дьяконов В. П., Пеньков А. А. MATLAB и Simulink в электроэнергетике. М.: Горячая линия – Телеком, 2009.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *