Choose Numeric or Symbolic Arithmetic
Symbolic Math Toolbox™ operates on numbers by using either numeric or symbolic arithmetic. In numeric arithmetic, you represent numbers in floating-point format using either double precision or variable precision. In symbolic arithmetic, you represent numbers in their exact form. This topic compares double-precision, variable-precision, and symbolic arithmetic.
Double-Precision Arithmetic
Numeric computations in MATLAB® use double-precision arithmetic by default. For example, evaluate the expressions 10001/1001, π, and . The results are converted to double-precision values.
x = 10001/1001 y = pi z = sqrt(2)
x = 9.9910 y = 3.1416 z = 1.4142
For more information about double-precision arithmetic, see Floating-Point Numbers. This arithmetic is recommended when you do not have Symbolic Math Toolbox or are using functions that do not accept symbolic input. Otherwise, exact
symbolic arithmetic and variable-precision arithmetic are recommended. To convert a
symbolic value to double precision, use the double
function.
Variable-Precision Arithmetic
Variable-precision arithmetic using vpa
is the recommended approach for numeric calculations in Symbolic Math Toolbox. You can specify the number of significant digits when performing
calculations with variable-precision arithmetic.
For example, use vpa
to evaluate the fraction 10001/1001. By default, vpa
evaluates inputs to 32 significant
digits. Approximate the fraction 10001/1001 to at least 32 significant digits.
vpa(10001/1001)
ans = 9.991008991008991008991008991009
Approximate the fraction to at least 8 significant digits. Change the number of
significant digits by using the digits
function.
digits(8); vpa(10001/1001)
ans = 9.991009
In variable-precision arithmetic, you can increase the number of significant digits for greater precision. Alternatively, you can decrease the number of significant digits for faster computations and decreased memory usage.
Symbolic Arithmetic
Symbolic Math Toolbox provides the sym
and syms
functions to perform exact symbolic computations. In symbolic
arithmetic, you can perform computations involving numbers and variables in their exact
form, such as x/2
, 2^(1/2)
, or
pi
. The following three examples show several calculations that
are performed in symbolic arithmetic.
Express Irrational Numbers
Use sym
to create symbolic numbers.
Express the irrational numbers π and in symbolic
form.
x = sym(pi) y = sqrt(sym(2))
x = pi y = 2^(1/2)
Perform Calculations with Large Integers
When you declare a number, MATLAB automatically converts the number to double precision. For example,
declare the integer 80435758145817515
as the input argument of
sym
. The number loses its accuracy since it is bigger than
the largest consecutive integer flintmax
in double precision,
which is
2^53
.
Z = 80435758145817515 Zinaccurate = sym(80435758145817515)
Z = 8.0436e+16 Zinaccurate = 80435758145817520
sym
.Zaccurate = sym('80435758145817515')
Zaccurate = 80435758145817515
You can then perform calculations with large integers using symbolic arithmetic accurately. For example, evaluate the sum of the cubes of three large integers.
Z1 = sym('80435758145817515') Z2 = sym('12602123297335631') Z3 = sym('-80538738812075974') Zsum = Z1^3 + Z2^3 + Z3^3
Z1 = 80435758145817515 Z2 = 12602123297335631 Z3 = -80538738812075974 Zsum = 42
Solve Mathematical Equations
With symbolic arithmetic, you can solve a mathematical equation. For example,
solve the quadratic equation ax2 +
bx + c = 0. Use syms
to declare the variable
x and the coefficients a,
b, and c in the quadratic
equation.
syms a b c x eqn = a*x^2 + b*x + c == 0;
Find the solutions using solve
and return them as symbolic
expressions.
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)
Use subs
to substitute symbolic values
for the coefficients. Set a = 1, b = 2, and c = 3. Return the solutions of the quadratic equation as symbolic
numbers.
solsSym = subs(sols,[a b c],[1 2 3])
solsSym = - (8^(1/2)*1i)/2 - 1 (8^(1/2)*1i)/2 - 1
You can then convert the symbolic solutions to floating-point format in double precision or variable precision.
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
Comparisons of Numeric and Symbolic Arithmetic
The table below compares double-precision, variable-precision, and symbolic arithmetic.
Double Precision | Variable Precision | Symbolic | |
---|---|---|---|
Example 1: Evaluate 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 |
Example 2: Evaluate 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 |
Functions Used | double | vpa digits | sym |
Data Type | double | sym | sym |
Round-Off Errors | Yes, the answer has 16 digits of precision. | Yes, the number of digits depends on the precision used. | No, the results are exact. |
Speed | Faster | Faster, depending on the precision used | Slowest |
Memory Usage | Least | Variable, depending on the precision used | Greatest |