*, _mult

Умножьте выражения

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Синтаксис

x * y * ...
_mult(x, y, …)

Описание

x * y * ... вычисляет продукт x, y и т.д.

x * y * ... эквивалентен вызову функции _mult(x, y, ...).

Все условия, которые являются количествами типа Type::Numeric, автоматически объединены к одному номеру.

Условия символьного продукта могут быть перестроены внутренне, если никакой термин не принадлежит области библиотеки что перегрузки _mult: на условиях, состоявших из областей ядра (числа, идентификаторы, выражения и т.д.), умножение принято, чтобы быть коммутативным. Cf. Пример 1.

Через перегрузку пользователь может реализовать некоммутативный продукт для специальных областей.

_mult принимает произвольное число аргументов. В сочетании с оператором последовательности $ эта функция является рекомендуемым инструментом для вычисления конечных продуктов. Cf. Пример 2. Функциональный product может также служить для вычисления таких продуктов. Однако product разработан для вычисления символьных и бесконечных произведений. Это медленнее, чем _mult.

Частное x/y внутренне представлено как x * (1/y) = _mult(x, _power(y, -1)). Смотрите _divide для деталей.

Много перегрузок областей библиотеки _mult соответствующим slot"_mult". Продукты включающие элементы областей библиотеки обрабатываются можно следующим образом:

Продукт x * y * ... ищется элементы областей библиотеки слева направо. Позвольте z быть первым сроком, который не имеет одного из основных типов, обеспеченных ядром (числа, выражения, и т.д.). Если доменный d = z::dom = domtype(z) имеет slot"_mult", это называется в форме d::_mult(x, y, ...). Результатом, возвращенным d::_mult, является результат x * y * ....

Cf. Пример 6 и пример 7.

_mult() возвращает номер 1.

Полиномы типа, DOM_POLY умножается на *, если у них есть тот же indeterminates и тот же содействующий звонок. Используйте multcoeffs, чтобы умножить полиномы со скалярными факторами.

Для конечных множеств X, Y, продукт X * Y является набором.

Равенства, неравенства и сравнения могут быть умножены друг с другом или с арифметическими выражениями. Результаты таких комбинаций продемонстрированы в Примере 5.

Примеры

Пример 1

Количественное выражение упрощено автоматически:

3 * x * y * (1/18) * sin(4) * 4

Упорядоченное расположение условий продукта является не обязательно тем же самым как на входе:

x * y * 3 * z * a * b * c

Внутренне, этим продуктом является символьный вызов _mult:

op(%, 0), type(%)

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

op(%2)

В частности, числовой фактор внутренне хранится как последний операнд. На экране числовой фактор отображен перед остающимися условиями:

3 * x * y * 4

op(%)

Пример 2

Функциональный эквивалент _mult оператора * является удобным инструментом для вычисления конечных продуктов. В следующем условия сгенерированы через оператор последовательности $:

_mult(i $ i = 1..20)

Например, легко умножить все элементы в наборе:

S := {a, b, 1, 2, 27}: _mult(op(S))

Следующая команда “архивирует” два списка путем умножения соответствующих элементов:

L1 := [1, 2, 3]: L2 := [a, b, c]: zip(L1, L2, _mult)

delete S, L1, L2:

Пример 3

Полиномы типа, DOM_POLY умножается на *, если у них есть тот же indeterminates и тот же содействующий звонок:

poly(x^2 + 1, [x]) * poly(x^2 + x - 1, [x])

Если indeterminates или содействующие звонки не соответствуют, _mult возвращает ошибку:

poly(x, [x]) * poly(x, [x, y])
Error: Invalid argument. [_mult]
poly(x, [x]) * poly(x, [x], Dom::Integer)
Error: Invalid argument. [_mult]

Используя *, можно умножить полиномы на скалярные факторы:

2 * y * poly(x, [x])

Используйте multcoeffs вместо этого:

multcoeffs(poly(x^2 - 2, [x]), 2*y)

Пример 4

Для конечных множеств X, Y, продукт X * Y является набором:

{a, b, c} * {1, 2}

Обратите внимание на то, что комплексные числа типа DOM_INT, DOM_RAT, DOM_COMPLEX, DOM_FLOAT и идентификаторы неявно преобразованы в наборы с одним элементом:

2 * {a, b, c}

a * {b, c}, PI * {3, 4}

Пример 5

Умножение на константное выражение выполняется с обеих сторон уравнения:

(a = b) * c

Для неравенств только выполняется этот шаг, если константа, как известно, ненулевая:

