*
, _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 * ...
.
_mult()
возвращает номер 1.
Полиномы типа, DOM_POLY
умножается на *
, если у них есть тот же indeterminates и тот же содействующий звонок. Используйте multcoeffs
, чтобы умножить полиномы со скалярными факторами.
Для конечных множеств X
, Y
, продукт X * Y
является набором.
Равенства, неравенства и сравнения могут быть умножены друг с другом или с арифметическими выражениями. Результаты таких комбинаций продемонстрированы в Примере 5.
Количественное выражение упрощено автоматически:
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(%)
Функциональный эквивалент _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:
Полиномы типа, 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)
Для конечных множеств 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}
Умножение на константное выражение выполняется с обеих сторон уравнения:
(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)
Различные области библиотеки, такие как матричная перегрузка областей _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:
Этот пример демонстрирует, как реализовать 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