Dan*_*iel 8 matlab symbolic-math simplify mupad
我需要自动简化一些符号表达式,但simplify
matlab 的功能无法完成我需要的一切.
例:
simplify(expand((ax + bx)^2 + (ay + by)^2))
Run Code Online (Sandbox Code Playgroud)
这导致输出
ax^2 + 2*ax*bx + ay^2 + 2*ay*by + bx^2 + by^2
Run Code Online (Sandbox Code Playgroud)
所以我试图创建自己的规则,使输出更漂亮
function [ result ] = simplify_pretty( term )
read(symengine, 'simplify_pretty_rules.mu');
result = feval(symengine, 'Simplify', term, 'SelectRules = simplify_pretty_rules')
end
Run Code Online (Sandbox Code Playgroud)
与"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:
Run Code Online (Sandbox Code Playgroud)
这适用于像...这样的输入
simplify_pretty(expand((ax + bx)^2 + (ay + by)^2))
Run Code Online (Sandbox Code Playgroud)
......但是当改为......
simplify_pretty(expand(-(ax + bx)^2 - (ay + by)^2))
Run Code Online (Sandbox Code Playgroud)
......它没有
所以问题是:是否有可能创建适用于(几乎)所有情况的规则?我究竟做错了什么?
编辑: 这似乎是一个普遍的问题.如果表达式有某种因素/被扰乱,那么matlab似乎很难弄明白这一点.即使需要一些时间来处理,我还需要一种强大的方法来完成这类工作.
EDIT2:
我在说什么类型的表达?
表达式仅包含数学简单运算(add/sub/mul/div).
我想简化什么?
我想要简化的最常见的事情之一是扩展的二项式(参见原始问题).
表达式中包含的另一个常见内容是扩展了点/交叉积,可以简化为cos(a)/ sin(a)表达式,这些表达式可能会在后续步骤中合并在一起.但这更先进,所以我不确定是否有有用的自动解决方案.
在我的情况下,什么是"漂亮"?
我猜最重要的是表达式的长度(越短越好).但是优化像这样的表达式也很简洁
a/2 + b/2 + c/2
Run Code Online (Sandbox Code Playgroud)
至
(a + b + c) / 2
Run Code Online (Sandbox Code Playgroud)
对我来说,如果你#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:
Run Code Online (Sandbox Code Playgroud)
我相信在这种情况下,#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
Run Code Online (Sandbox Code Playgroud)
所以它似乎有效。