числовой::

Решите систему линейных уравнений

Блокноты 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 = …, …] в решении, то нет никакого ограничения на это неизвестное; это - произвольный параметр. Обычно все неизвестные, которые не поднимаются на левой стороне решенных уравнений, являются произвольными параметрами, охватывающими пробел решения. 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, который определяет числовую рабочую точность.

Примеры

Пример 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

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

Это - общее решение, принимая 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, [], []] возвращен, если система не разрешима.