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 системы Ax = 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, который определяет числовую рабочую точность.

Примеры

Пример 1

Уравнения и переменные могут быть введены как наборы или списки:

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])

Пример 2

Мы демонстрируем некоторые примеры с символьными коэффициентами. Обратите внимание на то, что опция Symbolic должен использоваться:

eqs := [x + a*y = b, x + A*y = b]:
numeric::linsolve(eqs, [x, y], Symbolic)

Обратите внимание на то, что для a = A, это не общее решение. Используя опцию ShowAssumptions, оказывается, что вышеупомянутым результатом является общее решение, удовлетворяющее предположению aA:

numeric::linsolve(eqs, [x, y], Symbolic, ShowAssumptions)

delete eqs:

Пример 3

Мы даем дальнейшую демонстрацию опции 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)

Пример 4

С точной арифметикой 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)

Пример 5

Начиная с 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:

Пример 6

Мы решаем большую разреженную систему. Матрица коэффициентов имеет только 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:

Пример 7

Опция 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:

Пример 8

Мы демонстрируем, что упрощенные уравнения, представляющие решение, могут использоваться в последующей обработке с 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:

Пример 9

Если решение линейной системы не уникально, то некоторые неизвестные используются в качестве “свободных параметров” охват пробела решения. В следующем примере, неизвестные 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:

Пример 10

Мы демонстрируем различие между аппаратной и программной арифметикой. Следующая проблема очень плохо обусловлена. Результаты, оба с 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:

Пример 11

Мы демонстрируем как полное решение следующей линейной системы в xY символьными параметрами aBCD может быть найден:

eqs := [x + y = d, a*x + b*y = 1, x + c*y = 1]:
numeric::linsolve(eqs, [x, y], Symbolic, ShowAssumptions)

Это - общее решение, принимая ab. Мы теперь устанавливаем 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:

Параметры

eqs

Список, набор, array, или matrix (Cat::Matrix) из линейных уравнений или арифметических выражений

vars

Список или набор неизвестных, чтобы решить для. Неизвестные могут быть идентификаторами или индексированными идентификаторами или арифметическими выражениями.

Опции

Hard, HardwareFloats, Soft, SoftwareFloats

С Hard (или HardwareFloats), расчеты сделаны с помощью быстрой аппаратной плавающей арифметики из сеанса MuPAD®. Hard и HardwareFloats эквивалентны. При использовании этой опции входные данные преобразованы в аппаратные плавания и обработаны скомпилированным кодом С. Результат повторно преобразован в плавания MuPAD и возвращен в сеанс MuPAD.

С Soft (или SoftwareFloats) расчеты являются плавающей арифметикой программного обеспечения использования купола, обеспеченной ядром MuPAD. Soft и SoftwareFloats эквивалентны. SoftwareFloats используется по умолчанию если текущее значение DIGITS больше, чем 15 и входная матрица A не имеет доменного типа DOM_HFARRAY.

По сравнению с SoftwareFloats используемый ядром MuPAD, расчетом с HardwareFloats может быть много раз быстрее. Обратите внимание, однако, что точность аппаратной арифметики ограничивается приблизительно 15 цифрами. Далее, размер чисел с плавающей запятой не может быть больше, чем приблизительно 10 308 и не меньшим, чем приблизительно 10 - 308.

Если никакой HardwareFloats или SoftwareFloats требуются явным образом, следующая стратегия используется: Если текущее значение DIGITS меньше, чем 16 или если матричный A аппаратный плавающий массив доменного типа DOM_HFARRAY, затем аппаратную арифметику пробуют. Если это успешно, результат возвращен.

Если результат не может быть вычислен с аппаратными плаваниями, арифметику программного обеспечения ядром MuPAD пробуют.

Если текущее значение DIGITS больше, чем 15 и входная матрица A не имеет доменного типа DOM_HFARRAY, или если одна из опций Soft, SoftwareFloats или Symbolic задан, MuPAD вычисляет результат со своей арифметикой программного обеспечения, не пытаясь использовать аппаратные плавания сначала.

