Как найти корни полинома в матлабе

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

Figure contains an axes object. The axes object contains an object of type line.

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.

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

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(p) returns
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
2 -2]
represents the polynomial 3×2+2x−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).
    The poly function is the inverse of the roots function.

  • Use the fzero function
    to find the roots of nonlinear equations. While the roots function
    works only with polynomials, the fzero 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 nth
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 nn матрица, 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

  1. Получите корни многочлена с помощью функции roots() в MATLAB
  2. Получите корни полинома с помощью функции solve() в MATLAB

Получите корни многочлена в 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

Figure contains an axes object. The axes object contains an object of type functionline.

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])

Figure contains an axes object. The axes object with title System of Multivariate Equations contains 3 objects of type implicitfunctionsurface.

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

Figure contains an axes object. The axes object with title Randomly Found Solutions in Specified Search Range contains 4 objects of type implicitfunctionsurface, scatter.

Lastly, restore the old value of digits for further calculations.

Добавить комментарий