Матлаб/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

1 ответов


для меня это работает, если вы добавляете #n элемент ваших правил, так что ваш