rectform
Прямоугольная форма сложного выражения
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
rectform(z
)
rectform(z)
вычисляет прямоугольную форму сложного выражения z, т.е. это разделяет z в z = ℜ (z) + i ℑ (z).
rectform(z)
пытается разделить z
в свою действительную и мнимую часть и возвратить z
в форме z = ℜ (z) + i ℑ (z).
rectform
работает рекурсивно, т.е. он сначала пытается разделить каждое подвыражение z
в его действительную и мнимую часть и затем занимается z
в целом.
Используйте Re
и Im
, чтобы извлечь действительные и мнимые части, соответственно, от результата rectform
. Смотрите Пример 1.
rectform
более мощен, чем прямое приложение Re
и Im
к z
. Однако обычно это намного медленнее. Для постоянных арифметических выражений поэтому рекомендуется использовать функции Re
и Im
непосредственно. Смотрите Пример 2.
Основное использование rectform
для символьных выражений, и свойства идентификаторов учтены (см. assume
). Идентификатор без любого свойства принят, чтобы быть комплексный оцененный. Смотрите Пример 3.
Если z
является массивом, списком или набором, то rectform
применяется к каждой записи z
.
Если z
является hfarray, то rectform
возвращает неизменный z
.
Если z
является полиномом или последовательным расширением типа Series::Puiseux
или Series::gseries
, то rectform
применяется к каждому коэффициенту z
.
Смотрите пример 5.
Результатом r := rectform(z)
является элемент domain rectform
. Такой доменный элемент состоит из трех операндов, удовлетворяя следующее равенство: z = op(r, 1) + I*op(r, 2) + op(r, 3)
. Первые два операнда являются действительными арифметическими выражениями, и третий операнд является выражением, которое не может быть разделено в его действительную и мнимую часть.
Иногда rectform
не может вычислить необходимое разложение. Затем это все еще пытается возвратить некоторую частичную информацию путем извлечения как можно больше от действительной и мнимой части z
. Извлеченные части хранятся в первых двух операндах, и третий операнд содержит остаток, где никакая дальнейшая экстракция не возможна. В крайних случаях первые два операнда могут даже быть нулем. Пример 6 иллюстрирует некоторые возможные случаи.
Арифметические операции с элементами доменного типа rectform
возможны. Результатом арифметической операции является снова элемент этой области (см. Пример 4).
Функции Most MuPAD®, обрабатывающие арифметические выражения (например, expand
, normal
, simplify
и т.д.), могут быть применены к элементам типа rectform
. Они действуют на каждый из этих трех операндов индивидуально.
Используйте expr
, чтобы преобразовать результат rectform
в элемент основной области. Смотрите Пример 4.
Функция чувствительна к свойствам набора идентификаторов через assume
. Смотрите Пример 3.
Прямоугольная форма sin (z) для комплексных чисел z:
delete z: r := rectform(sin(z))
Действительное и мнимая часть могут быть извлечены можно следующим образом:
Re(r), Im(r)
Сопряженное комплексное число r
может быть получено непосредственно:
conjugate(r)
Действительное и мнимая часть постоянного арифметического выражения могут быть определены функциями Re
и Im
, как в следующем примере:
Re(ln(-4)) + I*Im(ln(-4))
На самом деле они работают намного быстрее, чем rectform
. Однако им не удается вычислить действительное и мнимую часть произвольных символьных выражений, такой что касается термина e i sin (z):
delete z: f := exp(I*sin(z)): Re(f), Im(f)
Функциональный rectform
более мощен. Это может разделить выражение выше в его действительную и мнимую часть:
r := rectform(f)
Теперь мы можем извлечь действительное и мнимую часть f
:
Re(r)
Im(r)
Идентификаторы без свойств считаются комплексными переменными:
delete z: rectform(ln(z))
Однако можно влиять на поведение rectform
путем присоединения свойств к идентификаторам. Например, если z принимает, что только действительные отрицательные величины, действительное и мнимая часть значительно упрощают:
assume(z < 0): rectform(ln(z))
Мы вычисляем прямоугольную форму комплексной переменной x:
delete x: a := rectform(x)
Затем мы делаем то же самое для действительной переменной y:
delete y: assume(y, Type::Real): b := rectform(y)
domtype(a), domtype(b)
Мы сохранили результаты, т.е. элементы доменного типа rectform
, в этих двух идентификаторах a
и b
. Мы вычисляем сумму a
и b
, который снова имеет доменный тип rectform
, т.е. это уже splitted в его действительную и мнимую часть:
c := a + b
domtype(c)
Результат арифметической операции между элементом доменного типа rectform
и произвольным арифметическим выражением имеет доменный тип rectform
также:
delete z: d := a + 2*b + exp(z)
domtype(d)
Используйте функциональный expr
, чтобы преобразовать элемент доменного типа rectform
в элемент основной области:
expr(d)
domtype(%)
rectform
также работает на полиномы и последовательные расширения, а именно, индивидуально на каждом коэффициенте:
delete x, y: p := poly(ln(-4) + y*x, [x]): rectform(p)
Точно так же rectform
работает на списки, наборы или массивы, где он применяется к каждой отдельной записи:
a := array(1..2, [x, y]): rectform(a)
hfarrays возвращены неизменные:
a := hfarray(1..2, [1.0, 2.0]): rectform(a)
Обратите внимание на то, что rectform
не работает непосредственно на другие типы основных данных. Например, если входное выражение является таблицей арифметических выражений, то rectform
отвечает сообщением об ошибке:
a := table("1st" = x, "2nd" = y): rectform(a)
Error: Arithmetical expression expected. [rectform::new]
Используйте map
, чтобы применить rectform
к операндам такого объекта:
map(a, rectform)
Этот пример иллюстрирует значение трех операндов объекта, возвращенного rectform
.
Мы запускаем с выражения x + sin (y), для которого rectform
может вычислить полное разложение в действительную и мнимую часть:
delete x, y: r := rectform(x + sin(y))
Первые два операнда r
являются действительной и мнимой частью выражения, и третий операнд 0:
op(r)
Затем мы считаем выражение x + f (y), где f (y) представляет неизвестную функцию в комплексной переменной. rectform
может разделить x в свою действительную и мнимую часть, но не удается сделать это для подвыражения f (y):
delete f: r := rectform(x + f(y))
Первые два операнда возвращенного объекта являются действительным и мнимой частью x, и третий операнд является остатком f (y), для которого rectform
не смог извлечь любую информацию о своей действительной и мнимой части:
op(r)
Re(r), Im(r)
Иногда rectform
не может извлечь любую информацию о действительной и мнимой части входного выражения. Затем третий операнд содержит целое входное выражение, возможно в переписанной форме, из-за рекурсивного режима работы rectform
. Первые два операнда 0. Вот пример:
r := rectform(sin(x + f(y)))
op(r)
Re(r), Im(r)
Опытные пользователи могут расширить rectform
к своим собственным специальным математическим функциям (см. раздел “Backgrounds” ниже). С этой целью встройте свою математическую функцию в функцию environmentf
и реализуйте поведение rectform
для этой функции как слот "rectform"
функциональной среды.
Если подвыражение формы, f(u,..)
происходит в z
, то rectform
издает приказ f::rectform(u,..)
к стандартной программе слота, чтобы определить прямоугольную форму f(u,..)
.
Для рисунка мы показываем, как это работает на синусоидальную функцию. Конечно, функциональная среда sin
уже имеет слот "rectform"
. Мы вызываем нашу функциональную среду Sin
по порядку, чтобы не перезаписать существующую системную функцию sin
:
Sin := funcenv(Sin): Sin::rectform := proc(u) // compute rectform(Sin(u)) local r, a, b; begin // recursively compute rectform of u r := rectform(u); if op(r, 3) <> 0 then // we cannot split Sin(u) new(rectform, 0, 0, Sin(u)) else a := op(r, 1); // real part of u b := op(r, 2); // imaginary part of u new(rectform, Sin(a)*cosh(b), cos(a)*sinh(b), 0) end_if end:
delete z: rectform(Sin(z))
Если условие if
верно, то rectform
не может разделить u
полностью в его действительную и мнимую часть. В этом случае Sin::rectform
не может разделить Sin(u)
в свою действительную и мнимую часть и указывает на это путем хранения целого выражения Sin(u)
в третьем операнде получившегося объекта rectform
:
delete f: rectform(Sin(f(z)))
op(%)
|
Арифметическое выражение, полином, последовательное расширение, массив, hfarray, список или набор |
Элемент доменного rectform
, если z
является арифметическим выражением и объектом того же типа как z
в противном случае.
При вызове элемента rectform
, когда функция приводит к самому объекту, независимо от аргументов. Аргументы не оценены.
Можно применить (почти) любую функцию к элементам rectform
, который преобразовывает выражение с комплексным знаком в выражение с комплексным знаком.
Например, можно добавить или умножить те элементы или применить функции, такие как expand
и diff
им. Результатом такой операции, которая не является explicitely, перегруженным методом rectform
(см. ниже), является элемент rectform
.
Эта “автоматическая перегрузка” работает можно следующим образом: Каждый аргумент операции, которая является элементом rectform
, преобразован в выражение с помощью метода "expr"
(см. ниже). Затем операция применяется, и результат повторно преобразован в элемент rectform
.
Используйте функциональный expr
, чтобы преобразовать элемент rectform
к арифметическому выражению (как элемент области ядра).
Функции Re
и Im
возвращают действительную и мнимую часть элементов rectform
.
Элемент z rectform
состоит из трех операндов:
действительная часть z,
мнимая часть z,
часть z, для этого, действительная и мнимая часть не может быть вычислена (возможно целое число 0, если нет таких подвыражений).
Если подвыражение формы, f(u,..)
происходит в z
и f
, является функциональной средой, то rectform
пытается вызвать слот "rectform"
f
, чтобы определить прямоугольную форму f(u,...)
. Таким образом можно расширить функциональность rectform
к собственным специальным математическим функциям.
Слот "rectform"
вызван аргументами u
... f
. Если стандартная программа слота, f::rectform
не может определить прямоугольную форму f(u,..)
, то это должно возвратить new(rectform(0,0,f(u,...)))
. Смотрите Пример 7. Если f
не имеет слота "rectform"
, то rectform
возвращает объект new(rectform(0,0,f(u,...)))
для соответствующего подвыражения.
Точно так же, если элемент, d
библиотеки domainT
происходит как подвыражение z
, то rectform
пытается вызвать слот "rectform"
той области с d
в качестве аргумента, чтобы вычислить прямоугольную форму d
.
Если стандартная программа слота, T::rectform
не может определить прямоугольную форму d
, то это должно возвратить new(rectform(0,0,d))
.
Если доменный T
не имеет слота "rectform"
, то rectform
возвращает объект new(rectform(0,0,d))
для соответствующего подвыражения.