solve
FunctionIf solve
returns solutions that look complicated,
or if solve
cannot handle an input, there are
many options. These options simplify the solution space for solve
.
These options also help solve
when the input
is complicated, and might allow solve
to return
a solution where it was previously stuck.
Solve the equation x^5 - 1 == 0
. This equation
has five solutions.
syms x solve(x^5 - 1 == 0, x)
ans = 1 - (2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 - 5^(1/2)/4 - 1/4 (2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 - 5^(1/2)/4 - 1/4 5^(1/2)/4 - (2^(1/2)*(5^(1/2) + 5)^(1/2)*1i)/4 - 1/4 5^(1/2)/4 + (2^(1/2)*(5^(1/2) + 5)^(1/2)*1i)/4 - 1/4
If you only need real solutions, specify the Real
option
as true
. The solve
function
returns the one real solution.
solve(x^5 - 1, x, 'Real', true)
ans = 1
Solve the following equation. The solve
function
returns a complicated solution.
syms x solve(x^(5/2) + 1/x^(5/2) == 1, x)
ans = 1/(1/2 - (3^(1/2)*1i)/2)^(2/5) 1/((3^(1/2)*1i)/2 + 1/2)^(2/5) -(5^(1/2)/4 - (2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 + 1/4)/(1/2 - (3^(1/2)*1i)/2)^(2/5) -((2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 + 5^(1/2)/4 + 1/4)/(1/2 - (3^(1/2)*1i)/2)^(2/5) -(5^(1/2)/4 - (2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 + 1/4)/(1/2 + (3^(1/2)*1i)/2)^(2/5) -((2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 + 5^(1/2)/4 + 1/4)/(1/2 + (3^(1/2)*1i)/2)^(2/5)
To apply simplification rules when solving equations, specify
the IgnoreAnalyticConstraints
option as true
.
The applied simplification rules are not generally correct mathematically
but might produce useful solutions, especially in physics and engineering.
With this option, the solver does not guarantee the correctness and
completeness of the result.
solve(x^(5/2) + 1/x^(5/2) == 1, x, 'IgnoreAnalyticConstraints', true)
ans = 1/(1/2 - (3^(1/2)*1i)/2)^(2/5) 1/((3^(1/2)*1i)/2 + 1/2)^(2/5)
This solution is simpler and more usable.
For solutions to specific cases, set assumptions to return appropriate
solutions. Solve the following equation. The solve
function
returns seven solutions.
syms x solve(x^7 + 2*x^6 - 59*x^5 - 106*x^4 + 478*x^3 + 284*x^2 - 1400*x + 800, x)
ans = 1 - 5^(1/2) - 1 - 17^(1/2)/2 - 1/2 17^(1/2)/2 - 1/2 -5*2^(1/2) 5*2^(1/2) 5^(1/2) - 1
Assume x
is a positive number and solve the
equation again. The solve
function only returns
the four positive solutions.
assume(x > 0) solve(x^7 + 2*x^6 - 59*x^5 - 106*x^4 + 478*x^3 + 284*x^2 - 1400*x + 800, x)
ans = 1 17^(1/2)/2 - 1/2 5*2^(1/2) 5^(1/2) - 1
Place the additional assumption that x
is
an integer using in(x,'integer')
. Place additional
assumptions on variables using assumeAlso
.
assumeAlso(in(x,'integer')) solve(x^7 + 2*x^6 - 59*x^5 - 106*x^4 + 478*x^3 + 284*x^2 - 1400*x + 800, x)
ans = 1
solve
returns the only positive, integer
solution to x
.
Clear the assumptions on x
for further computations by recreating it using
syms
.
syms x
Alternatively, to make several assumptions, use the &
operator.
Make the following assumptions, and solve the following equations.
syms a b c f g h y assume(f == c & a == h & a~= 0) S = solve([a*x + b*y == c, h*x - g*y == f], [x, y], 'ReturnConditions', true); S.x S.y S.conditions
ans = f/h ans = 0 ans = b + g ~= 0
Under the specified assumptions, the solution is x
= f/h
and y = 0
under the condition b
+ g ~= 0
.
Clear the assumptions on the variables for further computations by recreating them using
syms
.
syms a c f h
The solve
function does not call simplification
functions for the final results. To simplify the solutions, call simplify
.
Solve the following equation. Convert the numbers to symbolic
numbers using sym
to return a symbolic result.
syms x S = solve((sin(x) - 2*cos(x))/(sin(x) + 2*cos(x)) == 1/2, x)
S = -log(-(- 140/37 + 48i/37)^(1/2)/2)*1i -log((- 140/37 + 48i/37)^(1/2)/2)*1i
Call simplify
to simplify solution S
.
simplify(S)
ans = -log(37^(1/2)*(- 1/37 - 6i/37))*1i log(2)*1i - (log(- 140/37 + 48i/37)*1i)/2
Call simplify
with more steps to simplify
the result even further.
simplify(S, 'Steps', 50)
ans = atan(6) - pi atan(6)
To represent a number exactly, use sym
to
convert the number to a floating-point object. For example, use sym(13)/5
instead
of 13/5
. This represents 13/5
exactly
instead of converting 13/5
to a floating-point
number. For a large number, place the number in quotes. Compare sym(13)/5
, sym(133333333333333333333)/5
,
and sym('133333333333333333333')/5
.
sym(13)/5 sym(133333333333333333333)/5 sym('133333333333333333333')/5
ans = 13/5 ans = 133333333333333327872/5 ans = 133333333333333333333/5
Placing the number in quotes and using sym
provides
the highest accuracy.
If possible, simplify the system of equations manually
before using solve
. Try to reduce the number
of equations, parameters, and variables.