如何在 Mathematica 中替换函数和 Full Simplify?

2023-12-25

我有以下功能-((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)

where:

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

在 Mathematica 中,如何在 (1) 中进行这些替换以达到 (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}

我不能保证以下工作流程会普遍成功,但它在这里运行良好。它结合了三个想法:(1)多项式代数更接近一个好的结果; (2) 代入扩大变量; (3) 将变量组合(“项”)“折叠”为单个变量。


设置

首先建立输入: variables只是原子变量名称的列表;terms是要展开的值的列表R, P, N1, and 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 is

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

前三个组成部分是可比较的表达式R, P, and 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) is A N1 P R/k,结果是x已展开为线性组合0(R) + 0(P) + 0(N1) + (A N1 P R/k) d plus其余的。

我们已经取得了进展,但现在是时候与其余部分合作了。为此,请应用替换规则:Simplify[remainder /. rules]。重新创建x,这个余数需要添加到前面的线性组合中。让我们一次性完成这一切:

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

(AD N1 P R)/k

注意如何使用target中的模式rules已经隐含地崩溃了a aa (b B - bb) k + A B r into d而规则本身将余数简化为 0。一般来说,余数不会那么简单——但至少它可能比你开始时更简单。


结束语

我相信,对这种代数表达式的一般操作,试图将一种形式扭曲成另一种某种意义上“简单”的形式,是一个 NP 难题,所以 YMMV。我的经验是,你必须尝试简化复杂的表达式,并用你自己的代数技能以及你对简化可能采取的形式的感觉来增强它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Mathematica 中替换函数和 Full Simplify? 的相关文章

随机推荐