Матлаб/Mupad символическое упрощение для красивых выходных
мне нужно автоматически упростить некоторые символические выражения, но simplify
функция 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))
...это не
Итак, вопросы: Можно ли создать правила, которые работают (почти) во всех ситуациях? Что я делаю не так?
Edit: Похоже, это общая проблема. Если выражение имеет какой-то фактор/беспорядочно, кажется, что matlab довольно сложно понять это. Мне нужен надежный способ сделать такие вещи, даже если это займет некоторое время процесс.
Edit2:
о каких выражениях я говорю?
Выражения содержат только простые математические операции (add/sub/mul / div).
что я хочу, чтобы упростить?
Одна из самых распространенных вещей, которые я хочу упростить, - это биномы, которые были расширены (см. исходный вопрос).
еще одна распространенная вещь, содержащаяся в расширенных выражениях точечные / перекрестные продукты, которые могут быть упрощены до выражений cos(a)/sin(a), которые могут быть объединены на следующих шагах. Но это более продвинутый, поэтому я не уверен, есть ли для него полезные автоматические решения.
что такое "красиво" в моем случае?
Я думаю, что наиболее важным является длина выражений (как короче, так и лучше). Но было бы также аккуратно оптимизировать выражения, такие как
a/2 + b/2 + c/2
to
(a + b + c) / 2