Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект.pdf
Скачиваний:
51
Добавлен:
23.07.2020
Размер:
2.68 Mб
Скачать

Символьные вычисления в ML

Мы познакомились с вычислительными возможностями ML. Теперь рассмотрим символьные вычисления и аналитические преобразования. Расчеты можно выполнять в символьном виде, т.е. расчеты, в которых используются символьные переменные, а в результате получают символьные (аналитические)

выражения. Это обеспечиваются пакетом Symbolic Math Toolbox, который входит в систему ML.

Кзадачам, которые решаются в символьном виде, относятся

Аналитическое преобразование выражений

Построение графиков, заданных символьными функциями

Аналитическое решение линейных и нелинейных уравнений и систем

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

Вычисление пределов, производных, интегралов

Разложение функций в ряд и др.

Основой аналитических вычислений являются символьные переменные.

Значения символьным переменным не присваивается. Значением символьных переменных являются их названия.

Символьные переменные предварительно необходимо объявить. Они

определяются с помощью команды

syms <имя1> <имя2>….

В символьном виде удобно задавать функции и выражения. Для этого аргументы функции надо объявить как символьные. Например, объявим две символьные переменные:

>> syms x y

Затем на основе этих переменных зададим значение переменной f

>> f=sin(2*x)

f = sin(2*x)

Результат символьного типа, это не число и не функция, а попросту говоря,

это формула.

32

Теперь эту функцию можно использовать, например в команде ezplot(f, [-2*pi 2*pi]) при построении графика функции.

Построим еще одно выражение

>> g=x+y

g = x+y

На основе одних выражений можно строить другие

>> f1=f / g

f1 = sin(2*x)/(x+y)

Для объявления символьных переменных и создания функций и выражений

(символьную функцию можно создать и без предварительного объявления) можно использовать функцию sym (), например,

>> d=sym('(a+b)/(2*a)')

d =

(a+b)/(2*a)

>> b=0.2

b =

0.2000

>> c=sym (b) % Аналитическое представление в виде рац.дроби

c =

1/5

>> s=sym ('3/5')+sym ('2/7')

s =

31 / 35 % Результат символьный

Существует возможность получить более естественный вид выражения (в

математическом виде) в данном случае в виде дроби:

>> pretty(s)

31

--

35

33

Для преобразования символьного числового выражения в числовой формат

(вещественный или целый) используется функция vpa () – её результат тоже

символьный, но с ним можно выполнять арифметические действия

>> s1= vpa (s)

s1 =

.88571428571428571428571428571429

>> s1= vpa (s, 6) % 2-й параметер – количество значащих цифр в

дробной части числа

s1 =

.885714

>> k=vpa(s1+2,4)

k = 2.886

Для преобразования символьного числового выражения к вещественному типу иногда используют функцию double, например

>> k=double(s)

Преобразование символьных выражений

В математике с алгебраическими выражениями допустимы некоторые операции, например, можно вычислить значение выражения, упростить его,

разложить на простые множители и т.д. Рассмотрим средства ML для решения подобных задач.

Функция subs () позволяет произвести подстановку одного выражения в другое. Она может вызываться с различным количеством аргументов. В общем случае она вызывается с тремя аргументами: именем символической функции,

переменной, которую надо заменить и выражением, которое надо подставить.

Рассмотрим различные варианты вызовов.

Можно вычислить значение функции в определённой точке, используя функции. subs:

% предварительно x была объявлена как символьная

>> syms x

34

% Значение функции f = sin (2*x) при х=1 (замена х на 1)

>>f = sin (2*x);

>>subs( f, x, 1)

ans =

0.9093

Либо такой вариант

>>syms x

>>x=1; f = sin (2*x); subs( f, x) ans =

0.9093

или

>>x=1;

>>subs (f)

ans = 0.9093

Вычислим значение функции f=sin(2*x) при х=pi

>> subs (f, pi) ans =

-2.4493e-016

>> syms x, y

1). Замена х на у в функции f=sin(2*x)

>> subs( f, y)

ans =

sin (2*y)

или так

>> subs( f, x, y)

ans =

sin(2*y)

2). Замена х на у+1 в ф-ции f=sin(2*x)

>> subs(f, y+1)

ans =

sin(2*y+2)

3). Подстановка х=1

>> subs (f,1)

35

ans = 0.9093

Если в выражение входит несколько переменных, то функцию subs()

используют в другом формате.

Значение ф-ции d = (a+b)/(2*a) при a=1, а – не объявлена как символьная

>> subs(d, 'a', 1)

ans =

1/2+1/2*b

Значение функции d = (a+b)/(2*a) при a=1, b=2

>> subs ( subs (d,'a',1), 'b', 2)

ans = 1.5000

Сложные алгебраические и тригонометрические выражения в ML могут быть приведены к эквивалентным путем упрощения (преобразованиям) с помощью специальных функций expand, simple, simplify, collect, factor .

Такое преобразование, состоящее в упрощении выражения, может выполняться несколькими способами:

1). Функция expand (expr) представляет выражение в виде элементарных функций (суммой степеней без приведения подобных слагаемых), т.е. раскрывает скобки в выражении

>>syms x y

>>q=(x^2-y^2)/(x-y)

q =

(x^2-y^2) / (x-y)

Вывод в математическом виде

>> pretty (q)

22

x- y

-------

36

x - y

>> expand (q)

ans =

1 / (x-y)*x^2-1/(x-y)*y^2

В математическом виде:

>> pretty (expand(q)) x2/x-y-y2/x-y

22

xy

----- - -----

x- y x - y

2). Упрощение выражений может производиться разными функциями,

которые основаны на разных подходах. Функция simple (expr) упрощает символьное выражение. Используется несколько алгоритмов упрощения (выводятся их промежуточные результаты) и в качестве результата выбирается выражение,

записанное меньшим количеством символов.

>> simple (q)

simplify:

x+y

radsimp:

x+y

combine(trig):

x+y

factor:

x+y

expand: 1/(x-y)*x^2-1/(x-y)*y^2 combine: (x^2-y^2)/(x-y) convert(exp): (x^2-y^2)/(x-y)

37

convert(sincos): (x^2-y^2)/(x-y) convert(tan):

(x^2-y^2)/(x-y) collect(x): (x^2-y^2)/(x-y) ans =

x+y

3). Функция simplify (expr) реализует более мощный алгоритм упрощения символьного выражения.

>> simplify(q)

ans =

x+y

4). Функция collect (expr, var) вычисляет коэффициенты полинома при степенях переменной var (раскрывает скобки и приводит подобные); если второй параметр отсутствует, то выбирается переменная х.

>> pol=y*(x+1)^2+(x-2)+(x+y)

pol = y*(x+1)^2+2*x-2+y

Преобразуем к виду, содержащему степени х (коэффициенты при х)

>> collect (pol)

ans =

y*x^2+( 2*y+2) * x+2*y - 2

запись в математическом виде:

>> pretty(collect(pol))

2

y x + (2 y + 2) x + 2 y - 2

Преобразуем к виду, содержащему степени у (коэффициенты при у )

>> collect (pol, y) ans =

((x+1) ^ 2+1) * y+2 * x - 2

38