Символьные вычисления в ML
Символьные вычисления — это преобразования и работа с математическими равенствами и формулами как с последовательностью символов. Они отличаются от численных расчётов, которые оперируют приближёнными численными значениями, стоящими за математическими выражениями. Системы символьных вычислений (их так же называют системами компьютерной алгебры) могут быть использованы для символьного интегрирования и дифференциирования, подстановки одних выражений в другие, упрощения формул и т. д.
Компьютерная алгебра занимается разработкой и реализацией аналитических методов решения математических задач на компьютере и предполагает, что исходные данные, как и результаты решения, сформулированы в аналитическом (символьном) виде.
Аналитические решения чаще удаётся получить для наиболее грубых (простых) моделей, и реже - для более точных сложных.
Тому, кто знаком с основами высшей математики, наверняка известны десятки правил нахождения пределов, взятия интегралов, нахождения производных и т.д. Если добавить к этому то, что для нахождения большинства интегралов нужно также помнить таблицу основных интегралов, то получается очень большой объем информации. И если какое-то время не тренироваться в решений подобных задач, то многое быстро забывается и для нахождения, например, интеграла посложнее придется уже заглядывать в справочники. Но ведь взятие интегралов и нахождение пределов в реальной работе не является главной целью вычислений. Реальная цель заключается в решении каких-либо проблем, а вычисления — всего лишь промежуточный этап на пути к этому решению.
С помощью символьных вычислений можно сэкономить массу времени и избежать многих ошибок при вычислениях. Спектр задач, решаемых подобными системами, очень широк.
|
Мы познакомились с вычислительными возможностями ML. Теперь рассмотрим символьные вычисления. Расчеты можно выполнять в символьном виде, т.е. расчеты, в которых используются символьные переменные, а в результате получают символьные (аналитические) выражения. Это обеспечиваются пакетом Symbolic Math Toolbox, который входит в систему ML.
К задачам, которые решаются в символьном виде, относятся
· Аналитическое преобразование выражений
· Построение графиков, заданных символьными функциями
· Аналитическое решение линейных и нелинейных уравнений и систем
· Решение систем дифференциальных уравнений
· Вычисление пределов, производных, интегралов
· Разложение функций в ряд и др.
Основой аналитических вычислений являются символьные переменные.
Значения символьным переменным не присваивается. Значением символьных переменных являются их названия.
Символьные переменные предварительно необходимо объявить. Они определяются с помощью команды
syms <имя1> <имя2>….
В символьном виде удобно задавать функции и выражения. Для этого аргументы функции надо объявить как символьные. Например, объявим две символьные переменные:
>> syms x y
Затем на основе этих переменных зададим значение переменной f
>> f=sin(2*x)
f =
sin(2*x)
Теперь эту функцию можно использовать, например в команде 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)
--
Для преобразования символьного числового выражения в формат с плавающей точкой используется функция vpa () – её результат тоже символьный, но с ним можно выполнять арифметические действия
>> s1= vpa (s)
s1 =
.88571428571428571428571428571429
>> s1= vpa (s, 6) % 2-й параметер – количество значащих цифр в дробной части числа
s1 =
.885714
>> k=vpa(s1+2,4)
k =
4.886
Преобразование символьных выражений
В математике с алгебраическими выражениями допустимы некоторые операции, например, можно вычислить значение выражения, упростить его, разложить на простые множители и т.д. Рассмотрим средства 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))
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))
((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