exponenta event banner

subexpr

Переписать символическое выражение в терминах общих вложенных выражений

Описание

пример

[r,sigma] = subexpr(expr) переписывает символическое выражение expr в терминах общей подэкспрессии, заменяя эту общую подэкспрессию символьной переменной sigma. Входное выражение expr не может содержать переменную sigma.

пример

[r,var] = subexpr(expr,'var') заменяет общее подэкспрессию на var. Входное выражение expr не может содержать символьную переменную var.

пример

[r,var] = subexpr(expr,var) эквивалентно [r,var] = subexpr(expr,'var'), за исключением символьной переменной var должен уже существовать в рабочей области MATLAB ®.

Этот синтаксис перезаписывает значение переменной var с общим подэкспрессией, найденным в expr. Во избежание перезаписи значения varиспользуйте другое имя переменной в качестве второго выходного аргумента. Например, использовать [r,var1] = subexpr(expr,var).

Примеры

свернуть все

Решите следующее уравнение. Решения очень длинные выражения. Чтобы отобразить решения, удалите точку с запятой в конце solve команда.

syms a b c d x
solutions = solve(a*x^3 + b*x^2 + c*x + d == 0, x, 'MaxDegree', 3);

Эти длинные выражения имеют общие вложенные выражения. Чтобы сократить выражения, сократите общее вложенное выражение с помощью subexpr. Если переменная не указана для использования в сокращениях в качестве второго входного аргумента subexpr, то subexpr использует переменную sigma.

[r, sigma] = subexpr(solutions)
r = 

(σ-b3a-σ2σσ22σ-b3a-σ2-σ1σ22σ-b3a-σ2+σ1)where  σ1=3σ+σ2σi2  σ2=c3a-b29a2[sigma - b/(3*a) - (c/(3*a) - b^2/(9*a^2))/sigma; (c/(3*a) - b^2/(9*a^2))/(sym(2)*sigma) - b/(3*a) - sigma/2 - (sqrt(sym(3))*(sigma + (c/(3*a) - b^2/(9*a^2))/sigma)*sym(1i))/2; (c/(3*a) - b^2/(9*a^2))/(sym(2)*sigma) - b/(3*a) - sigma/2 + (sqrt(sym(3))*(sigma + (c/(3*a) - b^2/(9*a^2))/sigma)*sym(1i))/2]

sigma = 

d2a+b327a3-bc6a22+c3a-b29a23-b327a3-d2a+bc6a21/3(sqrt((d/(2*a) + b^3/(27*a^3) - (b*c)/(6*a^2))^2 + (c/(3*a) - b^2/(9*a^2))^3) - b^3/(27*a^3) - d/(2*a) + (b*c)/(6*a^2))^sym(1/3)

Решите квадратичное уравнение.

syms a b c x
solutions = solve(a*x^2 + b*x + c == 0, x)
solutions = 

(-b+b2-4ac2a-b-b2-4ac2a)[-(b + sqrt(b^2 - 4*a*c))/(2*a); -(b - sqrt(b^2 - 4*a*c))/(2*a)]

Использовать syms для создания символьной переменной s, а затем замените общие вложенные выражения в результате на эту переменную.

syms s
[abbrSolutions,s] = subexpr(solutions,s)
abbrSolutions = 

(-b+s2a-b-s2a)[-(b + s)/(2*a); -(b - s)/(2*a)]

s = b2-4acsqrt(b^2 - 4*a*c)

В качестве альтернативы можно использовать 's' для указания переменной сокращения.

[abbrSolutions,s] = subexpr(solutions,'s')
abbrSolutions = 

(-b+s2a-b-s2a)[-(b + s)/(2*a); -(b - s)/(2*a)]

s = b2-4acsqrt(b^2 - 4*a*c)

Оба синтаксиса перезаписывают значение переменной s с общим подэкспрессией. Поэтому нельзя, например, подставлять s с некоторым значением.

subs(abbrSolutions,s,0)
ans = 

(-b+s2a-b-s2a)[-(b + s)/(2*a); -(b - s)/(2*a)]

Во избежание перезаписи значения переменной sиспользуйте другое имя переменной для второго выходного аргумента.

syms s
[abbrSolutions,t] = subexpr(solutions,'s')
abbrSolutions = 

(-b+s2a-b-s2a)[-(b + s)/(2*a); -(b - s)/(2*a)]

t = b2-4acsqrt(b^2 - 4*a*c)
subs(abbrSolutions,s,0)
ans = 

(-b2a-b2a)[-b/(2*a); -b/(2*a)]

Входные аргументы

свернуть все

Длинное выражение, содержащее общие вложенные выражения, указанные как символическое выражение или функция.

Переменная для замены общих подчиненных выражений, заданная как символьный вектор или символьная переменная.

subexpr выдает ошибку, если входное выражение expr уже содержит var.

Выходные аргументы

свернуть все

Выражение с общими вложенными выражениями, замененными сокращениями, возвращаемое как символическое выражение или функция.

Переменная, используемая для сокращений, возвращается в качестве символьной переменной.

Представлен до R2006a