Преобразование символьных выражений
В математике с алгебраическими выражениями допустимы некоторые операции, например, можно вычислить значение выражения, упростить его, разложить на простые множители и т.д. Рассмотрим средства ML для решения подобных задач.
Функция subs () позволяет произвести подстановку одного выражения в другое. Она может вызываться с различным количеством аргументов. В общем случае она вызывается с тремя аргументами: именем символической функции, переменной, которую надо заменить и выражением, которое надо подставить. Рассмотрим различные варианты вызовов.
Можно вычислить значение функции в определённой точке, используется функция subs так:
% предварительно x была объявлена как символьная
>> syms x
% Значение функции f = sin (2*x) при х=1 (замена х на 1)
>> f = sin (2*x); x=1;
>> subs( f, 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
Замена х на у в функции f=sin(2*x)
>> syms x, y
>> subs( f, y)
ans =
sin (2*y)
или так
>> subs( f, x, y)
ans =
sin(2*y)
Замена х на у+1 в ф-ции f=sin(2*x)
>> subs(f, y+1)
ans =
sin(2*y+2)
Если в выражение входит несколько переменных, то функцию 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)
( x2-y2/ x-y)
2 2
x - y
-------
x - y
>> expand (q)
ans =
1 / (x-y)*x^2-1/(x-y)*y^2
В математическом виде:
>> pretty (expand(q))
x2/x-y-y2/x-y
2 2
x y
----- - -----
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)
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
В математическом виде:
>> pretty(collect(pol,y))
2
((x + 1) + 1) y + 2 x - 2
5). Функция factor (expr) раскладывает символьное выражение на простые множители
>> factor (pol) % Преобразование функции pol=y*(x+1)^2+(x-2)+(x+y)
ans =
y*x^2+2*y*x+2*y+2*x-2
>> factor (x^3-1) % Разложение функции x^3-1
ans =
(x-1)*(x^2+x+1)
>> factor (36) % Разложение числа 36
ans =
2 2 3 3
