Matlab / Mupad符号简化,输出漂亮

时间:2014-02-02 15:00:14

标签: 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

with“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似乎很难弄清楚这一点。即使需要一些时间来处理,我也需要一种强有力的方法来做这种事情。


EDIT2:

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

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

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

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

这样的表达式也很简洁
a/2 + b/2 + c/2

(a + b + c) / 2

1 个答案:

答案 0 :(得分:4)

对我而言,如果您在规则中添加#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

所以它似乎有效。