用于漂亮输出的 Matlab/Mupad 符号简化

标签 matlab symbolic-math simplify mupad

我需要自动简化一些符号表达式,但是 matlab 的simplify 函数不能满足我的所有需求。

例子:

simplify(expand((ax + bx)^2 + (ay + by)^2))

输出结果

ax^2 + 2*ax*bx + ay^2 + 2*ay*by + bx^2 + by^2

所以我尝试创建自己的规则来使输出更漂亮

function [ result ] = simplify_pretty( term )
    read(symengine, 'simplify_pretty_rules.mu');
    result = feval(symengine, 'Simplify', term, 'SelectRules = simplify_pretty_rules')
end

使用“simplify_pretty_rules.mu”

simplify_pretty_rules := proc()
begin
    [
        Rule(#X^2 - 2 * #X * #Y + #Y^2, (#X - #Y)^2),
        Rule(#X^2 + 2 * #X * #Y + #Y^2, (#X + #Y)^2)
    ]
end_proc:

这适用于像...这样的输入

simplify_pretty(expand((ax + bx)^2 + (ay + by)^2))

...但是当更改为...

simplify_pretty(expand(-(ax + bx)^2 - (ay + by)^2))

……不是

所以问题是: 是否可以创建适用于(几乎)所有情况的规则?我做错了什么?


编辑: 这似乎是一个普遍的问题。如果一个表达式有某种因素/被打乱,那么 matlab 似乎很难解决这个问题。我需要一种可靠的方法来处理这类事情,即使它需要一些时间来处理。


编辑2:

我在说什么类型的表达式?
表达式仅包含简单的数学运算(add/sub/mul/div)。

我想简化什么?
我想简化的最常见的事情之一是扩展的二项式(请参阅原始问题)。

表达式中包含的另一个常见内容是扩展点/叉积,可以简化为 cos(a)/sin(a) 表达式,这些表达式可能会在接下来的步骤中合并在一起。但这是更高级的,所以我不确定是否有有用的自动解决方案。

在我的案例中,什么是“漂亮”?
我想最重要的是表达式的长度(越短越好)。但是优化像

这样的表达式也很巧妙
a/2 + b/2 + c/2

(a + b + c) / 2

最佳答案

对我来说,如果你在你的规则中添加一个 #n 元素,那么你的 simplify_pretty_rules 文件看起来像这样:

simplify_pretty_rules := proc()
begin
    [
    Rule(#n * #X^2 - #n * 2 * #X * #Y + #n * #Y^2, #n * (#X - #Y)^2),
    Rule(#n * #X^2 + #n * 2 * #X * #Y + #n * #Y^2, #n * (#X + #Y)^2)
    ]
end_proc:

我相信在这种情况下#n 指的是一个常数项。这给了我:

term = 'expand((ax - bx)^2 - 3 *(ay + by)^2)';
feval(symengine, 'Simplify', term, 'SelectRules = simplify_pretty_rules')

ans =  (ax - bx)^2 - 3*(ay + by)^2

所以它似乎有效。

关于用于漂亮输出的 Matlab/Mupad 符号简化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21512047/

相关文章:

arrays - 查找分组在数组中的特定零点 - matlab

arrays - Matlab:创建一个 symfun 数组

c++ - C++ 中的解析符号微分

java - 如何对 float 进行舍入但保持 float (即不将其转换为 int)?

MATLAB 和使用多核运行计算

matlab - 计算 2 个向量之间的角度,顺时针从 0 到 2*pi

Matlab:结构中变量的名称

symbolic-math - 使用 Math.NET Symbolics 求解线性方程

java - 如何简化下面的类

c# 面板数组简化代码