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.
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
Решение нелинейных уравнений в Matlab
Доброго времени суток. В этой статье мы разберем решение простых нелинейных уравнений с помощью средств Matlab. Посмотрим в действии как стандартные функции, так и сами запрограммируем три распространенных метода для решения нелинейных уравнений.
Общая информация
Уравнения, которые содержат переменные, находящиеся в степенях, отличающихся от единицы, или имеющие нелинейные математические выражения (корень, экспонента, логарифм, синус, косинус и т.д.), а также имеющие вид f(x) = 0 называются нелинейными. В зависимости от сложности такого уравнения применяют методы для решения нелинейных уравнений.
В этой статье, помимо стандартных функций Matlab, мы рассмотрим следующие методы:
- Метод перебора
- Метод простых итераций
- Метод половинного деления
Рассмотрим коротко их алгоритмы и применим для решения конкретной задачи.
Стандартные функции Matlab
Для решения нелинейных уравнений в Matlab есть функция fzero. Она принимает в качестве аргументов саму функцию, которую решаем, и отрезок, на котором происходит поиск корней нелинейного уравнения.
И сразу же разберем пример:
Решить нелинейное уравнение x = exp(-x), предварительно определив интервалы, на которых существуют решения уравнения.
Итак, для начала следует привести уравнение к нужному виду: x – exp(-x) = 0 , а затем определить интервалы, в которых будем искать решение уравнения. Методов для определения интервалов множество, но так как пример достаточно прост мы воспользуемся графическим методом.
Здесь задали примерные границы по оси x, чтобы можно было построить график и посмотреть как ведет себя функция. Вот график:
Из графика видно, что на отрезке [0;1] есть корень уравнения (там, где y = 0), соответственно в дальнейшем будем использовать этот интервал. Чем точнее выбран интервал, тем быстрее метод придет к решению уравнения, а для сложных уравнений правильный выбор интервала определяет погрешность, с которой будет получен ответ.
С помощью стандартной функции Matlab находим корень нелинейного уравнения и выводим. Теперь для проверки отобразим все это графически:
Как вы видите, все достаточно точно просчиталось. Теперь мы исследуем эту же функцию с помощью других методов и сравним полученные результаты.
Метод перебора Matlab
Самый простой метод, который заключается в том, что сначала задается какое то приближение x (желательно слева от предполагаемого корня) и значение шага h. Затем, пока выполняется условие f(x) * f(x + h) > 0, значение x увеличивается на значение шага x = x + h. Как только условие перестало выполняться — это значит, что решение нелинейного уравнения находится на интервале [x; x + h].
Теперь реализуем метод перебора в Matlab:
Лучше всего создать новый m-файл, в котором и прописать код. После вызова получаем такой вывод:
Функцию объявляем с помощью очень полезной команды inline, в цикле пока выполняется условие отсутствия корней (или их четного количества), прибавляем к x значение шага. Очевидно, что чем точнее начальное приближение, тем меньше итераций необходимо затратить.
Метод простых итераций Matlab
Этот метод заключается в том, что функцию преобразуют к виду: x = g(x). Эти преобразования можно сделать разными способами, в зависимости от вида начальной функции. Помимо этого следует задать интервал, в котором и будет производиться итерационный процесс, а также начальное приближение. Сам процесс строится по схеме xn= g(xn-1). То есть итерационно проходим от предыдущего значения к последующему.
Процесс заканчивается как только выполнится условие: , то есть, как только будет достигнута заданная точность. И сразу же разберем реализацию метода простых итераций в Matlab для примера, который был приведен выше.
Здесь должно быть все понятно, кроме одного: зачем задавать число итераций? Это нужно для того, чтобы программа не зацикливалась и не выполняла ненужные итерации, а также потому что не всегда программа может просчитать решение с нужной точностью — поэтому следует ограничивать число итераций.
А вот и вывод программы:
Очевидно, что метод простых итераций работает гораздо быстрее и получает точное решение.
Метод половинного деления Matlab
Метод достаточно прост: существует отрезок поиска решения [a;b], сначала находят значение функции в точке середины c, где c = (a+b)/2. Затем сравнивают знаки f(a) и f(c). Если знаки разные — то решение находится на отрезке [a;c], если нет — то решение находится на отрезке [c;b]. Таким образом мы сократили область в 2 раза. Такое сокращение происходит и дальше, пока не достигнем заданной точности.
Перейдем к реализации метода в Matlab:
Все самое важное происходит в цикле: последовательно сокращаем область нахождения решения, пока не будет достигнута заданная точность.
Вот что получилось в выводе:
Этот метод хорошо работает, когда правильно определен интервал, на котором находится решение. Тем не менее, метод простых итераций считается наиболее точным и быстрым.
Заключение
Сегодня мы рассмотрели решение нелинейных уравнений в Matlab. Теперь нам известны методы перебора, половинного деления, простых итераций. А также, когда нам не важно реализация метода, то можно использовать стандартную функцию в Matlab.
На этом все — спасибо за внимание. В следующей статье мы разберем решение систем нелинейных уравнений в matlab.
Получите корни многочлена в Matlab
Это руководство познакомит вас с тем, как найти корни многочлена с помощью функций roots() и solve() в MATLAB.
Получите корни многочлена с помощью функции roots() в MATLAB
Если вы хотите найти корни многочлена, вы можете использовать функцию roots() в MATLAB. Этот вход этой функции – вектор, который содержит коэффициенты полинома. Если в полиноме нет степени, то в качестве его коэффициента будет использоваться 0. Результатом этой функции является вектор-столбец, содержащий действительные и мнимые корни данного многочлена. Например, давайте найдем корни квадратного полинома: 2x ^ 2 – 3x + 6 = 0. Мы должны определить коэффициенты полинома, начиная с наивысшей степени, и если степень отсутствует, мы будем использовать 0 в качестве ее коэффициента. . См. Код ниже.
В приведенном выше коде мы использовали только коэффициенты полинома, начиная с наибольшей степени. Вы можете изменить коэффициенты многочлена в соответствии с данным многочленом. Знаем, давайте найдем корни многочлена четвертой степени: 2x ^ 4 + 1 = 0. См. Код ниже.
Мы использовали три 0 между двумя полиномами в приведенном выше коде, потому что три степени отсутствуют. Проверьте эту ссылку для получения дополнительной информации о функции root() .
Получите корни полинома с помощью функции solve() в MATLAB
Если вы хотите найти корни многочлена, вы можете использовать функцию resolve() в MATLAB. Этот вход этой функции является полиномом. Результатом этой функции является вектор-столбец, содержащий действительные и мнимые корни данного многочлена. Например, давайте найдем корни квадратного многочлена: 2x ^ 2 – 3x + 6 = 0. Нам нужно определить многочлен. См. Код ниже.
В приведенном выше коде мы определили весь многочлен и использовали функцию vpa() , чтобы изменить точность результата. Вы можете изменить полином в соответствии с заданным полиномом и точностью в соответствии с вашими требованиями. Знаем, давайте найдем корни многочлена четвертой степени: 2x ^ 4 + 1 = 0. См. Код ниже.
В приведенном выше коде мы определили весь многочлен и использовали функцию vpa() для изменения точности результата. Вы можете изменить полином в соответствии с заданным полиномом и точностью в соответствии с вашими требованиями.
solve
Equations and systems solver
Support for character vector or string inputs has been removed. Instead, use syms to declare variables and replace inputs such as solve(‘2*x == 1′,’x’) with solve(2*x == 1,x) .
Syntax
Description
S = solve( eqn , var ) solves the equation eqn for the variable var . If you do not specify var , the symvar function determines the variable to solve for. For example, solve(x + 1 == 2, x) solves the equation x + 1 = 2 for x.
S = solve( eqn , var , Name,Value ) uses additional options specified by one or more Name,Value pair arguments.
Y = solve( eqns , vars ) solves the system of equations eqns for the variables vars and returns a structure that contains the solutions. If you do not specify vars , solve uses symvar to find the variables to solve for. In this case, the number of variables that symvar finds is equal to the number of equations eqns .
Y = solve( eqns , vars , Name,Value ) uses additional options specified by one or more Name,Value pair arguments.
[ y1. yN ] = solve( eqns , vars ) solves the system of equations eqns for the variables vars . The solutions are assigned to the variables y1. yN . If you do not specify the variables, solve uses symvar to find the variables to solve for. In this case, the number of variables that symvar finds is equal to the number of output arguments N .
[ y1. yN ] = solve( eqns , vars , Name,Value ) uses additional options specified by one or more Name,Value pair arguments.
[ y1. yN , parameters , conditions ] = solve( eqns , vars ,’ ReturnConditions ‘,true) returns the additional arguments parameters and conditions that specify the parameters in the solution and the conditions on the solution.
Examples
Solve Quadratic Equation
Solve the quadratic equation without specifying a variable to solve for. solve chooses x to return the solution.
Specify the variable to solve for and solve the quadratic equation for a .
Solve Polynomial and Return Real Solutions
Solve a fifth-degree polynomial. It has five solutions.
Return only real solutions by setting ‘Real’ option to true . The only real solutions of this equation is 5 .
Numerically Solve Equations
When solve cannot symbolically solve an equation, it tries to find a numeric solution using vpasolve . The vpasolve function returns the first solution found.
Try solving the following equation. solve returns a numeric solution because it cannot find a symbolic solution.
Plot the left and the right sides of the equation. Observe that the equation also has a positive solution.
Find the other solution by directly calling the numeric solver vpasolve and specifying the interval.
Solve Multivariate Equations and Assign Outputs to Structure
When solving for multiple variables, it can be more convenient to store the outputs in a structure array than in separate variables. The solve function returns a structure when you specify a single output argument and multiple outputs exist.
Solve a system of equations to return the solutions in a structure array.
Access the solutions by addressing the elements of the structure.
Using a structure array allows you to conveniently substitute solutions into other expressions.
Use the subs function to substitute the solutions S into other expressions.
If solve returns an empty object, then no solutions exist.
Solve Inequalities
The solve function can solve inequalities and return solutions that satisfy the inequalities. Solve the following inequalities.
x 2 + y 2 + x y 1
Set ‘ReturnConditions’ to true to return any parameters in the solution and conditions on the solution.
The parameters u and v do not exist in MATLAB® workspace and must be accessed using S.parameters .
Check if the values u = 7/2 and v = 1/2 satisfy the condition using subs and isAlways .
isAlways returns logical 1 ( true ) indicating that these values satisfy the condition. Substitute these parameter values into S.x and S.y to find a solution for x and y .
Solve Multivariate Equations and Assign Outputs to Variables
Solve the system of equations.
When solving for more than one variable, the order in which you specify the variables defines the order in which the solver returns the solutions. Assign the solutions to variables solv and solu by specifying the variables explicitly. The solver returns an array of solutions for each variable.
Entries with the same index form the pair of solutions.
Use Parameters and Conditions to Refine Solution
Return the complete solution of an equation with parameters and conditions of the solution by specifying ‘ReturnConditions’ as true .
Solve the equation sin ( x ) = 0 . Provide two additional output variables for output arguments parameters and conditions .
The solution π k contains the parameter k , where k must be an integer. The variable k does not exist in MATLAB workspace and must be accessed using parameters .
Restrict the solution to 0 x 2 π . Find a valid value of k for this restriction. Assume the condition, conditions , and use solve to find k . Substitute the value of k found into the solution for x .
Alternatively, determine the solution for x by choosing a value of k . Check if the value chosen satisfies the condition on k using isAlways .
Check if k = 4 satisfies the condition on k .
isAlways returns logical 1( true ), meaning that 4 is a valid value for k . Substitute k with 4 to obtain a solution for x . Use vpa to obtain a numeric approximation.
Shorten Result with Simplification Rules
Solve the equation exp ( log ( x ) log ( 3 x ) ) = 4 .
By default, solve does not apply simplifications that are not valid for all values of x . In this case, the solver does not assume that x is a positive real number, so it does not apply the logarithmic identity log ( 3 x ) = log ( 3 ) + log ( x ) . As a result, solve cannot solve the equation symbolically.
Set ‘IgnoreAnalyticConstraints’ to true to apply simplification rules that might allow solve to find a solution. For details, see Algorithms.
solve applies simplifications that allow the solver to find a solution. The mathematical rules applied when performing simplifications are not always valid in general. In this example, the solver applies logarithmic identities with the assumption that x is a positive real number. Therefore, the solutions found in this mode should be verified.
Ignore Assumptions on Variables
The sym and syms functions let you set assumptions for symbolic variables.
Assume that the variable x is positive.
When you solve an equation for a variable under assumptions, the solver only returns solutions consistent with the assumptions. Solve this equation for x .
Allow solutions that do not satisfy the assumptions by setting ‘IgnoreProperties’ to true .
For further computations, clear the assumption that you set on the variable x by recreating it using syms .
Solve Polynomial Equations of High Degree
When you solve a polynomial equation, the solver might use root to return the solutions. Solve a third-degree polynomial.
Try to get an explicit solution for such equations by calling the solver with ‘MaxDegree’ . The option specifies the maximum degree of polynomials for which the solver tries to return explicit solutions. The default value is 2 . Increasing this value, you can get explicit solutions for higher order polynomials.
Solve the same equations for explicit solutions by increasing the value of ‘MaxDegree’ to 3 .
Return One Solution
Solve the equation sin ( x ) + cos ( 2 x ) = 1 .
Instead of returning an infinite set of periodic solutions, the solver picks three solutions that it considers to be the most practical.
Choose only one solution by setting ‘PrincipalValue’ to true .
Input Arguments
eqn — Equation to solve
symbolic expression | symbolic equation
Equation to solve, specified as a symbolic expression or symbolic equation. The relation operator == defines symbolic equations. If eqn is a symbolic expression (without the right side), the solver assumes that the right side is 0, and solves the equation eqn == 0 .
var — Variable for which you solve equation
symbolic variable
Variable for which you solve an equation, specified as a symbolic variable. By default, solve uses the variable determined by symvar .
eqns — System of equations
symbolic expressions | symbolic equations
System of equations, specified as symbolic expressions or symbolic equations. If any elements of eqns are symbolic expressions (without the right side), solve equates the element to 0 .
vars — Variables for which you solve an equation or system of equations
symbolic vector | symbolic matrix
Variables for which you solve an equation or system of equations, specified as a symbolic vector or symbolic matrix. By default, solve uses the variables determined by symvar .
The order in which you specify these variables defines the order in which the solver returns the solutions.
Name-Value Arguments
Real — Flag for returning only real solutions
false (default) | true
Flag for returning only real solutions, specified as the comma-separated pair consisting of ‘Real’ and one of these values.
false | Return all solutions. |
true | Return only those solutions for which every subexpression of the original equation represents a real number. This option also assumes that all symbolic parameters of an equation represent real numbers. |
ReturnConditions — Flag for returning parameters and conditions
false (default) | true
Flag for returning parameters in solution and conditions under which the solution is true, specified as the comma-separated pair consisting of ‘ReturnConditions’ and one of these values.
false | Do not return parameterized solutions and the conditions under which the solution holds. The solve function replaces parameters with appropriate values. |
true | Return the parameters in the solution and the conditions under which the solution holds. For a call with a single output variable, solve returns a structure with the fields parameters and conditions . For multiple output variables, solve assigns the parameters and conditions to the last two output variables. This behavior means that the number of output variables must be equal to the number of variables to solve for plus two. |
Example: [v1, v2, params, conditions] = solve(sin(x) +y == 0,y^2 == 3,’ReturnConditions’,true) returns the parameters in params and conditions in conditions .
IgnoreAnalyticConstraints — Simplification rules applied to expressions and equations
false (default) | true
Simplification rules applied to expressions and equations, specified as the comma-separated pair consisting of ‘IgnoreAnalyticConstraints’ and one of these values.
false | Use strict simplification rules. |
true | Apply purely algebraic simplifications to expressions and equations. Setting IgnoreAnalyticConstraints to true can give you simpler solutions, which could lead to results not generally valid. In other words, this option applies mathematical identities that are convenient, but the results might not hold for all possible values of the variables. In some cases, it also enables solve to solve equations and systems that cannot be solved otherwise. |
IgnoreProperties — Flag for returning solutions inconsistent with properties of variables
false (default) | true
Flag for returning solutions inconsistent with the properties of variables, specified as the comma-separated pair consisting of ‘IgnoreProperties’ and one of these values.
false | Do not include solutions inconsistent with the properties of variables. |
true | Include solutions inconsistent with the properties of variables. |
MaxDegree — Maximum degree of polynomial equations for which solver uses explicit formulas
2 (default) | positive integer smaller than 5
Maximum degree of polynomial equations for which solver uses explicit formulas, specified as a positive integer smaller than 5. The solver does not use explicit formulas that involve radicals when solving polynomial equations of a degree larger than the specified value.
PrincipalValue — Flag for returning one solution
false (default) | true
Flag for returning one solution, specified as the comma-separated pair consisting of ‘PrincipalValue’ and one of these values.
false | Return all solutions. |
true | Return only one solution. If an equation or a system of equations does not have a solution, the solver returns an empty symbolic object. |
Output Arguments
S — Solutions of equation
symbolic array
Solutions of an equation, returned as a symbolic array. The size of a symbolic array corresponds to the number of the solutions.
Y — Solutions of system of equations
structure
Solutions of a system of equations, returned as a structure. The number of fields in the structure correspond to the number of independent variables in a system. If ‘ReturnConditions’ is set to true , the solve function returns two additional fields that contain the parameters in the solution, and the conditions under which the solution is true.
y1. yN — Solutions of system of equations
symbolic variables
Solutions of a system of equations, returned as symbolic variables. The number of output variables or symbolic arrays must be equal to the number of independent variables in a system. If you explicitly specify independent variables vars , then the solver uses the same order to return the solutions. If you do not specify vars , the toolbox sorts independent variables alphabetically, and then assigns the solutions for these variables to the output variables.
parameters — Parameters in solution
vector of generated parameters
Parameters in a solution, returned as a vector of generated parameters. This output argument is only returned if ReturnConditions is true . If a single output argument is provided, parameters is returned as a field of a structure. If multiple output arguments are provided, parameters is returned as the second-to-last output argument. The generated parameters do not appear in the MATLAB ® workspace. They must be accessed using parameters .
Example: [solx, params, conditions] = solve(sin(x) == 0, ‘ReturnConditions’, true) returns the parameter k in the argument params .
conditions — Conditions under which solutions are valid
vector of symbolic expressions
Conditions under which solutions are valid, returned as a vector of symbolic expressions. This output argument is only returned if ReturnConditions is true . If a single output argument is provided, conditions is returned as a field of a structure. If multiple output arguments are provided, conditions is returned as the last output argument.
Example: [solx, params, conditions] = solve(sin(x) == 0, ‘ReturnConditions’, true) returns the condition in(k, ‘integer’) in conditions . The solution in solx is valid only under this condition.
If solve cannot find a solution and ReturnConditions is false , the solve function internally calls the numeric solver vpasolve that tries to find a numeric solution. For polynomial equations and systems without symbolic parameters, the numeric solver returns all solutions. For nonpolynomial equations and systems without symbolic parameters, the numeric solver returns only one solution (if a solution exists).
If solve cannot find a solution and ReturnConditions is true , solve returns an empty solution with a warning. If no solutions exist, solve returns an empty solution without a warning.
If the solution contains parameters and ReturnConditions is true , solve returns the parameters in the solution and the conditions under which the solutions are true. If ReturnConditions is false , the solve function either chooses values of the parameters and returns the corresponding results, or returns parameterized solutions without choosing particular values. In the latter case, solve also issues a warning indicating the values of parameters in the returned solutions.
If a parameter does not appear in any condition, it means the parameter can take any complex value.
The output of solve can contain parameters from the input equations in addition to parameters introduced by solve .
Parameters introduced by solve do not appear in the MATLAB workspace. They must be accessed using the output argument that contains them. Alternatively, to use the parameters in the MATLAB workspace use syms to initialize the parameter. For example, if the parameter is k , use syms k .
The variable names parameters and conditions are not allowed as inputs to solve .
To solve differential equations, use the dsolve function.
When solving a system of equations, always assign the result to output arguments. Output arguments let you access the values of the solutions of a system.
MaxDegree only accepts positive integers smaller than 5 because, in general, there are no explicit expressions for the roots of polynomials of degrees higher than 4.
The output variables y1. yN do not specify the variables for which solve solves equations or systems. If y1. yN are the variables that appear in eqns , then there is no guarantee that solve(eqns) will assign the solutions to y1. yN using the correct order. Thus, when you run [b,a] = solve(eqns) , you might get the solutions for a assigned to b and vice versa.
To ensure the order of the returned solutions, specify the variables vars . For example, the call [b,a] = solve(eqns,b,a) assigns the solutions for a to a and the solutions for b to b .
Algorithms
When you use IgnoreAnalyticConstraints , the solver applies these rules to the expressions on both sides of an equation.
log( a) + log( b) = log( a· b) for all values of a and b. In particular, the following equality is valid for all values of a, b, and c:
log( a b ) = b·log( a) for all values of a and b. In particular, the following equality is valid for all values of a, b, and c:
If f and g are standard mathematical functions and f( g( x)) = x for all small positive numbers, f( g( x)) = x is assumed to be valid for all complex values x. In particular:
asinh(sinh( x)) = x , acosh(cosh( x)) = x , atanh(tanh( x)) = x
W k( x· e x ) = x for all branch indices k of the Lambert W function.
The solver can multiply both sides of an equation by any expression except 0 .
The solutions of polynomial equations must be complete.
[spoiler title=”источники:”]
http://www.delftstack.com/ru/howto/matlab/find-roots-of-polynomial-matlab/
http://www.mathworks.com/help/symbolic/solve.html
[/spoiler]
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
Тема
5.2. Технология решения нелинейных
уравнений средствами MatLab
Для
решения систем алгебраических уравнений
и одиночных уравнений служит функция
solve:
-
solve(expr1,
expr2,…
exprN,
var1,
var2,…
varN)–
возвращает значения переменных
var1,
при которых соблюдаются равенства,
заданные выражениями
exprI.
Если в выражениях не используются знаки
равенства, то
полагается ехргI
= 0; -
solve(expr1,
expr2,
….. exprN)–аналогична
предшествующей функции,
но переменные, по которым ищется решение,
определяются функцией
findsym.
Пример
4.2-1. Решить
несколько нелинейных уравнений.
Пример4.2-1 |
» » ans [ 1] [ [ » » ans [ [ »S S
x
y » ans [4] [1] [1] » ans [-1] [2] [2] » ans 0.52359877559829887307710723054658 >> |
Пример4.2-2.
Отделить корни уравнения
с
непрерывной правой частью.
Найдем отрезок, на концах которого
имеет
разные знаки. Т.е. решим уравнение
.
Пример |
syms >> >> >> >> |
В математическом пакете
MatLab
имеется также ряд встроенных функций
для численного вычисления корней
уравнений.
Рассмотрим программные
средства MatLabна
примерах.
Пример
4.2-3. Локализовать
корни уравнения f(x)=x3–cos(x)+1.
Пример |
>>f >>x |
>>figure(‘Name’, >>plot(x, >>figure(‘Name’, >>figure(‘Name’, >> |
Решение
алгебраических и трансцендентных
уравнений в среде MatLAB
проще реализовать с помощью встроенных
функций: solve(),
fzero(),
roors().
Для
нахождения вещественных корней уравнений
вида f(х)=0
используется функция fzero().
Алгоритм,
реализованный этой функцией, представляет
собой комбинацию
метода дихотомии (деления пополам),
метода секущих и метода обратной
квадратичной интерполяции.
В простейшем варианте обращения кроме
указателя
на функцию, корень которой ищется,
задается окрестность х0,
с которой
начинается поиск: х
= fzero(f,
x0).
Аргумент
fможет
быть задан одним из способов:
-
формойс
неизвестным х,
заключенная в апострофы; -
именем
m-файла
(в апострофах и без расширения m); -
указателем
на функцию (например, @f_name); -
указателем
на анонимную функцию (например, f_handie).
При этом формула, заключенная
в апострофы, в качестве независимой
переменной может
содержать только х.
Использование независимой переменной
с другим именем
вызовет сообщение об ошибке.
Аргумент
х0
может быть задан одним из двух способов:
-
вектором
[a;b],
представляющим интервал (а<b),на
концах которого функция
f()меняет
знак, что гарантирует нахождение, по
крайней мере, одного
корня на этом интервале; -
скалярным
значением, в окрестности которого
предполагается нахождение
корня. В этом случае функция fzero()
сама пытается найти отрезок
с центром в заданной точке х0,
на концах которого функцияf
()меняет
знак.
Чтобы
облегчить работу по выбору начального
приближения, разумнее всего построить
график функции y=f
(x).
Пример
4.2-4.
Построить график функции f(x)=x∙e–x+sin(x)
для локализации корня.
Пример |
x y plot(x, grid title(‘y=x*exp(-x)+sin(x) |
Из
графика видно, что один из корней
находится на интервале [3;4].
Используем
полученную информациюи
обратимся к функции
fzero(
):
Пример |
>> x= 3.2665 >> |
Вместо
явного задания формулы для функции f
мы могли бы объявить соответствующую
функцию, запомнив ее в виде автономного
m-файла
или включив
ее в качестве подфункции в файл нашей
программы.
Пример |
function x=fzero(@f1, function
y= |
Если
мы хотим получить не только значение
корня, но и узнать значение функции в
найденной точке, то к функции fzero( ) можно
обратиться с двумя выходными параметрами.
В ряде
задач такая точность может оказаться
излишней. MatLab предоставляет пользователю
возможность формировать различные
условия прекращения итерационного
процесса – по точности вычисления
координаты х, по модулю значения функции
f(), по количеству обращений к функции
f() и т. д.
Пример
4.2-5.
Найти
решения tg(x)=0
на
интервале[1;2].
Пример |
>> х 1.5708 f -1.2093e+015 >> |
Якобы
«корень», соответствующий приближенному
значению ?/2,
на самом деле является точкой разрыва,
при переходе через которую функция
меняет знак. Выведенное значение функции
в найденной точке убеждает нас в том,
что найден не корень.
Функция
fzero() может возвратить еще два выходных
параметра.
Пример |
>> >> |
Положительное
значение e_fiag
(обычно, это 1) означает, что удалось
найти
интервал, на концах которого функция
f(
)
меняет знак (пример с tg(x)не
должен притупить вашу бдительность).
Если такой интервал не обнаружен,
то e_fiag=-1.
Структура inform
содержит три поля с именами iterations,
funcCountи
algorithm.
В первом из них находится количество
итераций,
выполненных при поиске корня, во втором
–
количество обращений к функции f(
),
в третьем –
наименование алгоритма, использованного
для нахождения корня.
Пример
4.2-6.
Найти
корень уравнения с помощью функции
fzero().
Пример |
» x f= e_flag inform iterations: funcCount:
algorithm: >> |
В данном случае достижение
высокой точности потребовалось
8 итераций. Простое деление отрезка
пополам для достижения
такой же точности потребовало бы больше
итераций.
Отделение отрезка, на концах
которого функция принимает значения
разных знаков, является принципиальным
для алгоритма, использованного
в функции fzero().
Даже в таких тривиальных уравнениях,
как х2=0,
обычно
не удается найти решение.
Для символьного (аналитического)
решения уравнений в MatLab используется
функция solve(),которая
представляется в следующем
виде:solve(‘f(x)’,x),solve(‘f(x)’),где:
‘f(x)’–
решаемое уравнение, записанное в
одиночных кавычках и представленное в
произвольной форме; x–
искомая символьная неизвестная (symsx).
Рассмотрим технологию
определения корня с помощью функции
solve()
на примерах.
Пример
4.2-7.Найти
решение уравнения2x–3(a–b)=0
в символьном
виде.
Пример |
>>syms >> y log((3*a-3*b)/log(2)) >> |
Пример
4.2-8.Решить
уравнение 2x–4∙x+3=0
аналитически.
|
>>syms >> y 1.418 3.413 >> |
Функция
в ряде случаев позволяет определить
все корни уравнения f(x)=0
без указания начальных
значений x
или областей изоляции корней.
Функция solve()
имеет следующий недостаток. Она не
требует информации о начальном значении
корня или области его изоляции. Поэтому
в случае трансцендентных уравнений и
в ряде других случаев, она не находит
всех корней уравнения.
Пример
4.2-9.Решить
уравнение 2x–3(a–b)=0,
где a
– независимая
переменная.
|
>>syms >> y 1/3*2^x+ >> |
[Введите текст] Страница
11
Соседние файлы в папке Учебное пособие
- #
- #
- #
- #
- #
- #
- #
- #