numeric::linsolveРешите систему линейных уравнений
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразуют Notebook MuPAD в Live скрипты MATLAB.
numeric::linsolve(eqs, <vars>, options)
numeric::linsolve(eqs, vars) решает систему линейных уравнений eqs для неизвестных vars.
numeric::linsolve быстрый числовой линейный решатель. Это - также рекомендуемый решатель для линейных систем с точными или символьными коэффициентами (использующий Symbolic).
Выражения интерпретированы как однородные уравнения. Например, вход [x = y - 1, x - y] интерпретирован как система уравнений [x = y - 1, x - y = 0].
Без опции Symbolic, входные данные преобразованы в числа с плавающей запятой. Матрица коэффициентов A системы A x = b представлена eqs не должен содержать неконвертируемые параметры, если опция Symbolic используется! Если такие объекты найдены, то numeric::linsolve автоматически переключатели к его символьному режиму, выдавая предупреждение. Это предупреждение может быть подавлено через NoWarning. Символьные параметры в “правой стороне” b приняты без предупреждения.
Числовая рабочая точность установлена переменной окружения DIGITS.
Решения возвращены как список решенных уравнений формы
,
где x 1, x 2, … является неизвестными. Эти упрощенные уравнения должны рассматриваться как ограничения на неизвестные. Например, если неизвестный x 1, скажем, не поднимает в форме [x 1 = …, …] в решении, то нет никакого ограничения на это неизвестное; это - произвольный параметр. Обычно все неизвестные, которые не поднимаются на левой стороне решенных уравнений, являются произвольными параметрами, охватывающими пробел решения. См. Пример 9.
В частности, если пустой список возвращен как решение, нет никаких ограничений вообще на неизвестные, т.е. система тривиальна.
Упорядоченное расположение решенных уравнений соответствует упорядоченному расположению неизвестных vars. Рекомендуется, чтобы пользователь задал vars список неизвестных. Это гарантирует, что решенные уравнения возвращены в ожидаемом порядке. Если vars заданы набором, или если никакой vars заданы вообще, затем внутреннее упорядоченное расположение используется.
Если никакие неизвестные не заданы vars, numeric::linsolve решает для всех символьных объектов в eqs. Неизвестные определяются внутренне indets(eqs, PolyExpr).
numeric::linsolve возвращает общее решение системы eqs. Это допустимо для произвольных комплексных чисел символьных параметров, которые могут присутствовать в eqs. Если никакое такое решение не существует, FAIL возвращен. Решения, которые допустимы только для специальных значений символьных параметров, могут быть получены с опцией ShowAssumptions. Смотрите пример 2, пример 3, пример 4 и пример 11.
Решенные уравнения, представляющие решение, подходят, как введено для assign и subs. Смотрите пример 8.
numeric::linsolve подходит для решения больших разреженных систем. Смотрите Пример 6.
Если eqs представляет систему с полосной матрицей коэффициентов, затем это обнаруживается и используется numeric::linsolve. Обратите внимание на то, что в этом случае важно задать обоих уравнения, а также неизвестные списками, чтобы гарантировать желаемую форму матрицы коэффициентов. При использовании наборов данные могут быть переупорядочены, внутренне ведя к потере структуры полосы и, следовательно, КПД. Смотрите Пример 6.
numeric::linsolve настраивается для скорости. Поэтому это систематически не проверяет что уравнения eqs действительно линейны в неизвестных! Для нелинейных уравнений странные вещи могут произойти; numeric::linsolve может даже возвратить неправильные результаты! Смотрите Пример 5.
numeric::linsolve не реагирует ни на какие свойства неизвестных или символьных параметров, которые устанавливаются через assume.
Исключение Гаусса с частичным поворотом используется. Без опции Symbolic, арифметика с плавающей точкой используется, и вертящаяся стратегия заботится о числовой стабилизации. С Symbolic, точные данные приняты, и вертящиеся попытки стратегии максимизируют скорость, не заботящуюся о числовой стабилизации! Смотрите Пример 7.
Без опции Symbolic, функция чувствительна к переменной окружения DIGITS, который определяет числовую рабочую точность.
Уравнения и переменные могут быть введены как наборы или списки:
numeric::linsolve({x = y - 1, x + y = z}, {x, y});
numeric::linsolve([x = y - 1, x + y = z], {x, y});
numeric::linsolve({x = y - 1, x + y = z}, [x, y]);
numeric::linsolve([x = y - 1, x + y = z], [x, y])![]()
![]()
![]()
![]()
С опцией Symbolic, точная арифметика используется. Следующая система имеет набор с 1 параметром решения; неизвестный x 3 произволен:
numeric::linsolve([x[1] + x[2] = 2, x[1] - x[2] = 2*x[3]],
[x[1], x[2], x[3]], Symbolic)![]()
Неизвестные могут быть выражениями:
numeric::linsolve([f(0) - sin(x + 1) = 2, f(0) = 1 - sin(x + 1)],
[f(0), sin(x + 1)])![]()
Следующая система не имеет решения:
numeric::linsolve([x + y = 1, x + y = 2], [x, y])
![]()
Мы демонстрируем некоторые примеры с символьными коэффициентами. Обратите внимание на то, что опция Symbolic должен использоваться:
eqs := [x + a*y = b, x + A*y = b]: numeric::linsolve(eqs, [x, y], Symbolic)
![]()
Обратите внимание на то, что для a = A, это не общее решение. Используя опцию ShowAssumptions, оказывается, что вышеупомянутым результатом является общее решение, удовлетворяющее предположению a ≠ A:
numeric::linsolve(eqs, [x, y], Symbolic, ShowAssumptions)
![]()
delete eqs:
Мы даем дальнейшую демонстрацию опции ShowAssumptions. Следующая система не имеет решения для всех значений параметра a:
numeric::linsolve([x + y = 1, x + y = a], [x, y], Symbolic)
![]()
С ShowAssumptions, numeric::linsolve занимается расследованиями под который условия (на параметре a) существует решение:
numeric::linsolve([x + y = 1, x + y = a], [x, y], Symbolic,
ShowAssumptions)![]()
Мы приходим к заключению, что существует набор с 1 параметром решений для a = 1. Ограничение в a линейное уравнение, начиная с параметра a вводит уравнения линейно. Если a рассматривается как неизвестное, а не в качестве параметра, ограничение становится частью решения:
numeric::linsolve([x + y = 1, x + y = a], [x, y, a], Symbolic,
ShowAssumptions)![]()
С точной арифметикой PI рассматривается как символьный параметр. Следующая система имеет решение, удовлетворяющее ограничению PI = 1:
numeric::linsolve([x = x - y + 1, y = PI], [x, y],
Symbolic, ShowAssumptions)![]()
С арифметикой с плавающей точкой PI преобразован в 3.1415.... Система не имеет никакого решения:
numeric::linsolve([x = x - y + 1, y = PI], [x, y],
ShowAssumptions)![]()
Начиная с numeric::linsolve не делает систематической внутренней проверки на нелинейность, пользователь должен убедиться, что уравнения, которые будут решены, действительно линейны в неизвестных. В противном случае странные вещи могут произойти. Мусор производится для следующих нелинейных систем:
a := sin(x): numeric::linsolve([y = 1 - a, x = y], [x, y], Symbolic)
![]()
numeric::linsolve([a*x + y = 1, x = y], [x, y], Symbolic)

