【问题标题】:Matlab/Mupad symbolic simplification for pretty outputMatlab/Mupad 符号简化以获得漂亮的输出
【发布时间】:2014-02-02 15:00:13
【问题描述】:

我需要自动简化一些符号表达式,但是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

【问题讨论】:

  • 我认为您的问题范围并不明确。有哪些类型的方程?什么是“漂亮”?如果没有缩小范围,这个问题将与问题的数学和符号学有关,并且是题外话。
  • @horchler 我已经更新了这个问题。希望它有助于理解我的问题。如果不是让我知道。如果你需要一些“丑陋”表达的例子,我可以在这里发布。
  • 您是否考虑过创建很多规则?
  • @DennisJaheruddin 实际上,我尝试向其中添加一些其他规则(总共 5 条规则),这会杀死我的 matlab 实例。所以我想这不是正确的做法。

标签: matlab symbolic-math simplify mupad


【解决方案1】:

对我来说,如果您将 #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

所以它似乎有效。

【讨论】:

  • 我已经尝试过了,但似乎仍然有很多边缘情况不起作用。我仍然会给你赏金并接受它。如果其他人有更好的解决方案,我仍然很想知道!
  • 哪种边缘情况仍然失败?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
相关资源
最近更新 更多