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

Длинные выражения часто содержат несколько образцы одного и того же подэкспрессии. Такие выражения выглядят короче, если та же подэкспрессия заменена на сокращение. Можно использовать 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)) (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

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

Можно выключить сокращенный выход путем установки '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)) (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

Настройки, которые вы задаете используя 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

Оценка 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)) (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

Для просмотра документации необходимо авторизоваться на сайте