Полиномиальная нелинейность обычно обнаруживается. Относительно x, y, c как неизвестные, следующая квадратичная система дает к ошибке:
numeric::linsolve([x*c + y = 1, x = y], Symbolic)
Error: This system does not seem to be linear. [numeric::linsolve]
Error: This system does not seem to be linear. [numeric::linsolve]
Эта система линейна в x, y если c расценивается в качестве параметра:
numeric::linsolve([x*c + y = 1, x = y], [x, y], Symbolic)
![]()
delete a:
Мы решаем большую разреженную систему. Матрица коэффициентов имеет только 3 диагональных полосы. Обратите внимание на то, что оба уравнения, а также переменные передаются как списки. Это гарантирует, что структура полосы не потеряна внутренне:
n := 500: x[0] := 0: x[n + 1] := 0: eqs := [x[i-1] - 2*x[i] + x[i+1] = 1 $ i = 1..n]: vars := [x[i] $ i = 1..n]: numeric::linsolve(eqs, vars)
![]()
Структура полосы потеряна, если уравнения или неизвестные заданы наборами. Следующий вызов занимает больше времени, чем предыдущий вызов:
numeric::linsolve({op(eqs)}, {x[i] $ i = 1..n})![]()

delete n, x, eqs, vars:
Опция Symbolic не должен использоваться в уравнениях с коэффициентами с плавающей точкой, потому что символьная вертящаяся стратегия способствует КПД вместо числовой устойчивости.
eqs := [x + 10^20*y = 10^20, x + y = 0]:
Приближение плавающее точного решения:
map(numeric::linsolve(eqs, [x, y], Symbolic), map, float)
![]()
Мы теперь преобразуем точные коэффициенты в числа с плавающей запятой:
feqs := map(eqs, map, float)
![]()
Значение по умолчанию, вертящееся стратегия, стабилизирует операции с плавающей точкой. Следовательно, каждый получает правильный результат:
numeric::linsolve(feqs, [x, y])
![]()
С Symbolic, вертящаяся стратегия оптимизирует скорость, принимая точную арифметику. Числовая нестабильность может произойти, если коэффициенты с плавающей точкой включены. Следующий неправильный результат вызывается внутренними эффектами округления (“отмена”):
numeric::linsolve(feqs, [x, y], Symbolic)
![]()
delete eqs, feqs:
Мы демонстрируем, что упрощенные уравнения, представляющие решение, могут использоваться в последующей обработке с subs:
eqs := [x + y = 1, x + y = a]: [Solution, Constraints, Pivots] := numeric::linsolve(eqs, [x, y], ShowAssumptions)
![]()
subs(eqs, Solution)
![]()
Решение может быть присвоено неизвестным через assign:
assign(Solution): x, y, eqs
![]()
delete eqs, Solution, Constraints, Pivots, x:
Если решение линейной системы не уникально, то некоторые неизвестные используются в качестве “свободных параметров” охват пробела решения. В следующем примере, неизвестные z, w такие параметры. Они не поднимаются на левой стороне решенных уравнений:
eqs := [x + y = z, x + 2*y = 0, 2*x - z = -3*y, y + z = 0]: vars := [x, y, z, w]: Solution := numeric::linsolve(eqs, vars, Symbolic)
![]()
Можно задать функцию, такую как следующий NewSolutionList переименовать ваши свободные параметры к “myName1”, “myName2” и т.д. и заполнить ваш список решенных уравнений соответственно:
NewSolutionList :=
proc(Solution : DOM_LIST, vars : DOM_LIST, myName : DOM_STRING)
local i, solvedVars, newEquation;
begin
solvedVars := map(Solution, op, 1);
for i from 1 to nops(vars) do
if not has(solvedVars, vars[i]) then
newEquation := vars[i] = genident(myName);
Solution := listlib::insertAt(
subs(Solution, newEquation), newEquation, i)
end_if
end_for:
Solution
end_proc:NewSolutionList(Solution, vars, "FreeParameter")
![]()
delete eqs, vars, Solution, NewSolutionList:
Мы демонстрируем различие между аппаратной и программной арифметикой. Следующая проблема очень плохо обусловлена. Результаты, оба с HardwareFloats а также с SoftwareFloats, омрачены числовым округлением:
n:= 10: eqs:= [(_plus(x[j]/(i + j -1) $ j = 1..n) = 1) $ i = 1..n]: vars:= [x[i] $ i = 1..n]: numeric::linsolve(eqs, vars, SoftwareFloats); numeric::linsolve(eqs, vars, HardwareFloats)


