Matlab/Mupad符号简化以获得漂亮的输出

9

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

例如:

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来说解决这个问题似乎非常困难。我需要一种强大的方法来处理这种类型的内容,即使需要一些时间来处理。


第二次编辑:

我在谈论什么类型的表达式?
这些表达式仅包含数学简单运算(加/减/乘/除)。

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

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

在我这种情况下,“漂亮”的是什么?
我想最重要的是表达式的长度(越短越好)。但是如果能够优化表达式,如合并重复项,那就更好了。

a/2 + b/2 + c/2

to

(a + b + c) / 2

1
我认为你的问题范围不够清晰。是什么类型的方程?什么是“漂亮”的方程?如果没有明确的范围,这个问题将涉及到问题的数学和符号学,并且会被视为离题。 - horchler
@horchler 我已经更新了问题。希望它有助于理解我的问题。如果不行,请告诉我。如果你需要一些“丑陋”的表达式的例子,我可以在这里发布它们。 - Daniel
你考虑过创建许多规则吗? - Dennis Jaheruddin
@DennisJaheruddin 实际上,我已经尝试添加了其他规则(总共5个规则),这导致我的Matlab实例崩溃。所以我想这不是正确的做法。 - Daniel
1个回答

5

如果您在规则中添加一个#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

看起来它是有效的。


我已经尝试过了,但似乎仍有很多边缘情况无法解决。我仍然会给你悬赏并接受它。如果其他人有更好的解决方案,我仍然渴望知道! - Daniel
仍然失败的是哪些边缘情况? - MrAzzaman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接