Решите систему алгебраических уравнений

Эта тема показывает вам, как решить систему уравнений символически с помощью Symbolic Math Toolbox™. Этот тулбокс предлагает и числовые и символьные решатели уравнения. Для сравнения числовых и символьных решателей смотрите, Выбирают Numeric or Symbolic Solver.

Обработайте Выход solve

Предположим, что у вас есть система

x2y2=0x-y2=α,

и вы хотите решить для x и y. Во-первых, создайте необходимые символьные объекты.

syms x y a

Существует несколько способов обратиться к выходу solve. Один путь состоит в том, чтобы использовать 2D выходной вызов. Вызов возвращает следующее.

[solx,soly] = solve(x^2*y^2 == 0, x-y/2 == a)
solx = 

(a0)

soly = 

(0-2a)

Измените первое уравнение к x2y2=1. Новая система имеет больше решений. Производятся четыре отличных решения.

[solx,soly] = solve(x^2*y^2 == 1, x-y/2 == a)
solx = 

(a2-a2-22a2-a2+22a2+a2-22a2+a2+22)

soly = 

(-a-a2-2-a-a2+2a2-2-aa2+2-a)

Поскольку вы не задавали зависимые переменные, 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 = 

(-13)

Подобные комментарии применяются к решениям за u и v. Структура S может теперь управляться полем и индексом, чтобы получить доступ к конкретному фрагменту решения. Например, чтобы исследовать второе решение, можно использовать следующий оператор, чтобы извлечь второй компонент каждого поля.

s2 = [S.a(2),S.u(2),S.v(2)]
s2 = (35-4)

Следующий оператор создает матрицу решения M чьи строки включают отличные решения системы.

M = [S.a,S.u,S.v]
M = 

(-11035-4)

Очистите 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 = 

(2v3-5u34u3-v3)

[A,b] = equationsToMatrix(eqns,x,y);
z = A\b
z = 

(2v3-5u34u3-v3)

Таким образом, sol и z произведите то же решение, несмотря на то, что результаты присвоены различным переменным.

Возвратите полное решение системы уравнений

solve автоматически не возвращает всех решений уравнения. Чтобы возвратить все решения наряду с параметрами в решении и условиях на решении, установите ReturnConditions опция к true.

Рассмотрите следующую систему уравнений:

sin(x)+cos(y)=45sin(x)cos(y)=110

Визуализируйте систему уравнений с помощью 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')

Figure contains an axes object. The axes object with title Plot of System of Equations contains 2 objects of type implicitfunctionline. These objects represent sin(x)+cos(y) == 4/5, sin(x)*cos(y) == 1/10.

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

(z1z1)

S.y
ans = 

(zz)

S.parameters
ans = (zz1)
S.conditions
ans = 

(z+acos(σ3)2πZz-acos(σ3)2πZ-π-z1+σ12πZz1+σ12πZz1-π+asin(σ3)2πZz1-asin(σ3)2πZz+σ22πZz-σ22πZ)where  σ1=asin(610-25)  σ2=acos(25-610)  σ3=610+25

Решите систему уравнений при условиях

Чтобы решить систему уравнений при условиях, задайте условия во входе к 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')

Figure contains an axes object. The axes object with title Plot of System of Equations contains 3 objects of type implicitfunctionline, scatter. These objects represent sin(x)+cos(y) == 4/5, sin(x)*cos(y) == 1/10.

Работа с решениями, параметрами и условиями, возвращенными 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 = z1
paramy = intersect(symvar(S.y),S.parameters)
paramy = z

Решите первое решение x для параметра paramx.

solparamx(1,:) = solve(S.x(1) > -2*pi, S.x(1) < 2*pi, paramx)
solparamx = 

(π+asin(610-25)asin(610-25)-π-asin(610-25)-2π-asin(610-25))

Точно так же решите первое решение y для paramy.

solparamy(1,:) = solve(S.y(1) > -2*pi, S.y(1) < 2*pi, paramy)
solparamy = 

(acos(610+25)acos(610+25)-2π-acos(610+25)2π-acos(610+25))

Очистите предположения, установленные 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 = 

(π+σ1σ1-π-σ1-2π-σ1σ2π-σ2σ2-2π-π-σ2)where  σ1=asin(610-25)  σ2=asin(610+25)

solparamy(2,:) = solve(S.y(2) > -2*pi, S.y(2) < 2*pi, paramy)
solparamy = 

(σ2σ2-2π-σ22π-σ2σ1σ1-2π-σ12π-σ1)where  σ1=acos(25-610)  σ2=acos(610+25)

Первые строки 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 = 

(π+σ1σ1-π-σ1-2π-σ1σ2π-σ2σ2-2π-π-σ2)where  σ1=asin(610-25)  σ2=asin(610+25)

soly(1,:) = subs(S.y(1), paramy, solparamy(1,:));
soly(2,:) = subs(S.y(2), paramy, solparamy(2,:))
soly = 

(σ2σ2-2π-σ22π-σ2σ1σ1-2π-σ12π-σ1)where  σ1=acos(25-610)  σ2=acos(610+25)

Обратите внимание на то, что 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

Figure contains an axes object. The axes object with title Plot of System of Equations contains 35 objects of type implicitfunctionline, scatter. These objects represent sin(x)+cos(y) == 4/5, sin(x)*cos(y) == 1/10.

Преобразуйте символьные результаты в числовые значения

Символьные вычисления обеспечивают точную точность, в то время как числовые вычисления являются приближениями. Несмотря на эту потерю точности, вы можете должны быть преобразовать символьные результаты в числовые приближения для использования в числовых вычислениях. Для высокоточного преобразования используйте арифметику переменной точности, обеспеченную vpa функция. Для стандартной точности и лучшей эффективности, преобразуйте в двойную точность с помощью double.

Используйте vpa преобразовывать символьные решения solx и soly к числовой форме.

vpa(solx)
ans = 

(2.9859135500977407388300518406219-3.29727175708184573809523492593710.15567910349205249963259154265761-6.12750620368753397729269522390140.700956513471025247872136536149292.4406361401187679905905068471302-5.5822287937085612290531502304097-3.8425491670608184863347799194288)

vpa(soly)
ans = 

(0.86983981332387137135918515549046-5.4133454938557151055661016110685-0.869839813323871371359185155490465.41334549385571510556610161106851.4151172233028441195987301489821-4.8680680838767423573265566175769-1.41511722330284411959873014898214.8680680838767423573265566175769)

Упростите сложные результаты и улучшайте производительность

Если результаты выглядят сложными, solve застревает, или если вы хотите улучшать производительность, смотрите, Решения для уравнения Поиска и устранения неисправностей от решают Функцию.