This example shows several different methods
to calculate the roots of a polynomial.
-
Numeric Roots
-
Roots Using Substitution
-
Roots in a Specific Interval
-
Symbolic Roots
Numeric Roots
The roots
function calculates
the roots of a single-variable polynomial represented by a vector
of coefficients.
For example, create a vector to represent the polynomial x2−x−6,
then calculate the roots.
p = [1 -1 -6]; r = roots(p)
By convention, MATLAB® returns the roots in a column vector.
The poly
function converts
the roots back to polynomial coefficients. When operating on vectors, poly
and roots
are
inverse functions, such that poly(roots(p))
returns p
(up
to roundoff error, ordering, and scaling).
When operating on a matrix, the poly
function
computes the characteristic polynomial of the matrix. The roots of
the characteristic polynomial are the eigenvalues of the matrix. Therefore, roots(poly(A))
and eig(A)
return
the same answer (up to roundoff error, ordering, and scaling).
Roots Using Substitution
You can solve polynomial equations involving trigonometric functions by simplifying the equation using a substitution. The resulting polynomial of one variable no longer contains any trigonometric functions.
For example, find the values of θ that solve the equation
3cos2(θ)-sin(θ)+3=0.
Use the fact that cos2(θ)=1-sin2(θ) to express the equation entirely in terms of sine functions:
-3sin2(θ)-sin(θ)+6=0.
Use the substitution x=sin(θ) to express the equation as a simple polynomial equation:
-3×2-x+6=0.
Create a vector to represent the polynomial.
Find the roots of the polynomial.
To undo the substitution, use θ=sin-1(x). The asin
function calculates the inverse sine.
theta = 2×1 complex
-1.5708 + 1.0395i
1.5708 - 0.7028i
Verify that the elements in theta
are the values of θ that solve the original equation (within roundoff error).
f = @(Z) 3*cos(Z).^2 - sin(Z) + 3; f(theta)
ans = 2×1 complex
10-14 ×
-0.0888 + 0.0647i
0.2665 + 0.0399i
Roots in a Specific Interval
Use the fzero
function to find the roots of a polynomial in a specific interval. Among other uses, this method is suitable if you plot the polynomial and want to know the value of a particular root.
For example, create a function handle to represent the polynomial 3×7+4×6+2×5+4×4+x3+5×2.
p = @(x) 3*x.^7 + 4*x.^6 + 2*x.^5 + 4*x.^4 + x.^3 + 5*x.^2;
Plot the function over the interval [-2,1].
x = -2:0.1:1; plot(x,p(x)) ylim([-100 50]) grid on hold on
From the plot, the polynomial has a trivial root at 0
and another near -1.5
. Use fzero
to calculate and plot the root that is near -1.5
.
Symbolic Roots
If you have Symbolic Math Toolbox™, then there are additional
options for evaluating polynomials symbolically. One way is to use
the solve
(Symbolic Math Toolbox) function.
syms x
s = solve(x^2-x-6)
Another way is to use the factor
(Symbolic Math Toolbox) function
to factor the polynomial terms.
See Solve Algebraic Equations (Symbolic Math Toolbox) for more information.
See Also
roots
| poly
| eig
Related Topics
- Create and Evaluate Polynomials
- Roots of Scalar Functions
- Integrate and Differentiate Polynomials
Main Content
Syntax
Description
example
r = roots(
returnsp
)
the roots of the polynomial represented by p
as
a column vector. Input p
is a vector containing n+1
polynomial
coefficients, starting with the coefficient of xn.
A coefficient of 0
indicates an intermediate power
that is not present in the equation. For example, p = [3
represents the polynomial 3×2+2x−2.
2 -2]
The roots
function solves polynomial equations
of the form p1xn+…+pnx+pn+1=0.
Polynomial equations contain a single variable with nonnegative exponents.
Examples
collapse all
Roots of Quadratic Polynomial
Solve the equation 3×2-2x-4=0.
Create a vector to represent the polynomial, then find the roots.
p = [3 -2 -4]; r = roots(p)
Roots of Quartic Polynomial
Solve the equation x4-1=0.
Create a vector to represent the polynomial, then find the roots.
p = [1 0 0 0 -1]; r = roots(p)
r = 4×1 complex
-1.0000 + 0.0000i
0.0000 + 1.0000i
0.0000 - 1.0000i
1.0000 + 0.0000i
Input Arguments
collapse all
Polynomial coefficients, specified as a vector. For example,
the vector [1 0 1]
represents the polynomial x2+1,
and the vector [3.13 -2.21 5.99]
represents the
polynomial 3.13×2−2.21x+5.99.
For more information, see Create and Evaluate Polynomials.
Data Types: single
| double
Complex Number Support: Yes
Tips
-
Use the
poly
function
to obtain a polynomial from its roots:p = poly(r)
.
Thepoly
function is the inverse of theroots
function. -
Use the
fzero
function
to find the roots of nonlinear equations. While theroots
function
works only with polynomials, thefzero
function
is more broadly applicable to different types of equations.
Algorithms
The roots
function considers p
to
be a vector with n+1
elements representing the n
th
degree characteristic polynomial of an n
-by-n
matrix, A
.
The roots of the polynomial are calculated by computing the eigenvalues
of the companion matrix, A
.
A = diag(ones(n-1,1),-1); A(1,:) = -p(2:n+1)./p(1); r = eig(A)
The results produced are the exact eigenvalues of a matrix within
roundoff error of the companion matrix, A
. However,
this does not mean that they are the exact roots of a polynomial whose
coefficients are within roundoff error of those in p
.
Extended Capabilities
C/C++ Code Generation
Generate C and C++ code using MATLAB® Coder™.
Usage notes and limitations:
-
Output is variable-size and always complex.
-
Roots are not always in the same order as in MATLAB®.
-
Roots of poorly conditioned polynomials do not always match
MATLAB. -
See Variable-Sizing Restrictions for Code Generation of Toolbox Functions (MATLAB Coder).
Thread-Based Environment
Run code in the background using MATLAB® backgroundPool
or accelerate code with Parallel Computing Toolbox™ ThreadPool
.
This function fully supports thread-based environments. For
more information, see Run MATLAB Functions in Thread-Based Environment.
GPU Arrays
Accelerate code by running on a graphics processing unit (GPU) using Parallel Computing Toolbox™.
Usage notes and limitations:
-
The output
r
is always complex even if all the
imaginary parts are zero.
For more information, see Run MATLAB Functions on a GPU (Parallel Computing Toolbox).
Version History
Introduced before R2006a
roots
Синтаксис
Описание
пример
r = roots(
возвращает корни полинома, представленного p
)p
как вектор-столбец. Введите p
вектор, содержащий n+1
полиномиальные коэффициенты, начиная с коэффициента xn. Коэффициент 0
указывает на промежуточную степень, которая не присутствует в уравнении. Например, p = [3 2 -2]
представляет полином 3×2+2x−2.
roots
функция решает полиномиальные уравнения формы p1xn+…+pnx+pn+1=0. Полиномиальные уравнения содержат одну переменную с неотрицательными экспонентами.
Примеры
свернуть все
Корни квадратичного многочлена
Решите уравнение 3×2-2x-4=0.
Создайте вектор, чтобы представлять полином, затем найти корни.
p = [3 -2 -4]; r = roots(p)
Корни биквадратного многочлена
Решите уравнение x4-1=0.
Создайте вектор, чтобы представлять полином, затем найти корни.
p = [1 0 0 0 -1]; r = roots(p)
r = 4×1 complex
-1.0000 + 0.0000i
0.0000 + 1.0000i
0.0000 - 1.0000i
1.0000 + 0.0000i
Входные параметры
свернуть все
Полиномиальные коэффициенты в виде вектора. Например, векторный [1 0 1]
представляет полином x2+1, и векторный [3.13 -2.21 5.99]
представляет полином 3.13×2−2.21x+5.99.
Для получения дополнительной информации смотрите, Создают и Оценивают Полиномы.
Типы данных: single
| double
Поддержка комплексного числа: Да
Советы
-
Используйте
poly
функция, чтобы получить полином из его корней:p = poly(r)
.poly
функция является инверсиейroots
функция. -
Используйте
fzero
функционируйте, чтобы найти корни нелинейных уравнений. В то время какroots
функция работает только с полиномами,fzero
функция более широко применима к различным типам уравнений.
Алгоритмы
roots
функция рассматривает p
быть вектором с n+1
элементы, представляющие n
полином характеристики степени th n
– n
матрица, A
. Корни полинома вычисляются путем вычисления собственных значений сопровождающей матрицы, A
.
A = diag(ones(n-1,1),-1); A(1,:) = -p(2:n+1)./p(1); r = eig(A)
Приведенными результатами являются точные собственные значения матрицы в ошибке округления сопровождающей матрицы, A
. Однако это не означает, что они – точные корни полинома, коэффициенты которого в ошибке округления тех в p
.
Расширенные возможности
Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.
Указания и ограничения по применению:
-
Выход является переменным размером, и всегда объединяйте.
-
Корни находятся не всегда в том же порядке как в MATLAB®.
-
Корни плохо обусловленных полиномов не всегда совпадают с MATLAB.
-
“Смотрите информацию о генерации кода функций Toolbox (MATLAB Coder) в разделе “”Ограничения переменных размеров””.”.
Основанная на потоке среда
Запустите код в фоновом режиме с помощью MATLAB® backgroundPool
или ускорьте код с Parallel Computing Toolbox™ ThreadPool
.
Эта функция полностью поддерживает основанные на потоке среды. Для получения дополнительной информации смотрите функции MATLAB Запуска в Основанной на потоке Среде.
Массивы графического процессора
Ускорьте код путем работы графического процессора (GPU) с помощью Parallel Computing Toolbox™.
Указания и ограничения по применению:
-
Выход
r
является всегда комплексным, даже если все мнимые части являются нулем.
Для получения дополнительной информации смотрите функции MATLAB Запуска на графическом процессоре (Parallel Computing Toolbox).
Представлено до R2006a
- Получите корни многочлена с помощью функции
roots()
в MATLAB - Получите корни полинома с помощью функции
solve()
в MATLAB
Это руководство познакомит вас с тем, как найти корни многочлена с помощью функций roots()
и solve()
в MATLAB.
Получите корни многочлена с помощью функции roots()
в MATLAB
Если вы хотите найти корни многочлена, вы можете использовать функцию roots()
в MATLAB. Этот вход этой функции – вектор, который содержит коэффициенты полинома. Если в полиноме нет степени, то в качестве его коэффициента будет использоваться 0. Результатом этой функции является вектор-столбец, содержащий действительные и мнимые корни данного многочлена. Например, давайте найдем корни квадратного полинома: 2x ^ 2 – 3x + 6 = 0. Мы должны определить коэффициенты полинома, начиная с наивысшей степени, и если степень отсутствует, мы будем использовать 0 в качестве ее коэффициента. . См. Код ниже.
poly = [2 -3 6];
p_roots = roots(poly)
Выход:
p_roots =
0.7500 + 1.5612i
0.7500 - 1.5612i
В приведенном выше коде мы использовали только коэффициенты полинома, начиная с наибольшей степени. Вы можете изменить коэффициенты многочлена в соответствии с данным многочленом. Знаем, давайте найдем корни многочлена четвертой степени: 2x ^ 4 + 1 = 0. См. Код ниже.
poly = [2 0 0 0 1];
p_roots = roots(poly)
Выход:
p_roots =
-0.5946 + 0.5946i
-0.5946 - 0.5946i
0.5946 + 0.5946i
0.5946 - 0.5946i
Мы использовали три 0 между двумя полиномами в приведенном выше коде, потому что три степени отсутствуют. Проверьте эту ссылку для получения дополнительной информации о функции root()
.
Получите корни полинома с помощью функции solve()
в MATLAB
Если вы хотите найти корни многочлена, вы можете использовать функцию resolve()
в MATLAB. Этот вход этой функции является полиномом. Результатом этой функции является вектор-столбец, содержащий действительные и мнимые корни данного многочлена. Например, давайте найдем корни квадратного многочлена: 2x ^ 2 – 3x + 6 = 0. Нам нужно определить многочлен. См. Код ниже.
syms x
poly = 2*x^2 -3*x +6 == 0;
p_roots = solve(poly,x)
p_roots = vpa(p_roots,2)
Выход:
p_roots =
0.75 - 1.6i
0.75 + 1.6i
В приведенном выше коде мы определили весь многочлен и использовали функцию vpa()
, чтобы изменить точность результата. Вы можете изменить полином в соответствии с заданным полиномом и точностью в соответствии с вашими требованиями. Знаем, давайте найдем корни многочлена четвертой степени: 2x ^ 4 + 1 = 0. См. Код ниже.
syms x
poly = 2*x^4 +1 == 0;
p_roots = solve(poly,x);
p_roots = vpa(p_roots,2)
Выход:
p_roots =
- 0.59 - 0.59i
- 0.59 + 0.59i
0.59 - 0.59i
0.59 + 0.59i
В приведенном выше коде мы определили весь многочлен и использовали функцию vpa()
для изменения точности результата. Вы можете изменить полином в соответствии с заданным полиномом и точностью в соответствии с вашими требованиями.
Symbolic Math Toolbox™ offers both numeric and symbolic equation solvers. For a comparison of numeric and symbolic solvers, see Select Numeric or Symbolic Solver. An equation or a system of equations can have multiple solutions. To find these solutions numerically, use the function vpasolve
. For polynomial equations, vpasolve
returns all solutions. For nonpolynomial equations, vpasolve
returns the first solution it finds. These examples show you how to use vpasolve
to find solutions to both polynomial and nonpolynomial equations, and how to obtain these solutions to arbitrary precision.
Find All Roots of a Polynomial Function
Use vpasolve
to find all the solutions to the function f(x)=6×7-2×6+3×3-8.
syms f(x)
f(x) = 6*x^7-2*x^6+3*x^3-8;
sol = vpasolve(f)
sol =(1.0240240759053702941448316563337-0.88080620051762149639205672298326+0.50434058840127584376331806592405 i-0.88080620051762149639205672298326-0.50434058840127584376331806592405 i-0.22974795226118163963098570610724+0.96774615576744031073999010695171 i-0.22974795226118163963098570610724-0.96774615576744031073999010695171 i0.7652087814927846556172932675903+0.83187331431049713218367239317121 i0.7652087814927846556172932675903-0.83187331431049713218367239317121 i)
vpasolve
returns seven roots of the function, as expected, because the function is a polynomial of degree seven.
Find Zeros of a Nonpolynomial Function Using Search Ranges and Starting Points
A plot of the function f(x)=e(x/7)cos(2x) reveals periodic zeros, with increasing slopes at the zero points as x increases.
syms x h = fplot(exp(x/7)*cos(2*x),[-2 25]); grid on
Use vpasolve
to find a zero of the function f
. Note that vpasolve
returns only one solution of a nonpolynomial equation, even if multiple solutions exist. On repeated calls, vpasolve
returns the same result.
f = exp(x/7)*cos(2*x); for k = 1:3 vpasolve(f,x) end
ans = -7.0685834705770347865409476123789
ans = -7.0685834705770347865409476123789
ans = -7.0685834705770347865409476123789
To find multiple solutions, set the option 'Random'
to true
. This makes vpasolve
choose starting points randomly. For information on the algorithm that chooses random starting points, see Algorithms on the vpasolve
page.
for k = 1:3 vpasolve(f,x,'Random',true) end
ans = -226.98006922186256147892598444194
ans = 98.174770424681038701957605727484
ans = 52.621676947629036744249276669932
To find a zero close to x=10, set the starting point to 10
.
ans = 10.210176124166828025003590995658
To find a zero close to x=1000, set the starting point to 1000
.
ans = 999.8118620049516981407362567287
To find a zero in the range 15≤x≤25, set the search range to [15 25]
.
ans = 21.205750411731104359622842837137
To find multiple zeros in the range [15 25]
, you cannot call vpasolve
repeatedly because it returns the same result on each call, as previously shown. Instead, set the search range and set 'Random'
to true
.
for k = 1:3 vpasolve(f,x,[15 25],'Random',true) end
ans = 21.205750411731104359622842837137
ans = 21.205750411731104359622842837137
ans = 16.493361431346414501928877762217
Because 'Random'
selects starting points randomly, the same solution might be found on successive calls.
Find All Zeros in a Specified Search Range
Create a function findzeros
to systematically find all zeros for f
in a given search range, within a specified error tolerance. The function starts with the input search range and calls vpasolve
to find a zero. Then, it splits the search range into two around the zero value and recursively calls itself with the new search ranges as inputs to find more zeros.
The function is explained section by section here.
Declare the function with the three inputs and one output. The first input is the function, the second input is the range, and the optional third input allows you to specify the error between a zero and the higher and lower bounds generated from it.
function sol = findzeros(f,range,err)
If you do not specify the optional argument for error tolerance, findzeros
sets err
to 0.001
.
if nargin < 2 err = 1e-3; end
Find a zero in the search range using vpasolve
.
If vpasolve
does not find a zero, exit.
If vpasolve
finds a zero, split the search range into two search ranges above and below the zero.
else
lowLimit = sol-err;
highLimit = sol+err;
Call findzeros
with the lower search range. If findzeros
returns zeros, copy the values into the solution array and sort them.
temp = findzeros(f,[range(1) lowLimit],1); if ~isempty(temp) sol = sort([sol temp]); end
Call findzeros
with the higher search range. If findzeros
returns zeros, copy the values into the solution array and sort them.
temp = findzeros(f,[highLimit range(2)],1); if ~isempty(temp) sol = sort([sol temp]); end return end end
The entire function findzeros
is as follows. Save this function as findzeros.m
in the current folder.
function sol = findzeros(f,range,err) if nargin < 3 err = 1e-3; end sol = vpasolve(f,range); if(isempty(sol)) return else lowLimit = sol-err; highLimit = sol+err; temp = findzeros(f,[range(1) lowLimit],1); if ~isempty(temp) sol = sort([sol temp]); end temp = findzeros(f,[highLimit range(2)],1); if ~isempty(temp) sol = sort([sol temp]); end return end end
Call findzeros
with search range [15 25]
to find all zeros in that range for f(x) = exp(x/7)*cos(2*x)
, within the default error tolerance.
syms f(x)
f(x) = exp(x/7)*cos(2*x);
sol = findzeros(f,[15 25])'
sol =(16.49336143134641450192887776221718.06415775814131112116019945385719.63495408493620774039152114549721.20575041173110435962284283713722.77654673852600097885416452877624.347343065320897598085486220416)
Obtain Solutions to Arbitrary Precision
Use digits
to set the precision of the solutions returned by vpasolve
. By default, vpasolve
returns solutions to a precision of 32 significant figures.
f = exp(x/7)*cos(2*x); vpasolve(f)
ans = -7.0685834705770347865409476123789
Use digits
to increase the precision to 64 significant figures. When modifying digits
, ensure that you save its current value so that you can restore it.
digitsOld = digits; digits(64) vpasolve(f)
ans = -7.068583470577034786540947612378881489443631148593988097193625333
Next, change the precision of the solutions to 16 significant figures.
Solve Multivariate Equations Using Search Ranges
Consider the following system of equations.
z=10(cos(x)+cos(y))z=x+y2-0.1x2yx+y-2.7=0
A plot of the equations for 0≤x≤2.5 and 0≤x≤2.5 shows that the three surfaces intersect in two points. To better visualize the plot, use view
. To scale the colormap values, use caxis
.
syms x y z eqn1 = z == 10*(cos(x) + cos(y)); eqn2 = z == x+y^2-0.1*x^2*y; eqn3 = x+y-2.7 == 0; equations = [eqn1 eqn2 eqn3]; fimplicit3(equations) axis([0 2.5 0 2.5 -20 10]) title('System of Multivariate Equations') view(69, 28) caxis([-15 10])
Use vpasolve
to find a point where the surfaces intersect. The function vpasolve
returns a structure. To access the x
-, y
-, and z
-values of the solution, index into the structure.
sol = vpasolve(equations); [sol.x sol.y sol.z]
ans = (2.3697477224547980.33025227754520212.293354376823228)
To search a region of the solution space, specify search ranges for the variables. If you specify the ranges 0≤x≤1.5 and 1.5≤y≤2.5, then vpasolve
function searches the bounded area shown.
Use vpasolve
to find a solution for this search range. To omit a search range for z, set the third search range to [NaN NaN]
.
vars = [x y z]; range = [0 1.5; 1.5 2.5; NaN NaN]; sol = vpasolve(equations, vars, range); [sol.x sol.y sol.z]
ans = (0.91062661725633361.7893733827436663.964101572135625)
To find multiple solutions, set the 'Random'
option to true
. This makes vpasolve
use random starting points on successive runs. The 'Random'
option can be used in conjunction with search ranges to make vpasolve
use random starting points within a search range. Because 'Random'
selects starting points randomly, the same solution might be found on successive calls. Call vpasolve
repeatedly to ensure you find both solutions.
clear sol range = [0 3; 0 3; NaN NaN]; for k = 1:5 temp = vpasolve(equations,vars,range,'Random',true); sol(k,1) = temp.x; sol(k,2) = temp.y; sol(k,3) = temp.z; end sol
sol =(2.3697477224547980.33025227754520212.2933543768232282.3697477224547980.33025227754520212.2933543768232282.3697477224547980.3302522775452022.2933543768232280.91062661725633361.7893733827436663.9641015721356250.91062661725633361.7893733827436663.964101572135625)
Plot the equations. Superimpose the solutions as a scatter plot of points with yellow X
markers using scatter3
. To better visualize the plot, make two of the surfaces transparent using alpha
. Scale the colormap to the plot values using caxis
, and change the perspective using view
.
vpasolve
finds solutions at the intersection of the surfaces formed by the equations as shown.
clf ax = axes; h = fimplicit3(equations); h(2).FaceAlpha = 0; h(3).FaceAlpha = 0; axis([0 2.5 0 2.5 -20 10]) hold on scatter3(sol(:,1),sol(:,2),sol(:,3),600,'yellow','X','LineWidth',2) title('Randomly Found Solutions in Specified Search Range') cz = ax.Children; caxis([0 20]) view(69,28) hold off
Lastly, restore the old value of digits
for further calculations.