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[сигма - b / (3*a) - (c / (3*a) - b^2 / (9*a^2)) / сигма; (c / (3*a) - b^2 / (9*a^2)) / (sym (2) *sigma) - b / (3*a) - сигма/2 - (sqrt (sym (3)) * (сигма + (c / (3*a) - b^2 / (9*a^2)) / сигма) *sym (1i))/2; (c / (3*a) - b^2 / (9*a^2)) / (sym (2) *sigma) - b / (3*a) - сигма/2 + (sqrt (sym (3)) * (сигма + (c / (3*a) - b^2 / (9*a^2)) / сигма) *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