Выберите числовую или символьную арифметику

Symbolic Math Toolbox™ работает с числами, используя числовую или символьную арифметику. В числовой арифметике вы представляете числа в формате с плавающей точностью с использованием либо двойной точности, либо переменной точности. В символьной арифметике вы представляете числа в их точной форме. В этом разделе сравнивается двойная точность, переменная точность и символьная арифметика.

Арифметика двойной точности

Числовые расчеты в MATLAB® по умолчанию используйте арифметику двойной точности. Для примера вычислите выражения 10001/1001, 2. Результаты преобразуются в значения двойной точности.

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 для создания символьных чисел. Выразите иррациональные числа 2 в символической форме.

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
Используемые функцииdoublevpa
digits
sym
Тип данныхdoublesymsym
ОкругленияДа, ответ имеет 16 цифр точности.Да, количество цифр зависит от используемой точности.Нет, результаты точные.
СкоростьБыстрееБыстрее, в зависимости от используемой точностиСамый медленный
Использование памятиНаименьшееПеременная, в зависимости от используемой точностиСамый большой

Похожие темы