Уравнения и системный решатель
Входные параметры вектора символов были удалены. Вместо этого используйте 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.
Решения полиномиальных уравнений должны быть завершены.