числовой::
Решите систему линейных уравнений
Блокноты 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 = …, …] в решении, то нет никакого ограничения на это неизвестное; это - произвольный параметр. Обычно все неизвестные, которые не поднимаются на левой стороне решенных уравнений, являются произвольными параметрами, охватывающими пробел решения. Cf. Пример 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:
Мы демонстрируем, как полное решение следующей линейной системы в x
, y
с символьными параметрами a
, b
, c
, d
может быть найден:
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, [], []]
возвращен, если система не разрешима.