assume(d <> 0):
(a <> b) * c, (a <> b) * d;
delete d:

Умножение сравнения с константой только задано для вещественных чисел. Даже для них, результат зависит от знака константы, начиная с умножения с отрицательной константой изменения направление сравнения:

(a < b) * 2, (a < b) * (-3)

(a < b) * I
Error: Inequalities must not be multiplied by complex numbers. [_less::_mult]
(a < b) * c, (a <= b) * c

Умножение двух равенств выполняется путем умножения левых сторон и правых сторон отдельно:

(a = b) * (c = d)

Неравенства не могут быть умножены друг с другом или со сравнениями; умножение с равенствами, однако, задано, если по крайней мере один операнд уравнения, как известно, является ненулевым:

assume(d <> 0):
(a <> b) * (c = d);
delete d:

В других случаях не расширен продукт:

delete c, d:
(a <> b) * (c = d)

Умножение сравнений с равенствами и сравнений выполняется подобное случаям выше:

assume(c > 0):
(a < b) * (c = d);
delete c:

(a <= b) * (c <= d)

Пример 6

Различные области библиотеки, такие как матричная перегрузка областей _mult. Умножение не является коммутативным:

x := Dom::Matrix(Dom::Integer)([[1, 2], [3, 4]]):
y := Dom::Matrix(Dom::Rational)([[10, 11], [12, 13]]):
x * y, y * x

Если условия в x * y имеют другой тип, первый срок, x пытается преобразовать y в тип данных x. Если успешный, продукт имеет тот же тип как x. В предыдущем примере x и y имеют различные типы (оба - матрицы, но области компонента отличаются). Следовательно x * y и y * x имеют различные типы, который наследован от первого срока:

domtype(x * y), domtype(y * x)

Если x не успешно выполняется, чтобы преобразовать y, то y пытается преобразовать x. В следующем вызове 27/2 компонента не может быть преобразован в целое число. Следовательно, в x * y, термин y преобразовывает x и приводит к результату, который совпадает с доменным типом y:

y := Dom::Matrix(Dom::Rational)([[10, 11], [12, 27/2]]):
x * y, y * x

domtype(x * y), domtype(y * x)

delete x, y:

Пример 7

Этот пример демонстрирует, как реализовать slot"_mult" для области. Следующий доменный myString должен представлять символьные строки. Через перегрузку _mult целочисленные множители таких строк должны произвести конкатенацию соответствующего количества копий строки.

Метод "new" использует expr2text, чтобы преобразовать любой объект MuPAD® в строку. Эта строка является внутренним представлением элементов myString. Метод "print" превращает эту строку в экран вывод:

myString := newDomain("myString"):
myString::new := proc(x)
begin
  if args(0) = 0 then x := "": end_if;
  case domtype(x)
    of myString do return(x);
    of DOM_STRING do return(new(dom, x));
    otherwise return(new(dom, expr2text(x)));
  end_case
end_proc:
myString::print := x -> extop(x, 1):

Без метода "_mult" системная функция _mult обрабатывает элементы этой области как любой символьный объект:

y := myString(y):
z := myString(z):
4 * x * y * z * 3/2

Теперь, мы реализуем метод "_mult". Это использует split, чтобы выбрать все целочисленные условия в его списке аргументов и умножает их. Результатом является целочисленный n. Если существует точно еще один оставленный термин (это должно быть строкой типа myString), это - скопированные времена n. Конкатенация копий возвращена:

myString::_mult:= proc()
local Arguments, intfactors, others, dummy, n;
begin
  print(Unquoted, "Info: myString::_mult called with the arguments:",
           args());
  Arguments := [args()];
  // split the argument list into integers and other factors:
  [intfactors, others, dummy] := 
      split(Arguments, testtype, DOM_INT);
  // multiply all integer factors:
  n := _mult(op(intfactors));
  if nops(others) <> 1 then
     return(FAIL)
  end_if;
  myString::new(_concat(extop(others[1], 1) $ n))
end_proc:

Теперь, целочисленные множители объектов myString могут быть созданы через оператор *:

2 * myString("string") * 3
Info: myString::_mult called with the arguments:, 2, string, 3

Только продукты целых чисел и объектов myString позволены:

3/2 * myString("a ") * myString("string")
                                                  3
Info: myString::_mult called with the arguments:, -, a , string
                                                  2

delete myString, y, z:

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

Арифметическое выражение, полином, набор, уравнение, неравенство или сравнение.

Перегруженный

x, y

Смотрите также

Функции MuPAD