ГЛАВА 7 СИМВОЛЬНЫЕ ВЫЧИСЛЕНИЯ
В предыдущих главах рассматривались численные процедуры MATLAB, выполняемые с аргументами, заданными в виде чисел или числовых массивов. В состав MATLAB входит пакет Symbolic Math ToolBox, который добавил к системе возможность символьных вычислений.Помимо типовых аналитических вычислений (таких, как упрощение математических выражений, подстановка, нахождение пределов, дифференцирование, интегрирование, интегральные преобразования, получение решений уравнений и систем уравнений, включая дифференциальные и т. д.), пакет Symbolic позволяет реализовывать арифметические операции с любой точностью. Функции пакета Symbolicреализуют интерфейс между средой MATLAB и ядром Maple системы аналитических вычислений или системы компьютерной алгебры канадского университета Waterloo, причем работа в MATLAB не требует установки Maple. Система Mapleв своем ядре и в расширениях имеет около 3000 функций. Система MATLAB с пакетом Symbolic, включающим в себя около сотни символьных команд и функций, намного уступает Maple по их количеству. Однако пользователь, имеющий опыт работы в Maple, может напрямую обращаться ко всем командам и процедурам этой системы (кроме графических), написанным на встроенном языке Maple (см. раздел 7.17). Способы получения справочной информации по пакету Symbolic рассмотрены в приложении 1.
Символьные переменные, константы и выражения
Поскольку переменные системы MATLAB по умолчанию не определены и традиционно задаются как векторные, матричные, числовые и т. д., т. е. не имеющие отношения к символьной математике, для реализации символьных вычислений нужно прежде всего позаботиться о создании специальных символьных переменных.
Для создания символьных переменных или объектов используется команда sym.
Например, команда
>>x=sym('x')
x =
x
возвращает символьную переменную с именем 'x' и записывает результат в х.
Команда x=sym('x','real') дополнительно определяет x как вещественную переменную. Аналогично x=sym('x','positive') определяет x как положительную (вещественную) переменную, а x=sym('x','unreal') – как чисто формальную переменную (т. е. не обладающую никакими дополнительными свойствами).
Для создания группы символьных объектов служит команда syms.
Команда
>> syms a b c
создает символьные переменные с именами a, b, c.
Команда
>> Pi=sym('pi');
создает символьное число Pi = π, не обладающее погрешностью представления числа π в формате с плавающей запятой. Результаты операций с символьным Piвыражаются не в числовой, а в символьной форме. Следовательно, пакет Symbolic позволяет получить точные значения тригонометрических функций (и их рациональных комбинаций) от аргумента π в виде выражений, включающих квадратные корни из рациональных чисел, если такие выражения существуют и могут быть найдены системой. Например, точное значение sin равно
>> S=sin(Pi/5)
S =
1/4*2^(1/2)*(5-5^(1/2))^(1/2)
Символьное выражение S выведено в командное окно в одну строку.
Команда pretty(S) выводит в командное окно символьное выражение S в формате близком к математическому:
>> pretty(S)
1/2 1/2 1/2
1/4 2 (5 - 5 )
Теперь очевидно, что
sin = .
Символьное выражение можно создать при помощи команды sym, входным аргументом которой является строка с выражением, заключенным в апострофы.
Например,
>> F=sym('x+y')
F =
x+y
Команда syms без аргументов выводит список символьных объектов, имеющихся в рабочем пространстве.
При запросе о наличии символьных переменных в памяти после выполнения предыдущего примера
>> syms
'F'
получен ответ 'F', т. е. входящие в выражение переменные x и y не являются символьными. Их нельзя использовать в качестве аргументов в дальнейших символьных вычислениях.
Изменим рассмотренный выше ввод символьного выражения F следующим образом:
>> syms x y
>> F=x+y
F =
x+y
>> syms
'F' 'x' 'y'
Теперь переменные x и y вначале получили статус символьных, а сконструированное из них выражение F приобрело статус символьного автоматически.
Вычисления с использованием арифметики произвольной точности
MATLAB обычно ведет вычисления с числами, представленными в формате плавающей точки с двойной точностью. Это довольно высокая точность, обеспечивающая потребности практических вычислений в прикладных задачах. Однако ряд задач теории чисел, численного кодирования и некоторых других требует выполнения вычислений вообще без какой - либо погрешности или со сколь угодно малой погрешностью. Такие вычисления не очень удачно называют арифметикой произвольной точности: правильнее говорить о точной арифметике.
Для проведения вычислений в арифметике произвольной точности служит команда vpa:
R=vpa(S) – возвращает результат вычислений символьного выражения S, используя арифметику произвольной точности с текущим числом цифр D, установленным функцией digits. Результат R имеет тип sym;
R=vpa(S,D) – возвращает результат вычислений выражения S с текущим числом цифр D.
Переменная S может быть символьным массивом.
Примеры:
>>vpa(exp(1),50)
ans =
2.7182818284590455348848081484902650117874145507813
>>vpa([2*pi,exp(1),log(2)],10)
ans =
[ 6.283185308, 2.718281828, .6931471806]
Команда digits служит для установки числа цифр в числах арифметики произвольной точности. Она используется в одном из следующих вариантов:
digits – возвращает число значащих цифр в числах арифметики произвольной точности (по умолчанию 32);
digits(D) – устанавливает заданное число цифр D для арифметики произвольной точности.
Примеры вычисления числа π с 32 и 6 значащими цифрами:
>>digits
Digits = 32
>>vpa pi
ans =
3.1415926535897932384626433832795
>> digits 6
>> vpa pi
ans =
3.14159
Команды упрощения выражений – simplify, simple
Команда simplify(S) упрощает символьное выражение или массив символьных выражений S. Если упрощение невозможно, то возвращается исходное выражение.
Пример для символьного выражения:
>> syms a b x
>>simplify((a^2-2*a*b+b^2)/(a-b))
ans =
a-b
Пример для вектор-столбца символьных выражений:
>> V=[sin(x)^2+cos(x)^2; log(a*b)]
V =
[ cos(x)^2+sin(x)^2]
[ log(a*b)]
>> simplify(V)
ans =
[ 1]
[ log(a*b)]
Возможности проведения упрощений с помощью команды simplify в Symbolicне обладают возможностями системы Maple в полной мере в связи с отсутствием опций, определяющих путь упрощения. Дополнительные возможности упрощения обеспечивает команда simple.
Команда simple(S) выполняет различные алгебраические преобразования символьного выражения S и выводит как промежуточные результаты, так и самый короткий результат. В модификации [R,HOW] = simple(S) промежуточные результаты не выводятся. Результат упрощений содержится в R, а в HOW указывается выполняемое преобразование. Следующие примеры иллюстрируют работу функции:
>> syms x
>> [R,HOW]=simple(cos(x)^2+sin(x)^2)
R =
HOW =
combine
>> [R,HOW]=simple(2*cos(x)^2-sin(x)^2)
R =
3*cos(x)^2-1
HOW =
simplify
>> [R,HOW]=simple(cos(x)^2-sin(x)^2)
R =
cos(2*x)
HOW =
combine
Существует более короткая модификация [R] = simple(S):
>> [R]=simple(cos(x)^2-sin(x)^2)
R =
cos(2*x)
Команда расширения выражений – expand
Команда expand(S) расширяет символьные выражения массива S. Рациональные выражения она раскладывает на простые дроби, полиномы – на полиномиальные выражения и т. д. Функция работает со многими алгебраическими и тригонометрическими функциями.
Примеры:
>>syms a b x
>>S=[(x+2)*(x+3)*(x-4),sin(2*x)];
>>expand(S)
ans =
[ x^3+x^2-14*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
Команда 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(sym('123456789'))
ans =
(3)^2*(3803)*(3607)
Пусть требуется найти определитель D (команда det) и обратную матрицу A-1 (команда inv) символьной матрицы
A = .
>> syms a b
>> A=[a b;a^2 b^2]
A =
[ a, b]
[ a^2, b^2]
>> D=det(A)
D =
a*b^2-b*a^2
>> factor(D)
ans =
-a*b*(-b+a)
>> A1=inv(A)
A1 =
[ -b/a/(-b+a), 1/a/(-b+a)]
[ a/b/(-b+a), -1/b/(-b+a)]
Приведение подобных членов – команда collect
Команда collect(S, v) работает с символьными полиномами S нескольких переменных, где v – одна из переменных полинома. Эта функция возвращает разложение полинома S по степеням v (S может быть массивом полиномов).
Примеры:
>>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]
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|