我需要自动简化一些符号表达式,但是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))当...but改为..。
simplify_pretty(expand(-(ax + bx)^2 - (ay + by)^2))...it没有
因此,问题是:是否有可能制定适用于(几乎)所有情况的规则?我做错了什么?
编辑:,这似乎是一个普遍的问题。如果一个表达式有某种因素/混乱,那么matlab似乎很难弄清楚这一点。我需要一种强大的方法来做这种事情,即使它需要一些时间来处理。
Edit2:
我说的是哪种表达方式?
表达式只包含简单的数学操作(add/sub/mul/div)。
我想简化什么?
我想要简化的最常见的事情之一是二项式,它被扩展了(见原来的问题)。
表达式中包含的另一个常见的东西--扩展的点/交叉积--可以简化为cos(a)/sin(a)表达式,这些表达式可能在接下来的步骤中合并在一起。但这是更高级的,所以我不确定是否有有用的自动解决方案。
什么是“漂亮”在我的情况下?
我想最重要的是表达式的长度(越短越好)。但是优化表达式也是很好的,比如
a/2 + b/2 + c/2至
(a + b + c) / 2发布于 2014-02-07 02:29:14
对于我来说,如果将#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看来挺管用的。
https://stackoverflow.com/questions/21512047
复制相似问题