Лаб_практикум_ОВИ_03_06_13
.pdff=
(sin(x)+a)^2*(cos(x)+b)^2/abs(a+b)^(1/2)
Запись формулы в одну строку не всегда удобна, более естественный вид дроби позволяет получить функция pretty:
» pretty(f) |
|
2 |
2 |
(b + cos(x)) |
(a + sin(x)) |
---------------------------
1/2 |a + b|
Определенная функция f также является символической, в чем не трудно убедиться при помощи команды whos.
Имеющиеся символические переменные и функции позволяют образовывать новые символические выражения:
»syms y
»g=(exp(-y)+1)/exp(y) g =
(exp(-y)+1)/exp(y)
»h=f*g h =
(sin(x)+a)^2*(cos(x)+b)^2/abs(a+b)^(1/2)*(exp(-y) +1)/exp(y)
»pretty(h)
2 |
/ |
1 |
\ |
2 |
(b + cos(x)) |
| |
------ |
+ 1 | (a + sin(x)) |
|
|
\ exp(y) |
/ |
|
|
------------------------------------------
1/2
exp(y) |a + b|
191
Символическую функцию можно создать без предварительного объявления переменных при помощи функции sym, входным аргументом которой является строка с выражением, заключенным в апострофы:
»z=sym('c^2/(d+1)') z =
c^2/(d+1)
»pretty(z)
2 c
-----
d + 1
Замечание 1
Функция sym может быть использована для объявления символических переменных. Команда syms a b с эквивалентна последовательности команд a = sym('a'), b = sym('b'), с = sym('c'):
»syms a b c
»whos a b c
Name Size |
Bytes Class |
a1x1 126 sym object
b1x1 126 sym object
c1x1 126 sym object
Grand total is 6 elements using 378 bytes
» a1=sym('a1'), b1=sym('b1'), c1=sym('c1') a1 =
a1
b1 =
b1
c1 =
c1
192
» whos |
a1 b1 c1 |
|
|
Name |
Size |
Bytes Class |
|
a1 |
1x1 |
128 |
sym object |
b1 |
1x1 |
128 |
sym object |
c1 |
1x1 |
128 |
sym object |
Grand total is 9 elements using 384 bytes
При работе в области комплексных чисел следует указать, что определяемые переменные являются в общем случае комплексными.
Комплексные символические переменные задаются командой syms с
опцией unreal. Опция real означает, что переменные трактуются как вещественные.
Рассмотрим пример, где результат символических вычислений зависит от того, какие символические переменные используются вещественные или комплексные. Объявим две вещественные переменные a и b и образуем комплексное число, считая, что a является действительной частью, а b мнимой, затем найдем сопряженное к нему число при помощи conj:
»syms a b real
»p=conj(a+i*b) p = a-i*b
Произведем аналогичные действия, предварительно объявив a и b
комплексными символьными переменными
»syms a b unreal
»q=conj(a+i*b) q = conj(a+i*b)
Таким образом, в общем случае p q.
193
Символические переменные могут являться элементами векторов и матриц. Элементы строк матриц при вводе отделяются пробелами или запятыми, а столбцов точкой с запятой, так же как и при вводе обычных матриц. В результате образуются символические матрицы и векторы, к
которым применимы матричные и поэлементные операции, а также встроенные функции. Рассмотрим пример ввода и умножения двух символических матриц:
»syms a b c d e f g h
»A=[a b;c d]
A =
[ a, b] [ c, d]
»B=[e f; g h] B =
[ e, f] [ g, h]
»C=A*B
C =
[ a*e+b*g, a*f+b*h] [ c*e+d*g, c*f+d*h]
Функция sym позволяет преобразовывать значения числовых переменных в символические. Введите числовую матрицу A и
преобразуйте ее в символическую матрицу B:
» A=[1.3 -2.1 4.9; 6.9 3.7 8.5] A =
1.3000 -2.1000 4.9000
6.9000 3.7000 8.5000
194
» B=sym(A)
B =
[ 13/10, -21/10, 49/10]
[ 69/10, 37/10, 17/2]
При переходе от числовых выражений к символическим используется запись числа в виде рациональной дроби. Использование рациональных дробей при выполнении символических вычислений позволяет всегда получать точный результат, не содержащий погрешности округления. Убедиться в этом можно на следующем простом примере.
Установите формат long для отображения максимально возможного числа значащих цифр для значений числовых переменных и найдите сумму чисел 1010 и 1010
»format long
»1.0e10+1.0e-10 ans =
1.000000000000000e+010
Теперь преобразуйте числа в символические переменные и снова вычислите сумму:
»large=sym(1.0e10);
»small=sym(1.0e-10);
»s=large+small
s = 100000000000000000001/10000000000
Рациональная дробь является точным значением суммы. Понятно,
что символические вычисления требуют больших временных затрат по сравнению с обычными.
195
Вычисление символических выражений производится с помощью функции vpa, например
»c=sym('sqrt(2)');
»cn=vpa(c)
cn =
1.4142135623730950488016887242097
По умолчанию сохраняется тридцать две значащие цифры. Второй входной параметр функции vpa позволяет задавать вычисления с заданным числом разрядов, например, с 45 разрядами
» cn=vpa(c,45)
cn =
1.41421356237309504880168872420969807856967187
Выходное значение функции vpa является символической
переменной, но его можно использовать в обычных вычислениях,
например
»cn=vpa(c,45) cn =
1.41421356237309504880168872420969807856967187
»cn+2
ans =
3.41421356237309504880168872420969807856967187
» cn*2
ans =
2.82842712474619009760337744841939615713934375
196
Результат арифметических операций в этих случаях получается в символических переменных. Для перевода символических переменных в числовые, т.е. переменные типа double array, используется функция double:
» cnd=double(cn)
cnd = 1.41421356237310
Визуализация символических функций одной переменной осуществляется при помощи ezplot. Самый простой вариант использования ezplot состоит в указании символической функции в качестве единственного входного аргумента, при этом в графическое окно выводится график функции на отрезке [ 2 , 2 ]. Например:
»f=sym('x*sin(x^2)^3');
»ezplot(f)
Обратите внимание (рис. 11.1), что автоматически создается соответствующий заголовок.
Рис. 11.1. График символической функции
197
Вторым аргументом может быть задан вектор с границами отрезка, на котором требуется построить график функции:
» ezplot(f,[-9 7])
Функция ezplot имеет некоторые отличия от своего аналога функции fplot, применяемой к числовым функциям. В частности, возможно указание символической функции, зависящей от двух аргументов:
»z=sym('x^2+a^3');
»ezplot(z,[-2 1 -3 4])
Пределы изменения аргументов определяются их названиями.
Первые два числа соответствуют первому по алфавиту аргументу, а
последние второму. В рассматриваемом примере a изменяется от 2 до 1,
а x изменяется от 3 до 4. В графическое окно выводится линия,
удовлетворяющая выражению x^2+a^3=0.
ToolBox Symbolic Math предоставляет пользователю целый набор средств для визуализации символических функций [1, 2].
11.1.2. Упрощение и преобразование выражений
Сложные алгебраические и тригонометрические выражения часто могут быть приведены к эквивалентным путем упрощения. ToolBox Symbolic Math имеет целый ряд сервисных функций, предназначенных для различных преобразований символических выражений. Операции с полиномами реализуют четыре функции: collect, expand, factor, horner.
Вычисление коэффициентов при степенях независимой переменной производится с помощью функции collect. Введите полином и отобразите его в командном окне при помощи pretty:
198
»p=sym('(x+a)^4+(x-1)^3-(x-a)^2-a*x+x-3');
»pretty(p)
3 |
4 |
2 |
x + (x - 1) - a x + (a + x) |
- (a - x) |
- 3 |
Затем примените к полиному функцию collect:
»pc=collect(p);
»pretty(pc)
4 3 2 2 x + (4 a + 1) x + (6 a - 4) x +
3 4 2
+ (4 a + a + 4) x + a - a - 4
По умолчанию в качестве независимой переменной в полиноме выбирается x, однако можно считать, что a независимая переменная, а x
входит в коэффициенты полинома, зависящего от a. Второй аргумент функции collect предназначен для указания переменной, при степенях которой следует найти коэффициенты:
»pca=collect(p,'a');
»pretty(pca)
4 |
3 |
|
2 |
2 |
3 |
a + (4 x) a |
+ (6 x |
|
- 1) a + (4 x + x) a + x + |
||
3 |
2 |
|
4 |
|
|
+ (x - 1) - x |
+ x |
- |
|
3 |
|
Функция expand представляет полином суммой одночленов:
»pe=expand(p);
»pretty(pe)
4 3 2 2 2 3 a + 4 a x + 6 a x - a + 4 a x +
4 3 2
+ a x + x + x - 4 x + 4 x - 4
199
Аргументом expand может быть не только полином, но и
символическое выражение, содержащее тригонометрические,
экспоненциальные и логарифмические функции:
»pk=sym('(sin(x)+cos(x))^3+(sin(x)+cos(x))^2+
(sin(x)+cos(x))') pk =
(sin(x)+cos(x))^3+(sin(x)+cos(x))^2+(sin(x)+cos(x
))
»pk2=expand(pk);
»pretty(pk2)
3 |
2 |
2 |
|
|
2 |
cos(x) |
+ 3 cos(x) sin(x) + cos(x) |
|
+ |
3 cos(x) sin(x) + |
|
|
3 |
|
|
2 |
|
+ 2 cos(x) sin(x) + cos(x) + sin(x) |
|
+ |
sin(x) |
+ sin(x) |
|
Аргументами функций expand, collect может быть не только отдельно полином или тригонометрические, или экспоненциальные, или логарифмические функции, но и их сочетания, например:
»p=sym('(x+a)^4+(x-1)^3+(sin(x)+cos(x))^4');
»pretty(p)
3 |
4 |
4 |
(x - 1) |
+ (cos(x) + sin(x)) |
+ (a + x) |
»p1=collect(p) p1 =
x^4+(1+4*a)*x^3+(-3+6*a^2)*x^2+(3+4*a^3)*x+a^4- -1+(sin(x)+cos(x))^4
»p2=expand(p1)
200
