Эта тема показывает вам, как решить систему уравнений символически с помощью Symbolic Math Toolbox™. Этот тулбокс предлагает и числовые и символьные решатели уравнения. Для сравнения числовых и символьных решателей смотрите, Выбирают Numeric or Symbolic Solver.
solveПредположим, что у вас есть система
и вы хотите решить для и . Во-первых, создайте необходимые символьные объекты.
syms x y a
Существует несколько способов обратиться к выходу solve. Один путь состоит в том, чтобы использовать 2D выходной вызов. Вызов возвращает следующее.
[solx,soly] = solve(x^2*y^2 == 0, x-y/2 == a)
solx =
soly =
Измените первое уравнение к . Новая система имеет больше решений. Производятся четыре отличных решения.
[solx,soly] = solve(x^2*y^2 == 1, x-y/2 == a)
solx =
soly =
Поскольку вы не задавали зависимые переменные, solve использование symvar определить переменные.
Этот способ присвоить выход от solve довольно успешно для “маленьких” систем. Например, если у вас есть 10 10 система уравнений, введение следующего является и неловким и трудоемким.
[x1,x2,x3,x4,x5,x6,x7,x8,x9,x10] = solve(...)
Обойти эту трудность, solve может возвратить структуру, поля которой являются решениями. Например, решите систему уравнений u^2 - v^2 = a^2, u + v = 1, a^2 - 2*a = 3. Решатель возвращает свои результаты, заключенные в структуру.
syms u v a S = solve(u^2 - v^2 == a^2, u + v == 1, a^2 - 2*a == 3)
S = struct with fields:
a: [2x1 sym]
u: [2x1 sym]
v: [2x1 sym]
Решения для a находитесь в “a- поле” S.
S.a
ans =
Подобные комментарии применяются к решениям за u и v. Структура S может теперь управляться полем и индексом, чтобы получить доступ к конкретному фрагменту решения. Например, чтобы исследовать второе решение, можно использовать следующий оператор, чтобы извлечь второй компонент каждого поля.
s2 = [S.a(2),S.u(2),S.v(2)]
s2 =
Следующий оператор создает матрицу решения M чьи строки включают отличные решения системы.
M = [S.a,S.u,S.v]
M =
Очистите solx и soly для дальнейшего использования.
clear solx soly
Линейные системы уравнений могут также быть решены с помощью матричного деления. Например, решите эту систему.
clear u v x y syms u v x y eqns = [x + 2*y == u, 4*x + 5*y == v]; S = solve(eqns); sol = [S.x;S.y]
sol =
[A,b] = equationsToMatrix(eqns,x,y); z = A\b
z =
Таким образом, sol и z произведите то же решение, несмотря на то, что результаты присвоены различным переменным.
solve автоматически не возвращает всех решений уравнения. Чтобы возвратить все решения наряду с параметрами в решении и условиях на решении, установите ReturnConditions опция к true.
Рассмотрите следующую систему уравнений:
Визуализируйте систему уравнений с помощью fimplicit. Установить ось X и значения оси Y в терминах pi, получите указатели осей с помощью axes в a. Создайте символьный массив S из значений -2*pi к 2*pi с промежутками в pi/2. Установить метки деления на S, используйте XTick и YTick свойства a. Чтобы установить метки для x-and осей Y, преобразуйте S к векторам символов. Используйте arrayfun применять char к каждому элементу S возвратить T. Установите XTickLabel и YTickLabel свойства a к T.
syms x y eqn1 = sin(x)+cos(y) == 4/5; eqn2 = sin(x)*cos(y) == 1/10; a = axes; fimplicit(eqn1,[-2*pi 2*pi],'b'); hold on grid on fimplicit(eqn2,[-2*pi 2*pi],'m'); L = sym(-2*pi:pi/2:2*pi); a.XTick = double(L); a.YTick = double(L); M = arrayfun(@char, L, 'UniformOutput', false); a.XTickLabel = M; a.YTickLabel = M; title('Plot of System of Equations') legend('sin(x)+cos(y) == 4/5','sin(x)*cos(y) == 1/10',... 'Location','best','AutoUpdate','off')

