Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб_практикум_ОВИ_03_06_13

.pdf
Скачиваний:
66
Добавлен:
14.04.2015
Размер:
4 Мб
Скачать
☆

f=

(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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]