如何在 Mathematica 中替换函数和 Full Simplify?
How to substitute functions and Full Simplify in Mathematica?
我有以下功能-((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) 中进行这些替换以在 Mathematica 中得到 (2)?
编辑:我在 "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}
为了快速检查,我们替换了一些随机数以尝试验证原始表达式和重新格式化的表达式是否相等。我将 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}
所以这两个表达方式似乎并不相等,我一定是理解错了。你能解释一下我需要做些什么来验证这两个表达式是否相等吗?
我不能保证以下工作流程会普遍成功,但在这里效果很好。它结合了三个想法:(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 -> a aa (b B - bb) k + A B r
前三个组成部分分别是R
、P
和N1
的可比较表达式。
分析
PolynomialReduce
让我们第一次尝试将 x
表示为 terms
加上任何可能出现的余数的(有理)线性组合。
{parts, remainder} = PolynomialReduce[x, terms, variables]
{{0, 0, 0, (A N1 P R)/k}, a A^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 P R)/k
注意在 rules
中使用 target 模式如何隐式地将 a aa (b B - bb) k + A B r
折叠为 d
而规则本身将余数简化为 0 . 一般来说,其余部分不会变得那么简单——但至少它可能比你开始的更简单。
结束评论
我认为,为了将一种形式扭曲成另一种在某种意义上“简单”的形式,对此类代数表达式的一般操作是一个 NP-hard 问题,所以 YMMV。我的经验是,你必须尝试简化复杂的表达式,并用你自己的代数技能以及你对简化可能采取的形式的感觉来增强它。
我有以下功能-((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) 中进行这些替换以在 Mathematica 中得到 (2)?
编辑:我在 "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}
为了快速检查,我们替换了一些随机数以尝试验证原始表达式和重新格式化的表达式是否相等。我将 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}
所以这两个表达方式似乎并不相等,我一定是理解错了。你能解释一下我需要做些什么来验证这两个表达式是否相等吗?
我不能保证以下工作流程会普遍成功,但在这里效果很好。它结合了三个想法:(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 -> a aa (b B - bb) k + A B r
前三个组成部分分别是R
、P
和N1
的可比较表达式。
分析
PolynomialReduce
让我们第一次尝试将 x
表示为 terms
加上任何可能出现的余数的(有理)线性组合。
{parts, remainder} = PolynomialReduce[x, terms, variables]
{{0, 0, 0, (A N1 P R)/k}, a A^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 P R)/k
注意在 rules
中使用 target 模式如何隐式地将 a aa (b B - bb) k + A B r
折叠为 d
而规则本身将余数简化为 0 . 一般来说,其余部分不会变得那么简单——但至少它可能比你开始的更简单。
结束评论
我认为,为了将一种形式扭曲成另一种在某种意义上“简单”的形式,对此类代数表达式的一般操作是一个 NP-hard 问题,所以 YMMV。我的经验是,你必须尝试简化复杂的表达式,并用你自己的代数技能以及你对简化可能采取的形式的感觉来增强它。