Преобразование символьного выражения в рациональный многочлен

#matlab #symbolic-math

#matlab #символьный-математика

Вопрос:

У меня есть длинное символическое выражение, которое включает рациональные многочлены (базовые арифметические и целочисленные степени). Я хотел бы упростить его до одного (простого) рационального многочлена.

numden делает это, но, похоже, использует некоторую дорогостоящую оптимизацию, которая, вероятно, касается более общего случая. При попытке в моем примере ниже он разбился через несколько часов — не хватает памяти (32 ГБ). Я считаю, что возможно что-то более эффективное, даже если у меня нет доступа cpp к функциям matlab (например children ).

Мотивация: у меня есть целевая функция, которая включает полиномы. Я вручную вывел его, и я хотел бы проверить и сравнить производные: я вычитаю два выражения, и результат должен исчезнуть. В настоящее время мой интерес к этому носит академический характер, поскольку практически я просто подставляю какое-то случайное выражение, получаю ноль, и мне этого достаточно.

Я постараюсь найти время, чтобы поиграть с этим в какой-то момент, и я обновлю здесь об этом, но я опубликовал на случай, если кто-то найдет это интересным и хотел бы попробовать перед этим.

Для запуска моей функции:

 x = sym('x', [1 32], 'real')
e = func(x)
 

Функция (и хотите верьте, хотите нет, это всего лишь якобиан, и у меня также есть гессиан) не может быть вставлена сюда, поскольку ограничение текста составляет 30 КБ:

https://drive.google.com/open?id=1imOAa4VS87WDkOwAK0NoFCJPTK_2QIRj

Комментарии:

1. На первый взгляд, похоже, что упрощение не является целью? И я предполагаю, что вы получили символьное выражение, потому что вам нужно было использовать какой-то другой инструмент, который выводит символьное выражение? Тогда, может быть, строка обработает формулу в вашем файле? Вы, наверное, пробовали вызывать numden в несколько этапов?

2. Целью является упрощение до рационального полинома, хотя здесь конкретное применение заключается в том, чтобы оно исчезло. Мотивация приложения заключается исключительно в том, чтобы без сомнения доказать правильность производных. Вместо обработки строк с нуля я предложил использовать children() . Нет, у меня не было времени на эксперименты, и это займет некоторое время, пока я это сделаю — когда мой академический интерес станет практическим. Возможно, кто-то из команды matlab примет к сведению и улучшит numden.

3. Я понимаю. Лично я неохотно обращаюсь к символическому пакету Matlab или любому другому. Плохо масштабируется. Так что я просто не ожидаю, что смогу потратить на это свое время. Для обработки poly я бы предпочел, чтобы компьютер имел дело только с коэффициентами — что, как я понимаю, практично только в том случае, если вам не нужно отслеживать дроби, но вы можете принимать числовые (десятичные) приближения в коэффициентах.