Сократите распространенные слова в долгих выражениях

Долгие выражения часто содержат несколько экземпляров того же подвыражения. Такие выражения выглядят короче, если то же подвыражение заменяется сокращением. Можно использовать sympref задавать, использовать ли сокращенный выходной формат символьных выражений в live скриптах.

Например, решите уравнение x+1x=1 использование solve.

syms x
sols = solve(sqrt(x) + 1/x == 1, x)
sols = 

(118σ2+σ22+13-σ12118σ2+σ22+13+σ12)where  σ1=319σ2-σ2i2  σ2=2554-231081081/3[(1 / (18* (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) + (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)/2 + sym (1/3) - (sqrt (sym (3)) * (1 / (9* (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) - (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) *sym (1i))/2) ^sym (2); (1 / (18* (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) + (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)/2 + sym (1/3) + (sqrt (sym (3)) * (1 / (9* (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) - (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) *sym (1i))/2) ^sym (2)]

solve функция возвращает точные решения как символьные выражения. По умолчанию live скрипты отображают символьные выражения в сокращенном выходном формате. Символьная установка preference использует внутренний алгоритм, чтобы выбрать, какие подвыражения сократить, который может также включать вложенные сокращения. Например, термин σ1 содержит подвыражение, сокращенное как σ2. Символьная установка preference не предоставляет возможностей выбирать который подвыражения сократить.

Можно выключить сокращенный выходной формат путем установки 'AbbreviateOutput' настройка к false. Возвращенным результатом является долгое выражение, которое затрудняет в чтение.

sympref('AbbreviateOutput',false);
sols
sols = 

(1182554-231081081/3+2554-231081081/32+13-3192554-231081081/3-2554-231081081/3i221182554-231081081/3+2554-231081081/32+13+3192554-231081081/3-2554-231081081/3i22)[(1 / (18* (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) + (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)/2 + sym (1/3) - (sqrt (sym (3)) * (1 / (9* (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) - (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) *sym (1i))/2) ^sym (2); (1 / (18* (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) + (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)/2 + sym (1/3) + (sqrt (sym (3)) * (1 / (9* (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) - (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) *sym (1i))/2) ^sym (2)]

Настройки вы устанавливаете использование sympref сохранитесь через свои текущие и будущие сеансы MATLAB®. Восстановите значения по умолчанию 'AbbreviateOutput' путем определения 'default' опция.

sympref('AbbreviateOutput','default');

subexpr другая функция, которую можно использовать, чтобы сократить долгие выражения. Эта функция сокращает только одно общее подвыражение и различающийся sympref, это не поддерживает вложенные сокращения. Как sympref, subexpr также не позволяет вам выбрать который подвыражения заменить.

Используйте второй входной параметр subexpr задавать имя переменной, которое заменяет общее подвыражение. Например, замените общее подвыражение в sols с переменной t.

[sols1,t] = subexpr(sols,'t')
sols1 = 

(t2+118t+13+3t-19ti22t2+118t+13-3t-19ti22)[(t/2 + 1 / (18*t) + sym (1/3) + (sqrt (sym (3)) * (t - 1 / (9*t)) *sym (1i))/2) ^2; (t/2 + 1 / (18*t) + sym (1/3) - (sqrt (sym (3)) * (t - 1 / (9*t)) *sym (1i))/2) ^2]

t = 

2554-231081081/3(sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)

Несмотря на то, что sympref и subexpr не обеспечивайте способ выбрать, какие подвыражения заменить в решении, можно задать эти подвыражения как символьные переменные и вручную переписать решение.

Например, задайте новые символьные переменные a1 и a2.

syms a1 a2

Перепишите решения sols в терминах a1 и a2 прежде, чем присвоить значения a1 и a2 постараться не оценивать sols.

sols = [(1/2*a1 + 1/3 + sqrt(3)/2*a2*1i)^2;...
        (1/2*a1 + 1/3 - sqrt(3)/2*a2*1i)^2]
sols = 

(a12+13+3a2i22a12+13-3a2i22)[(a1/2 + sym (1/3) + (sqrt (sym (3)) *a2*sym (1i))/2) ^2; (a1/2 + sym (1/3) - (sqrt (sym (3)) *a2*sym (1i))/2) ^2]

Присвойте значения (t+19t) и (t-19t) к a1 и a2, соответственно.

a1 = t + 1/(9*t)
a1 = 

192554-231081081/3+2554-231081081/31/(9* (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) + (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)

a2 = t - 1/(9*t)
a2 = 

2554-231081081/3-192554-231081081/3(sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3) - 1 / (9* (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3))

Оцените sols использование subs. Результат идентичен первому выходу в этом примере.

sols_eval = subs(sols)
sols_eval = 

(118σ2+σ22+13-σ12118σ2+σ22+13+σ12)where  σ1=319σ2-σ2i2  σ2=2554-231081081/3[(1 / (18* (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) + (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)/2 + sym (1/3) - (sqrt (sym (3)) * (1 / (9* (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) - (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) *sym (1i))/2) ^sym (2); (1 / (18* (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) + (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)/2 + sym (1/3) + (sqrt (sym (3)) * (1 / (9* (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) - (sym (25/54) - (sqrt (sym (23)) *sqrt (sym (108)))/108) ^sym (1/3)) *sym (1i))/2) ^sym (2)]