Уравнения и системный решатель
Входные параметры вектора символов были удалены. Вместо этого используйте syms
, чтобы объявить переменные и входные параметры замены, такие как solve('2*x == 1','x')
с solve(2*x == 1,x)
.
S = solve(eqn,var)
S = solve(eqn,var,Name,Value)
Y = solve(eqns,vars)
Y = solve(eqns,vars,Name,Value)
[y1,...,yN] = solve(eqns,vars)
[y1,...,yN] = solve(eqns,vars,Name,Value)
[y1,...,yN,parameters,conditions]
= solve(eqns,vars,'ReturnConditions',true)
дополнительные опции использования заданы одним или несколькими аргументами пары S
= solve(eqn
,var
,Name,Value
)Name,Value
.
решает систему уравнений Y
= solve(eqns
,vars
)eqns
для переменных vars
и возвращает структуру, которая содержит решения. Если вы не задаете vars
, solve
использует symvar
, чтобы найти, что переменные решают для. В этом случае, количество переменных, что находки symvar
равны количеству уравнений eqns
.
дополнительные опции использования заданы одним или несколькими аргументами пары Y
= solve(eqns
,vars
,Name,Value
)Name,Value
.
[
решает систему уравнений y1,...,yN
] = solve(eqns
,vars
)eqns
для переменных vars
. Решения присвоены переменным y1,...,yN
. Если вы не задаете переменные, solve
использует symvar
, чтобы найти, что переменные решают для. В этом случае, количество переменных, что находки symvar
равны количеству выходных аргументов N
.
[
дополнительные опции использования заданы одним или несколькими аргументами пары y1,...,yN
] = solve(eqns
,vars
,Name,Value
)Name,Value
.
[
возвращает дополнительные аргументы y1,...,yN
,parameters
,conditions
]
= solve(eqns
,vars
,'ReturnConditions
',true)parameters
и conditions
, которые задают параметры в решении и условиях на решении.
Используйте оператор ==
, чтобы задать уравнение sin(x) == 1
и решить его.
syms x eqn = sin(x) == 1; solx = solve(eqn,x)
solx = pi/2
Найдите полное решение того же уравнения путем определения опции ReturnConditions
как true
. Задайте выходные переменные для решения, параметров в решении и условий на решении.
[solx, params, conds] = solve(eqn, x, 'ReturnConditions', true)
solx = pi/2 + 2*pi*k params = k conds = in(k, 'integer')
pi/2 + 2*pi*k
решения содержит параметр k
, который допустим при условии in(k, 'integer')
. Это условие означает параметр, k
должен быть целым числом.
Если solve
возвращает пустой объект, то никакие решения не существуют. Если solve
возвращает пустой объект с предупреждением, решения могут существовать, но solve
не нашел решений.
eqns = [3*x+2, 3*x+1]; solve(eqns, x)
ans = Empty sym: 0-by-1
Возвратите полное решение уравнения с параметрами и условиями решения путем определения ReturnConditions
как true
.
Решите sin уравнения (x) = 0. Обеспечьте две дополнительных выходных переменные для выходных аргументов parameters
и conditions
.
syms x eqn = sin(x) == 0; [solx, param, cond] = solve(eqn, x, 'ReturnConditions', true)
solx = pi*k param = k cond = in(k, 'integer')
Решение pi*k
содержит параметр k
и допустим при условии in(k,'integer')
. Это условие означает параметр, k
должен быть целым числом. k
не существует в рабочей области MATLAB® и должен быть получен доступ с помощью param
.
Найдите допустимое значение k
для 0 < x < 2*pi
путем принятия условия, cond
, и использования solve
, чтобы решить эти условия для k
. Замените значением k
, найденного в решение для x
.
assume(cond) interval = [solx > 0, solx < 2*pi]; solk = solve(interval, param) valx = subs(solx, param, solk)
solk = 1 valx = pi
Допустимым значением k
для 0 < x < 2*pi
является 1
. Это производит значение x = pi
.
Также найдите решение для x
путем выбора значения k
. Проверяйте, удовлетворяет ли выбранное значение условие на k
с помощью isAlways
.
Проверяйте, удовлетворяет ли k = 4
условие на k
.
condk4 = subs(cond, param, 4); isAlways(condk4)
ans = logical 1
isAlways
возвращает логический 1
(true
), означая, что 4
является допустимым значением для k
. Замените k
с 4
, чтобы получить решение для x
. Используйте vpa
, чтобы получить числовое приближение.
valx = subs(solx, param, 4) vpa(valx)
valx = 4*pi ans = 12.566370614359172953850573533118
Избегайте неоднозначностей при решении уравнений с символьными параметрами путем определения переменной, для которой вы хотите решить уравнение. Если вы не задаете переменную, solve
выбирает переменную с помощью symvar
. Во-первых, решите квадратное уравнение, не задавая переменную. solve
выбирает x, чтобы возвратить знакомое решение. Затем решите квадратное уравнение для a
, чтобы возвратить решение для a
.
syms a b c x eqn = a*x^2 + b*x + c == 0; sol = solve(eqn) sola = solve(eqn, a)
sol = -(b + (b^2 - 4*a*c)^(1/2))/(2*a) -(b - (b^2 - 4*a*c)^(1/2))/(2*a) sola = -(c + b*x)/x^2
При решении больше чем для одной переменной порядок, в котором вы задаете переменные, задает порядок, в котором решатель возвращает решения.
Решите эту систему уравнений и присвойте решения переменных solv
и solu
путем определения переменных явным образом. Решатель возвращает массив решений для каждой переменной.
syms u v eqns = [2*u^2 + v^2 == 0, u - v == 1]; vars = [v u]; [solv, solu] = solve(eqns, vars)
solv = - (2^(1/2)*1i)/3 - 2/3 (2^(1/2)*1i)/3 - 2/3 solu = 1/3 - (2^(1/2)*1i)/3 (2^(1/2)*1i)/3 + 1/3
Записи с тем же индексом формируют решения системы.
solutions = [solv solu]
solutions = [ - (2^(1/2)*1i)/3 - 2/3, 1/3 - (2^(1/2)*1i)/3] [ (2^(1/2)*1i)/3 - 2/3, (2^(1/2)*1i)/3 + 1/3]
Решением системы является v = - (2^(1/2)*1i)/3 - 2/3
и u = 1/3 - (2^(1/2)*1i)/3
.
При решении для нескольких переменных может быть более удобно сохранить выходные параметры в массиве структур, чем в отдельных переменных. Функция solve
возвращает структуру, когда вы задаете один выходной аргумент, и существуют несколько выходных параметров.
Решите систему уравнений, чтобы возвратить решения в массиве структур.
syms u v eqns = [2*u + v == 0, u - v == 1]; S = solve(eqns, [u v])
S = struct with fields: u: [1×1 sym] v: [1×1 sym]
Доступ к решениям путем обращения к элементам структуры.
S.u S.v
ans = 1/3 ans = -2/3
Используя массив структур позволяет вам удобно заменять решениями в выражения. Функция subs
заменяет правильными значениями, независимо от которых переменных вы занимаете место.
Замените решениями в выражения с помощью структуры S
.
expr1 = u^2; subs(expr1, S) expr2 = 3*v+u; subs(expr2, S)
ans = 1/9 ans = -5/3
Возвратите полное решение системы уравнений с параметрами и условиями решения путем определения ReturnConditions
как true
.
syms x y eqns = [sin(x)^2 == cos(y), 2*x == y]; S = solve(eqns, [x y], 'ReturnConditions', true); S.x S.y S.conditions S.parameters
ans = pi*k - asin(3^(1/2)/3) asin(3^(1/2)/3) + pi*k ans = 2*pi*k - 2*asin(3^(1/2)/3) 2*asin(3^(1/2)/3) + 2*pi*k ans = in(k, 'integer') in(k, 'integer') ans = k
Решение формируется элементами того же индекса в S.x
, S.y
и S.conditions
. Любой элемент S.parameters
может появиться в любом решении. Например, решением является x = pi*k - asin(3^(1/2)/3)
и y = 2*pi*k - 2*asin(3^(1/2)/3)
, с параметром k
при условии in(k, 'integer')
. Это условие означает, что k
должен быть целым числом для решения быть допустимым. k
не существует в рабочем пространстве MATLAB и должен быть получен доступ с S.parameters
.
Для первого решения найдите допустимое значение k
для 0 < x < pi
путем принятия условия S.conditions(1)
и использования solve
, чтобы решить эти условия для k
. Замените значением k
, найденного в решение для x
.
assume(S.conditions(1)) interval = [S.x(1)>0, S.x(1)<pi]; solk = solve(interval, S.parameters) solx = subs(S.x(1), S.parameters, solk)
solk = 1 solx = pi - asin(3^(1/2)/3)
Допустимым значением k
для 0 < x < pi
является 1
. Это производит значение x = pi - asin(3^(1/2)/3)
.
Также найдите решение для x
путем выбора значения k
. Проверяйте, удовлетворяет ли выбранное значение условие на k
с помощью isAlways
.
Проверяйте, удовлетворяет ли k = 4
условие на k
.
condk4 = subs(S.conditions(1), S.parameters, 4); isAlways(condk4)
ans = logical 1
isAlways
возвращает логический 1
(true
), означающий, что 4
является допустимым значением для k
. Замените k
с 4
, чтобы получить решение для x
. Используйте vpa
, чтобы получить числовое приближение.
valx = subs(S.x(1), S.parameters, 4) vpa(valx)
valx = 4*pi - asin(3^(1/2)/3) ans = 11.950890905688785612783108943994
Когда solve
не может символически решить уравнение, он пытается найти числовое решение с помощью vpasolve
. Функция vpasolve
возвращает первое найденное решение.
Попытайтесь решить следующее уравнение. solve
возвращает числовое решение, потому что он не может найти символьное решение.
syms x eqn = sin(x) == x^2 - 1; solve(eqn, x)
Warning: Unable to solve symbolically. Returning a numeric solution using vpasolve. > In solve (line 304) ans = -0.63673265080528201088799090383828
Постройте левые и правые стороны уравнения. Заметьте, что уравнение также имеет положительное решение.
fplot([lhs(eqn) rhs(eqn)], [-2 2])
Найдите это решение путем прямого вызова числового решателя vpasolve
и определения интервала.
vpasolve(eqn, x, [0 2])
ans = 1.4096240040025962492355939705895
solve
может решить неравенства, чтобы найти решение, которое удовлетворяет неравенства.
Решите следующие неравенства. Установите ReturnConditions
на true
возвращать любые параметры в решении и условиях на решении.
syms x y cond1 = x^2 + y^2 + x*y < 1; cond2 = x > 0; cond3 = y > 0; conds = [cond1 cond2 cond3]; sol = solve(conds, [x y], 'ReturnConditions', true); sol.x sol.y sol.parameters sol.conditions
ans = (- 3*v^2 + u)^(1/2)/2 - v/2 ans = v ans = [ u, v] ans = 4*v^2 < u & u < 4 & 0 < v
Параметры u
и v
не существуют в рабочем пространстве MATLAB и должны быть получены доступ с помощью sol.parameters
.
Проверяйте, удовлетворяют ли значения u = 7/2
и v = 1/2
условие с помощью subs
и isAlways
.
condWithValues = subs(sol.conditions, sol.parameters, [7/2,1/2]); isAlways(condWithValues)
ans = logical 1
isAlways
возвращает логический 1
(true
), указывающий, что эти значения удовлетворяют условие. Замените этими значениями параметров в sol.x
и sol.y
, чтобы найти решение для x
и y
.
xSol = subs(sol.x, sol.parameters, [7/2,1/2]) ySol = subs(sol.y, sol.parameters, [7/2,1/2])
xSol = 11^(1/2)/4 - 1/4 ySol = 1/2
Преобразуйте решение в числовую форму при помощи vpa
.
vpa(xSol) vpa(ySol)
ans = 0.57915619758884996227873318416767 ans = 0.5
Решите это уравнение. Это имеет пять решений.
syms x eqn = x^5 == 3125; solve(eqn, x)
ans = 5 - (2^(1/2)*(5 - 5^(1/2))^(1/2)*5i)/4 - (5*5^(1/2))/4 - 5/4 (2^(1/2)*(5 - 5^(1/2))^(1/2)*5i)/4 - (5*5^(1/2))/4 - 5/4 (5*5^(1/2))/4 - (2^(1/2)*(5^(1/2) + 5)^(1/2)*5i)/4 - 5/4 (5*5^(1/2))/4 + (2^(1/2)*(5^(1/2) + 5)^(1/2)*5i)/4 - 5/4
Возвратите только действительные решения путем установки аргумента Real
на true
. Единственным действительным решением этого уравнения является 5
.
solve(eqn, x, 'Real', true)
ans = 5
Решите это уравнение. Вместо того, чтобы возвратить бесконечное множество периодических решений, решатель выбирает эти три решения, которые он считает самым практичным.
syms x eqn = sin(x) + cos(2*x) == 1; solve(eqn, x)
ans = 0 pi/6 (5*pi)/6
Выберите только одно решение с помощью PrincipalValue
.
eqn = sin(x) + cos(2*x) == 1; solve(eqn, x, 'PrincipalValue', true)
ans = 0
Попытайтесь решить это уравнение. По умолчанию solve
не применяет упрощения, которые не всегда математически правильны. В результате solve
не может решить это уравнение символически.
syms x eqn = exp(log(x)*log(3*x)) == 4; solve(eqn, x)
Warning: Unable to solve symbolically. Returning a numeric solution using vpasolve. > In solve (line 304) ans = - 14.009379055223370038369334703094 - 2.9255310052111119036668717988769i
Установите IgnoreAnalyticConstraints
на true
применять упрощения, которые могут позволить solve
находить результат. Для получения дополнительной информации см. Алгоритмы.
S = solve(eqn, x, 'IgnoreAnalyticConstraints', true)
S = (3^(1/2)*exp(-(log(256) + log(3)^2)^(1/2)/2))/3 (3^(1/2)*exp((log(256) + log(3)^2)^(1/2)/2))/3
solve
применяет упрощения, которые позволяют ему находить решение. Примененные упрощения не всегда содержат. Таким образом решения в этом режиме не могут быть правильны или завершены, и нуждаться в верификации.
sym
и функции syms
позволяют вам установить предположения для символьных переменных.
Примите, что переменная x может иметь только положительные значения.
syms x positive
Когда вы решаете уравнение или систему уравнений для переменной под предположениями, решатель только возвращает решения, сопоставимые с предположениями. Решите это уравнение для x
.
eqn = x^2 + 5*x - 6 == 0; solve(eqn, x)
ans = 1
Позвольте решения, которые не удовлетворяют предположения установкой IgnoreProperties
к true
.
solve(eqn, x, 'IgnoreProperties', true)
ans = -6 1
Для дальнейших вычислений очистите предположение, что вы устанавливаете на переменной x путем воссоздания его с помощью syms
.
syms x
root
При решении полиномов solve
может возвратить решения, содержащие root
. Чтобы численно аппроксимировать эти решения, используйте vpa
. Рассмотрите следующее уравнение и решение.
syms x eqn = x^4 + x^3 + 1 == 0; s = solve(eqn, x)
s = root(z^4 + z^3 + 1, z, 1) root(z^4 + z^3 + 1, z, 2) root(z^4 + z^3 + 1, z, 3) root(z^4 + z^3 + 1, z, 4)
Поскольку нет никаких параметров в этом решении, используйте vpa
, чтобы аппроксимировать его численно.
vpa(s)
ans = 0.5189127943851558447865795886366 - 0.666609844932018579153758800733i 0.5189127943851558447865795886366 + 0.666609844932018579153758800733i - 1.0189127943851558447865795886366 - 0.60256541999859902604398442197193i - 1.0189127943851558447865795886366 + 0.60256541999859902604398442197193i
Когда вы решаете уравнение полинома высшего порядка, решатель может использовать root
, чтобы возвратить результаты. Решите уравнение порядка 3.
syms x a eqn = x^3 + x^2 + a == 0; solve(eqn, x)
ans =
Попытайтесь получить явное решение для таких уравнений путем вызова решателя с MaxDegree
. Опция задает максимальную степень полиномов, для которых решатель пытается возвратить явные решения. Значением по умолчанию является 2
. Увеличивая это значение, можно получить явные решения для полиномов высшего порядка.
Решите те же уравнения для явных решений путем увеличения значения MaxDegree
к 3
.
S = solve(eqn, x, 'MaxDegree', 3)
S =
Если solve
не может найти решение, и ReturnConditions
является false
, функция solve
внутренне вызывает числовой решатель vpasolve
, который пытается найти числовое решение. Если solve
не может найти решение, и ReturnConditions
является true
, solve
возвращает пустое решение с предупреждением. Если никакие решения не существуют, solve
возвращает пустое решение без предупреждения. Для полиномиальных уравнений и систем без символьных параметров, числовой решатель возвращает все решения. Для неполиномиальных уравнений и систем без символьных параметров, числовой решатель возвращает только одно решение (если решение существует).
Если решение содержит параметры, и ReturnConditions
является true
, solve
возвращает параметры в решении и условиях, при которых решения верны. Если ReturnConditions
является false
, функцией solve
или выбирает значения параметров и возвращает соответствующие результаты, или возвращает параметризованные решения, не выбирая особые значения. В последнем случае solve
также выдает предупреждение, указывающее на значения параметров в возвращенных решениях.
Если параметр не появляется ни в каком условии, это означает, что параметр может взять любое комплексное число.
Вывод solve
может содержать параметры от исходных уравнений в дополнение к параметрам, введенным solve
.
Параметры, введенные solve
, не появляются в рабочем пространстве MATLAB. К ним нужно получить доступ с помощью выходного аргумента, который содержит их. Также, чтобы использовать параметры в рабочем пространстве MATLAB используют syms
, чтобы инициализировать параметр. Например, если параметром является k
, используйте syms k
.
Имена переменных parameters
и conditions
не позволены как входные параметры solve
.
Синтаксис S = solve(eqn,var,'ReturnConditions',true)
возвращает S
как структуру вместо символьного массива.
Чтобы решить дифференциальные уравнения, используйте функцию dsolve
.
При решении системы уравнений всегда присваивайте результат выходным аргументам. Выходные аргументы позволяют вам получить доступ к значениям решений системы.
MaxDegree
только принимает положительные целые числа, меньшие, чем 5 потому что, в целом, нет никаких явных выражений для корней полиномов степеней выше, чем 4.
y1,...,yN
выходных переменных не задает переменные, для которых solve
решает уравнения или системы. Если y1,...,yN
является переменными, которые появляются в eqns
, то нет никакой гарантии, что solve(eqns)
присвоит решения y1,...,yN
с помощью правильного порядка. Таким образом, когда вы запускаете [b,a] = solve(eqns)
, вы можете получить решения для a
, присвоенного b
и наоборот.
Чтобы гарантировать порядок возвращенных решений, задайте переменные vars
. Например, вызов [b,a] = solve(eqns,b,a)
присваивает решения для a
к a
и решения для b
к b
.
Когда вы используете IgnoreAnalyticConstraints
, решатель применяет эти правила к выражениям с обеих сторон уравнения.
регистрируйте (a) + журнал (b) = журнал (a · b) для всех значений a и b. В частности, следующее равенство допустимо для всех значений a, b и c:
A·) c = a c · b c.
журнал (a b) = b · регистрируйте (a) для всех значений a и b. В частности, следующее равенство допустимо для всех значений a, b и c:
(a b) c = a b · c.
Если f и g являются стандартными математическими функциями и f (g (x)) = x для всех маленьких положительных чисел, f (g (x)) = , x принят, чтобы быть допустимым для всех комплексных чисел x. В частности:
журнал (e x) = x
asin (sin (x)) = x, acos (cos (x)) = x, atan (загар (x)) = x
asinh (sinh (x)) = x, acosh (дубинка (x)) = x, atanh (tanh (x)) = x
Wk (x · e x) = x для всех значений k
Решатель может умножить обе стороны уравнения по любому выражению кроме 0
.
Решения полиномиальных уравнений должны быть завершены.