exponenta event banner

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

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

Например, решите уравнение 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 функция возвращает точные решения в виде символьных выражений. По умолчанию сценарии в реальном времени отображают символьные выражения в сокращенном формате вывода. Параметр символьной настройки использует внутренний алгоритм для выбора сокращаемых вложенных выражений, которые также могут включать вложенные сокращения. Например, в термине,, который содержит подэкспрессию, сокращённо, как Параметр символических настроек не содержит параметров для выбора сокращаемых вложенных выражений.

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