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

Символьные вычисления в 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)

31

--

35

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

>> s1= vpa (s)

s1 =

.88571428571428571428571428571429

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

s1 =

.885714

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

k =

4.886

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

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

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

Некоторые простые алгебраические манипуляции, которые можно осуществлять над символьными объектами. expand(S) Раскрывает скобки в выражении S factor(S) Разлагает на множители выражение S simplify(S) Упрощает каждый элемент символьной матрицы S subs(S, oldvar, newvar) Заменяет в выражении S каждое вхождение символической переменной oldvar новой переменной newvar Примеры использования можно увидеть ниже:

 • Раскрытие скобок

>> syms s;

 >> A = s + 2;

>> B = s + 3; >>

C = A*B C = (s+2)*(s+3)

>> C = expand(C) 2 C = s^2 + 5*s + 6

• Разложение на множители

>> syms s; >> D = s^2 + 6*s + 9; >> D = factor(D) D = (s+3)^2 >> p = s^3 - 2*s^2 - 3*s + 10; >> P = factor(p) P = (s+2)*(s^2 - 4*s + 5) • Сокращение общего множителя >> syms s; >> H = (s^3 + 2*s^2 + 5*s + 10)/(s^2 + 5); >> H = simplify(H) H = s+2 >> factor(s^3 + 2*s^2 + 5*s + 10) ans = (s+2)*(s^2 + 5) • Подстановка переменной Путь имеется выражение H(s) = s + 3 s 2 + 6s + 8 и требуется вычислить G(s) = H(s)|s=s+2. >> syms s; >> H = (s + 3)/(s^2 + 6*s + 8); >> G = subs(H, s, s+2) G = (s+5)/((s+2)^2 + 6*s + 20) >> G = collect(G) G = (s+5)/(s^2 + 10*s + 24) Таким образом, G(s) = s + 5 s 2 + 10s + 24. Отметим, что конечный результат символьных преобразований далеко не всегда выгл

Математическая функция может быть представлена в виде формулы, таблицы или графика. В системе MATLAB табулирование функции осуществляется с помощью функции subs ().

Синтаксис функции subs(f, х, х1) выглядит следующим образом: f — функция, заданная аналитически; х — аргумент функции f; х1 — набор значений аргумента х, для которых определяется значение функции f.

Переменная х1 может быть представлена в виде вектора или ранжированной переменной хn, где хn начальное значение х1, Δх — шаг, хk — конечное значение х1.

Технология табулирования функции f(x) включает несколько шагов:


1. Определение необходимых символьных переменных с помощью команды syms

2. Задание значений переменной х1.

3. Задание функции табулирования у =f(x).

4. Вызов функции табулирования subs с соответствующим параметрами.


Рассмотрим пример.

Необходимо построить последовательность значений функции у=ех, если

 

1. аргумент лежит в диапазоне [0; 1] и меняется с постоянным шагом h=0.2;

2. значения аргумента заданы вектором [0, 0.5, 1, 2, 5].


Программа решения задачи в MATLAB имеет вид:


syms x х1 у;
х1 = 0: 0.2:1;
у = ехр(х);
subs(y, х, х1)
ans = 1.0000 1.2214 1.4918 1.8221 2.2255 2.7183
х1=[ 0, 0.5, 1, 2, 5 ];
у = ехр(х);
subs(y, X, х1) ans = 1.0000 1.6487 2.7183 7.3891 148.4132


Функция subs позволяет табулировать одновременно несколько функций. Для этого необходимо параметр у представить в виде матрицы табулируемых функций.

Кроме того, MATLAB позволяет табулировать функции, используя матричные операции и не обращаясь к функции subs. Технология вычислений в этом случае состоит в выполнении следующих операций:


1. Определение символьных переменных с помощью команды syms.

2. Задание аргумента х.

3. Определение матрицы у, элементами которой являются аргумент х и табулируемые функции

4. Печать матрицы у (при необходимости получения решения «в столбик» используется функция транспонирования).

 

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

Можно вычислить значение функции в определённой точке, используется функция 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















Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: