Эта тема показывает вам, как решить систему уравнений символически с помощью 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')
assumptions
ans = 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
застревает, или если вы хотите улучшать производительность, смотрите, Решения для уравнения Поиска и устранения неисправностей от решают Функцию.