Symbolic Math Toolbox™ работает с числами, используя числовую или символьную арифметику. В числовой арифметике вы представляете числа в формате с плавающей точностью с использованием либо двойной точности, либо переменной точности. В символьной арифметике вы представляете числа в их точной форме. В этом разделе сравнивается двойная точность, переменная точность и символьная арифметика.
Числовые расчеты в MATLAB® по умолчанию используйте арифметику двойной точности. Для примера вычислите выражения 10001/1001, . Результаты преобразуются в значения двойной точности.
x = 10001/1001 y = pi z = sqrt(2)
x = 9.9910 y = 3.1416 z = 1.4142
Для получения дополнительной информации об арифметике двойной точности см. Раздел Чисел с плавающей запятой». Эта арифметика рекомендуется, когда у вас нет Symbolic Math Toolbox или вы используете функции, которые не принимают символьный вход. В противном случае рекомендуется точная символьная арифметика и арифметика переменной точности. Чтобы преобразовать символическое значение в двойную точность, используйте double
функция.
Арифметика переменной точности с использованием vpa
является рекомендуемым подходом для числовых вычислений в Symbolic Math Toolbox. Можно задать количество значащих цифр при выполнении вычислений с помощью арифметики переменной точности.
Для примера используйте vpa
чтобы вычислить 10001/1001 дроби. По умолчанию vpa
оценивает входы до 32 значащих цифр. Аппроксимируйте 10001/1001 дроби как минимум до 32 значащих цифр.
vpa(10001/1001)
ans = 9.991008991008991008991008991009
Аппроксимируйте дробь как минимум до 8 значащих цифр. Измените количество значащих цифр при помощи digits
функция.
digits(8); vpa(10001/1001)
ans = 9.991009
В арифметике переменной точности можно увеличить количество значащих цифр для большей точности. Также можно уменьшить количество значащих цифр для более быстрых расчетов и уменьшения использования памяти.
Symbolic Math Toolbox предоставляет sym
и syms
функции для выполнения точных символьных расчетов. В символьной арифметике можно выполнить расчеты с участием чисел и переменных в их точной форме, таких как x/2
, 2^(1/2)
, или pi
. Следующие три примера показывают несколько вычислений, которые выполняются в символьной арифметике.
Использовать sym
для создания символьных чисел. Выразите иррациональные числа в символической форме.
x = sym(pi) y = sqrt(sym(2))
x = pi y = 2^(1/2)
Когда вы объявляете число, MATLAB автоматически преобразует число в двойную точность. Для примера объявите целое число 80435758145817515
как входной параметр sym
. Число теряет точность, так как оно больше, чем самое большое последовательное целое число flintmax
в двойной точности, которая 2^53
.
Z = 80435758145817515 Zinaccurate = sym(80435758145817515)
Z = 8.0436e+16 Zinaccurate = 80435758145817520
sym
.Zaccurate = sym('80435758145817515')
Zaccurate = 80435758145817515
Затем можно выполнить вычисления с большими целыми числами, точно используя символьную арифметику. Например, вычислите сумму кубов трех больших целых чисел.
Z1 = sym('80435758145817515') Z2 = sym('12602123297335631') Z3 = sym('-80538738812075974') Zsum = Z1^3 + Z2^3 + Z3^3
Z1 = 80435758145817515 Z2 = 12602123297335631 Z3 = -80538738812075974 Zsum = 42
С помощью символьной арифметики можно решить математическое уравнение. Для примера решите квадратичное уравнение ax2 + bx + c = 0. Использовать syms
чтобы объявить x переменной и коэффициенты a, b и c в квадратичном уравнении.
syms a b c x eqn = a*x^2 + b*x + c == 0;
Найти решения используя solve
и возвращает их как символические выражения.
sols = solve(eqn,x)
sols = -(b + (b^2 - 4*a*c)^(1/2))/(2*a) -(b - (b^2 - 4*a*c)^(1/2))/(2*a)
Использовать subs
для замены символьных значений коэффициентов. Установите a = 1, b = 2 и c = 3. Верните решения квадратичного уравнения в виде символьных чисел.
solsSym = subs(sols,[a b c],[1 2 3])
solsSym = - (8^(1/2)*1i)/2 - 1 (8^(1/2)*1i)/2 - 1
Затем можно преобразовать символические решения в формат с плавающей точкой с двойной точностью или переменной точностью.
digits(32); solsDouble = double(solsSym) solsVpa = vpa(solsSym)
solsDouble = -1.0000 - 1.4142i -1.0000 + 1.4142i solsVpa = - 1.0 - 1.4142135623730950488016887242097i - 1.0 + 1.4142135623730950488016887242097i
В приведенной ниже таблице сравнивается двойная точность, переменная точность и символьная арифметика.
Двойная точность | Переменная точность | Символический | |
---|---|---|---|
Пример 1: Оценка sin ( |
a = pi sin(pi) a = 3.1416 ans = 1.2246e-16 |
b = vpa(pi) sin(b) b = 3.1415926535897932384626433832795 ans = -3.2101083013100396069547145883568e-40 |
c = sym(pi) sin(c) c = pi ans = 0 |
Пример 2: Оценить 1 - 3 * (4/3 - 1) |
a = 4/3 1 - 3*(a - 1) a = 1.3333 ans = 2.2204e-16 |
digits(16); b = vpa(4/3) 1 - 3*(b - 1) b = 1.333333333333333 ans = 3.308722450212111e-24 |
c = sym(4)/3 1 - 3*(c - 1) c = 4/3 ans = 0 |
Используемые функции | double | vpa digits | sym |
Тип данных | double | sym | sym |
Округления | Да, ответ имеет 16 цифр точности. | Да, количество цифр зависит от используемой точности. | Нет, результаты точные. |
Скорость | Быстрее | Быстрее, в зависимости от используемой точности | Самый медленный |
Использование памяти | Наименьшее | Переменная, в зависимости от используемой точности | Самый большой |