Это - точное решение:
numeric::linsolve(eqs, vars, Symbolic);
![]()
delete eqs, vars:
Мы демонстрируем как полное решение следующей линейной системы в xY символьными параметрами aBCD может быть найден:
eqs := [x + y = d, a*x + b*y = 1, x + c*y = 1]: numeric::linsolve(eqs, [x, y], Symbolic, ShowAssumptions)

Это - общее решение, принимая a ≠ b. Мы теперь устанавливаем b = a исследовать дальнейшие ветви решения:
eqs := subs(eqs, b = a): numeric::linsolve(eqs, [x, y], Symbolic, ShowAssumptions)

Это - общее решение для a = b, принимая c ≠ 1. Мы наконец устанавливаем c = 1 получать последнюю ветвь решения:
eqs := subs(eqs, c = 1): numeric::linsolve(eqs, [x, y], Symbolic, ShowAssumptions)
![]()
От ограничений на символьные параметры a и d, мы приходим к заключению, что существует специальное решение с 1 параметром x = 1 - y для a = b = c = d = 1.
delete eqs:
|
Список, набор, |
|
Список или набор неизвестных, чтобы решить для. Неизвестные могут быть идентификаторами или индексированными идентификаторами или арифметическими выражениями. |
|
С С По сравнению с Если никакой Если результат не может быть вычислен с аппаратными плаваниями, арифметику программного обеспечения ядром MuPAD пробуют. Если текущее значение Может быть несколько причин аппаратной арифметики, чтобы перестать работать:
Если никакой Если Обратите внимание на то, что Запаздывающие цифры в результатах с плавающей точкой вычисляются с ПримечаниеДля плохо обусловленных систем результат подвергается ошибкам округления. Результаты возвращены с |
|
Предотвращает преобразование входных данных к числам с плавающей запятой. Эта опция заменяет Эта опция должна использоваться, если коэффициенты уравнений содержат символьные параметры, которые не могут быть преобразованы в числа с плавающей запятой. ПримечаниеЭта опция не должна использоваться в уравнениях с коэффициентами с плавающей точкой! Числовая нестабильность может произойти в операциях с плавающей точкой. Смотрите Пример 7. |
|
Возвращает информацию о внутренних предположениях на символьных параметрах в Эта опция только полезна, если уравнения содержат символьные параметры. Следовательно, это должно только использоваться в сочетании с опцией ПримечаниеФормат возвращаемого значения изменяется на
Такие ограничения возникают, если Исключение Гаусса исходных уравнений приводит к уравнениям формы 0 = c, где c является некоторым выражением, вовлекающим символьные параметры в “правую сторону” системы. Все такие уравнения собраны в Если никакие такие ограничения не возникают, возвращаемое значение
ПримечаниеОпция Если c является чисто численным значением, то |
|
Отключает предупреждения Если символьные коэффициенты найдены, |
Без опции ShowAssumptions, список упрощенных уравнений возвращен. Это представляет общее решение системы eqs. FAIL возвращен, если система не разрешима.
С ShowAssumptions, список [Solution, Constraints, Pivots] возвращен. Solution список упрощенных уравнений, представляющих общее решение eqs. Списки Constraints и Pivots содержите уравнения и неравенства, вовлекающие символьные параметры в eqs. Внутренне, они были приняты, чтобы сохраняться при решении системы.
[FAIL, [], []] возвращен, если система не разрешима.