Как подставить функции и полное упрощение в Mathematica? - PullRequest
4 голосов
/ 05 июня 2019

У меня есть следующая функция -((A N1 P (A B k (a N1 + aa P - r) + a aa (b B - bb) k R + 2 A B r R))/k) -- (1)

Эта функция может быть переписана как: - A R P N1 d/k --- (2)

где:

R is (k (aa B m - a mm + A B r))/(a aa (b B - bb) k + A B r)

P is (-a^2 b k mm - A B m r + 
 a k (aa bb m + A b B r))/(A (a aa (b B - bb) k + A B r))

N1 is (-aa^2 bb k m + A mm r + 
 aa k (a b mm - A bb r))/(A (a aa (b B - bb) k + A B r))

d is a aa (b B - bb) k + A B r

Как я могу сделать эти замены в (1), чтобы получить (2) в Mathematica?

Редактировать: я допустил небольшую ошибку в кодировке "d". Я отредактировал уравнение сейчас.

Согласно предложению, я оценил оба выражения в (1) и (2), чтобы убедиться, что они равны по величине.

{a, A, aa, b, B, bb, k, m, mm, r} = RandomReal[{0, 20}, 10];
R = (k (aa B m - a mm + A B r))/(a aa (b B - bb) k + A B r);
P = (-a^2 b k mm - A B m r + 
     a k (aa bb m + A b B r))/(A (a aa (b B - bb) k + A B r));
N1 = (-aa^2 bb k m + A mm r + 
     aa k (a b mm - A bb r))/(A (a aa (b B - bb) k + A B r));
d = a aa (b B - bb) k + A B r;
{-((A N1 P (A B k (a N1 + aa P - r) + a aa (b B - bb) k R + 
        2 A B r R))/k), -A R P N1 d/k}
{-39976.5, -39976.5}

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Я не могу гарантировать, что следующий рабочий процесс будет успешным повсеместно, но здесь он работает хорошо.Он объединяет три идеи: (1) алгебра полиномов, чтобы приблизиться к хорошему результату;(2) замена для расширения переменных;и (3) «свертывание» комбинаций переменных («терминов») в одну переменную.


Настройка

Начните с установки ввода: variables - это просто список имен атомарных переменных;terms - это список значений для расширения R, P, N1 и d;x - исходный многочлен.

variables = {a, aa, b, bb, d, k, mm, r, A, B, R, P, N1};
terms = {(k (aa B m - a mm + A B r))/(a aa (b B - bb) k + A B r), 
         (-a^2 b k mm - A B m r + a k (aa bb m + A b B r))/(A (a aa (b B - bb) k + A B r)),
         (-aa^2 bb k m + A mm r +  aa k (a b mm - A bb r))/(A (a aa (b B - bb) k + A B r)), 
         a aa (b B - bb) k + A B r};
x = ((A N1 P (A B k (a N1 + aa P - r) + a aa (b B - bb) k R + 2 A B r R))/k);

Из этой информации мы можем составить список правил замены для терминов. Они будут выполнять этап замещения.

rules = (Rule @@ #) & /@ Transpose[{{R, P, N1, d}, terms}]

Например, четвертый компонент Rules имеет вид

d -> aaa (b B - bb) k + AB r

и первые три компонента являются сопоставимыми выражениями для R, P и N1, соответственно.

Анализ

PolynomialReduce дает нам первый пробел при выражении x как (рациональная) линейная комбинация terms плюс любой остаток, который может выпасть.

{parts, remainder} = PolynomialReduce[x, terms, variables]

{{0, 0, 0, (A N1 PR) / k}, aA ^ 2 B N1 ^ 2 P + A ^ 2 aa B N1 P ^ 2 - A ^ 2 B N1 P r + (A ^ 2 B N1 P r R) / k}

первая часть, parts, содержит коэффициенты {0, 0, 0, (A N1 P R)/k}: коэффициенты первых трех слагаемых равны нулю, а коэффициент последнего слагаемого (который в конечном итоге будет выражен как d) равен A N1 P R/k, откуда результатчто x было расширенов линейную комбинацию 0(R) + 0(P) + 0(N1) + (A N1 P R/k) d плюс остаток.

Мы уже достигли прогресса, но теперь пришло время поработать с остатком. Для этого примените правила замены: Simplify[remainder /. rules].Чтобы воссоздать x, этот остаток необходимо добавить к предыдущей линейной комбинации.Давайте сделаем все сразу:

parts . rules [[;; , 1]] + Simplify[remainder /. rules]

(A d N1 PR) / k

Обратите внимание на использование шаблонов target в rules неявно свернуло a aa (b B - bb) k + A B r в d, в то время как сами правила упростили остаток до 0. В целом, остаток не будет таким простым - но, по крайней мере, он будет проще, чем то, с чего вы начали.


Заключительные комментарии

Я считаю, что общее манипулирование такими алгебраическими выражениями в попытке превратить одну форму в другую, которая является "простой" в некотором смысле, является проблемой NP-трудной, поэтому YMMV,Мой опыт показывает, что вы должны экспериментировать с упрощенными сложными выражениями и дополнять их своими собственными алгебраическими навыками, а также своим пониманием того, в какой форме это упрощение, вероятно, примет.

1 голос
/ 06 июня 2019

Для быстрой проверки мы подставляем несколько случайных чисел, чтобы убедиться, что исходные и переформатированные выражения равны. Я заменяю D на d, потому что D предопределено как функция в Mathematica и в противном случае не вносит изменений.

{a, A, aa, b, B, bb, k, m, mm, r}=RandomReal[{0,20},10];
R=(k (aa B m - a mm + A B r))/(a aa (b B - bb) k + A B r);
P=(-a^2 b k mm - A B m r +  a k (aa bb m + A b B r))/(A (a aa (b B - bb) k + A B r));
N1=(-aa^2 bb k m + A mm r +  aa k (a b mm - A bb r))/(A (a aa (b B - bb) k + A B r));
d=A (a aa (b B - bb) k + A B r);
{-((A N1 P (A B k (a N1 + aa P - r) + a aa (b B - bb) k R + 2 A B r R))/k),A R P N1 d/k}

что на этот раз даст

{21112.3,-65366.1}

Таким образом, эти два выражения не кажутся равными, и я, должно быть, неправильно понял. Можете ли вы объяснить, что мне нужно сделать по-разному, чтобы убедиться, что два выражения равны?

...