Может быть несколько причин аппаратной арифметики, чтобы перестать работать:

  • Текущее значение DIGITS больше, чем 15.

  • Данные содержат символьные объекты.

  • Данные содержат числа, больше, чем 10 308 или меньший, чем 10 - 308, который не может быть представлен аппаратными плаваниями.

Если никакой HardwareFloats ни SoftwareFloats задан, пользователю не сообщают, используются ли аппаратные плавания или плавания программного обеспечения.

Если HardwareFloats заданы, но перестали работать из-за одной из причин выше, предупреждение выдано, что (намного более медленное) программное обеспечение арифметика с плавающей точкой ядра MuPAD используется.

Обратите внимание на то, что HardwareFloats может только использоваться, если все входные данные могут быть преобразованы в числа с плавающей запятой.

Запаздывающие цифры в результатах с плавающей точкой вычисляются с HardwareFloats и SoftwareFloats может отличаться.

Примечание

Для плохо обусловленных систем результат подвергается ошибкам округления. Результаты возвращены с HardwareFloats и SoftwareFloats может значительно отличаться! SeeExample 10.

Symbolic

Предотвращает преобразование входных данных к числам с плавающей запятой. Эта опция заменяет HardwareFloats и SoftwareFloats.

Эта опция должна использоваться, если коэффициенты уравнений содержат символьные параметры, которые не могут быть преобразованы в числа с плавающей запятой.

Примечание

Эта опция не должна использоваться в уравнениях с коэффициентами с плавающей точкой! Числовая нестабильность может произойти в операциях с плавающей точкой. Смотрите Пример 7.

ShowAssumptions

Возвращает информацию о внутренних предположениях на символьных параметрах в eqs.

Эта опция только полезна, если уравнения содержат символьные параметры. Следовательно, это должно только использоваться в сочетании с опцией Symbolic.

Примечание

Формат возвращаемого значения изменяется на [Solution, Constraints, Pivots].

Solution набор упрощенных уравнений, представляющих общее решение, удовлетворяющее Constraints и Pivots.

Constraints список уравнений для символьных параметров в eqs, которые необходимы и достаточны, чтобы сделать систему разрешимой.

Такие ограничения возникают, если Исключение Гаусса исходных уравнений приводит к уравнениям формы 0 = c, где c является некоторым выражением, вовлекающим символьные параметры в “правую сторону” системы. Все такие уравнения собраны в Constraints. numeric::linsolve принимает, что этим уравнениям удовлетворяют, и возвращает решение.

Если никакие такие ограничения не возникают, возвращаемое значение Constraints пустой список.

Pivots список неравенств, вовлекающих символьные параметры в матрицу коэффициентов A линейной системы Ax = b, представленный eqs. Внутренне, деление элементами центра происходит в Исключении Гаусса. Выражения собраны в Pivots числители элементов центра, которые содержат символьные параметры. Если только числовые элементы центра использовались, возвращаемое значение Pivots пустой список.

Примечание

Опция ShowAssumptions изменяет стратегию возврата “неразрешимых” систем. Без опции Symbolic, FAIL возвращен каждый раз, когда Исключение Гаусса производит уравнение 0 = c с ненулевым c. С ShowAssumptions, такие уравнения возвращены через Constraints, если c включает символьные параметры.

Если c является чисто численным значением, то [FAIL, [], []] возвращен.

Смотрите пример 2, пример 3, пример 4 и пример 11.

NoWarning

Отключает предупреждения

Если символьные коэффициенты найдены, numeric::linsolve автоматически переключатели к Symbolic режим с предупреждением. При использовании этой опции подавлено это предупреждение; numeric::linsolve все еще использует символьный режим в символьных коэффициентах, т.е. точная арифметика без преобразований с плавающей точкой используется.

Возвращаемые значения

Без опции ShowAssumptions, список упрощенных уравнений возвращен. Это представляет общее решение системы eqs. FAIL возвращен, если система не разрешима.

С ShowAssumptions, список [Solution, Constraints, Pivots] возвращен. Solution список упрощенных уравнений, представляющих общее решение eqs. Списки Constraints и Pivots содержите уравнения и неравенства, вовлекающие символьные параметры в eqs. Внутренне, они были приняты, чтобы сохраняться при решении системы.

[FAIL, [], []] возвращен, если система не разрешима.