Решения лежат на пересечении двух графиков. Это показывает, что система повторилась, периодические решения. Чтобы решить эту систему уравнений для набора полного решения, используйте solve и набор ReturnConditions опция к true.
S = solve(eqn1,eqn2,'ReturnConditions',true)S = struct with fields:
x: [2x1 sym]
y: [2x1 sym]
parameters: [z z1]
conditions: [2x1 sym]
solve возвращает структуру S с полями S.x для решения x, S.y для решения y, S.parameters для параметров в решении и S.conditions для условий на решении. Элементы того же индекса в S.x, S.y, и S.conditions сформируйте решение. Таким образом, S.x(1), S.y(1), и S.conditions(1) сформируйте одно решение системы уравнений. Параметры в S.parameters может появиться во всех решениях.
Индексируйте в S возвратить решения, параметры и условия.
S.x
ans =
S.y
ans =
S.parameters
ans =
S.conditions
ans =
Чтобы решить систему уравнений при условиях, задайте условия во входе к solve.
Решите систему уравнений, рассмотренную выше для x и y в интервале -2*pi к 2*pi. Наложите решения на графике с помощью scatter.
Srange = solve(eqn1, eqn2, -2*pi < x, x < 2*pi, -2*pi < y, y < 2*pi, 'ReturnConditions', true); scatter(Srange.x,Srange.y,'k')

solveМожно использовать решения, параметры и условия, возвращенные solve найти решения в интервале или под дополнительными условиями. Этот раздел имеет ту же цель как предыдущий раздел, чтобы решить систему уравнений в поисковой области значений, но с другим подходом. Вместо того, чтобы поместить условия непосредственно, это показывает, как работать с параметрами и условиями, возвращенными solve.
Для полного решения S из системы уравнений найдите значения x и y в интервале -2*pi к 2*pi путем решения решений S.x и S.y для параметров S.parameters в том интервале при условии S.conditions.
Прежде, чем решить для x и y в интервале примите условия в S.conditions использование assume так, чтобы возвращенные решения удовлетворили условию. Примите условия для первого решения.
assume(S.conditions(1))
Найдите параметры в S.x и S.y.
paramx = intersect(symvar(S.x),S.parameters)
paramx =
paramy = intersect(symvar(S.y),S.parameters)
paramy =
Решите первое решение x для параметра paramx.
solparamx(1,:) = solve(S.x(1) > -2*pi, S.x(1) < 2*pi, paramx)
solparamx =
Точно так же решите первое решение y для paramy.
solparamy(1,:) = solve(S.y(1) > -2*pi, S.y(1) < 2*pi, paramy)
solparamy =
Очистите предположения, установленные S.conditions(1) использование assume. Вызовите asumptions проверять, что предположения очищены.
assume(S.parameters,'clear')
assumptionsans = Empty sym: 1-by-0
Примите условия для второго решения.
assume(S.conditions(2))
Решите второе решение x и y для параметров paramx и paramy.
solparamx(2,:) = solve(S.x(2) > -2*pi, S.x(2) < 2*pi, paramx)
solparamx =
solparamy(2,:) = solve(S.y(2) > -2*pi, S.y(2) < 2*pi, paramy)
solparamy =
Первые строки paramx и paramy сформируйте первое решение системы уравнений, и вторые строки формируют второе решение.
Найти значения x и y для этих значений paramx и paramy, используйте subs заменять paramx и paramy в S.x и S.y.
solx(1,:) = subs(S.x(1), paramx, solparamx(1,:)); solx(2,:) = subs(S.x(2), paramx, solparamx(2,:))
solx =
soly(1,:) = subs(S.y(1), paramy, solparamy(1,:)); soly(2,:) = subs(S.y(2), paramy, solparamy(2,:))
soly =
Обратите внимание на то, что solx и soly два набора решений x и к y. Полные наборы решений системы уравнений являются этими двумя наборами точек, сформированными всеми возможными комбинациями значений в solx и soly.
Постройте эти два набора точек с помощью scatter. Наложите их на графике уравнений. Как ожидалось решения появляются на пересечении графиков этих двух уравнений.
for i = 1:length(solx(1,:)) for j = 1:length(soly(1,:)) scatter(solx(1,i), soly(1,j), 'k') scatter(solx(2,i), soly(2,j), 'k') end end

Символьные вычисления обеспечивают точную точность, в то время как числовые вычисления являются приближениями. Несмотря на эту потерю точности, вы можете должны быть преобразовать символьные результаты в числовые приближения для использования в числовых вычислениях. Для высокоточного преобразования используйте арифметику переменной точности, обеспеченную vpa функция. Для стандартной точности и лучшей эффективности, преобразуйте в двойную точность с помощью double.
Используйте vpa преобразовывать символьные решения solx и soly к числовой форме.
vpa(solx)
ans =
vpa(soly)
ans =
Если результаты выглядят сложными, solve застревает, или если вы хотите улучшать производительность, смотрите, Решения для уравнения Поиска и устранения неисправностей от решают Функцию.