lection_matlab_all / matlab_11
.pdfПосле задания символьных переменных их можно без ограничений использовать в качестве элементов массивов и в вычислениях с массивами:
>>syms a b c d;
>>М=[а b; c d] М =
[а, b] [с, d]
>>inv(M)
ans =
[ d/(a*d-b*c), -b/(a*d-b*c) ]
[ - с / ( a*d - b*c ), a / (a*d - b*c) ]
>> det (M) → ans = a*d - b*c
Одной из часто используемых операций символьной математики является операция подстановки subs:
•subs(S) — заменяет в символьном выражении s все переменные их символьными значениями, которые берутся из вычисляемой функции или рабочей области системы MATLAB;
•subs (S,NEW) — заменяет все свободные символьные переменные в s из списка NEW;
•subs (S, OLD, NEW) — заменяет OLD на NEW в символьном выражении s. При одинаковых размерах массивов OLD И NEW замена идет поэлементно. Если S и OLD — скаляры, a NEW — числовой массив или массив ячеек, то скалярырасширяются до массива результатов.
Примеры:
>>syms a b x у;
>>subs( х-у, у, 1 ) ans = х - 1
>>subs( sin(x) + cos(y), [х, у], [а, 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)]
В отличие от современных систем символьной математики (Mathcad, Maple или Mathematica), MATLAB пока не способна выводить выражения и результаты их преобразований в естественной математической форме — с использованием общепринятых спецзнаков для отображения интегралов, сумм, произведений и т. д. Этот недостаток, однако, часто оборачивается достоинством — запись осуществляется в простом текстовом формате, облегчающем ввод выражений. Да и вывод символьных выражений в таком формате поддерживается практически всеми устройствами вывода.
Некоторые ограниченные текстовым форматом возможности близкого к математическому виду вывода обеспечивает функция pretty:
•pretty(S) — дает вывод выражения s в формате, приближенном к математическому;
•pretty(S, n) — аналогична предшествующей функции, но задает вывод в п позициях строки (по умолчанию n = 79).
В выражениях используются надстрочные показатели степени и знаки деления в виде горизонтальной черты. Однако для простых констант (например, 1/3) по-прежнему используется знак деления в виде наклонной черты.
C помощью функции ccode (S) можно представить выражения языка MATLAB S в форме, принятой в языке С.
Пример:
>>syms х у z
>>ccode( (1+х^2)/(у^2-z^2) ) → ans = (1.0+x*x)/(y*y-z*z);
>>S = х^2*у^3/z^4;
>>ccode(S) → ans = x*x*y*y*y/pow(z, 4.0);
Применение функции ccdode облегчает программистам создание библиотек программ на языке С и уменьшает вероятность ошибок в математических выражениях. Аналогично работает и функция fortran.
MATLAB обычно ведет вычисления с числами, представленными в формате плавающей точки с двойной точностью. Однако ряд задач теории чисел, численного кодирования и некоторых других требует вы полнения вычислений вообще без какой-либо погрешности или со сколь угодно малой погрешностью. Такие вычисления не очень удачно называют арифметикой произвольной точности — правильнее говорить просто о точной арифметике.
Функция digits служит для установки числа цифр при расчётах в арифметике произвольной точности:
•digits — возвращает число значащих цифр в числах арифметики произвольной точности (по умолчанию 32);
•digits (D) — устанавливает заданное число цифр D для чисел арифметики произвольной точности (D — целое число, строка или переменная типа sym).
Пример:
>>digits( 6 )
>>pi → ans = 3.1416
Для проведения вычислений в арифметике произвольной точности служит функция vpa:
•R = vpa(S) — возвращает результат вычислений каждого элемента символьного массива S, используя арифметику произвольной точности с текущим числом цифр D, установленным функцией digits . Результат R имеет тип sym;
•vpa(S, D) — возвращает результат вычислений каждого элемента массива S, используя арифметику произвольной точности с количеством знаков чисел D.
Примеры:
>> vpa (exp(1), 50)
ans = 2.7182818284590450907955982984276488423347473144531
>> vpa([2*pi, exp(l), log(2)], 10)
ans = [ 6.283185308, 2.718281828, .6931471806]
>> vpa pi
ans = 3.1415926535897932384626433832795