Main Content

기호 표현식 단순화하기

수학 표현식의 단순화는 명확하게 정의된 주제는 아닙니다. 표현식의 어떤 형식이 가장 간단한지에 대한 보편적인 기준은 없습니다. 한 문제에 대해 가장 단순한 수학 표현식의 형식이 다른 문제에 대해서는 복잡하거나 부적합할 수 있습니다. 예를 들어, 다음 두 수학 표현식은 동일한 다항식을 다른 형식으로 나타낸 것입니다.

(x + 1)(x - 2)(x + 3)(x - 4),

x4 - 2x3 - 13x2 + 14x + 24.

첫 번째 형식은 이 다항식의 근을 명확하게 보여줍니다. 이 형식은 근과 관련된 작업을 하기에 간편합니다. 두 번째 형식은 다항식의 계수를 보고 싶을 때 가장 적합합니다. 예를 들어, 이 형식은 다항식을 미분 또는 적분할 때 편리합니다.

계산하려는 문제에 특정 형태의 표현식이 필요한 경우 적절한 단순화 함수를 선택하는 것이 가장 좋은 접근법입니다. Choose Function to Rearrange Expression 항목을 참조하십시오.

Symbolic Math Toolbox™는 특정 단순화 함수 외에도 일반적인 단순화 함수 simplify를 제공합니다.

표현식을 특정 형태(전개, 인수분해 또는 특정 항으로 표현)로 만들 필요가 없는 경우 simplify를 사용하여 수학 표현식을 짧게 만들 수 있습니다. 예를 들어, 계산의 최종 결과에 대해 더 짧은 형식을 구하려면 이 단순화 함수를 사용하십시오.

simplify는 다항식, 삼각 함수, 로그 함수 및 특수 함수를 사용하는 표현식과 같은 다양한 유형의 기호 표현식에서 사용할 수 있습니다. 예를 들어, 다음 다항식을 단순화해 보겠습니다.

syms x y
simplify((1 - x^2)/(1 - x))
simplify((x - 1)*(x + 1)*(x^2 + x + 1)*(x^2 + 1)*(x^2 - x + 1)*(x^4 - x^2 + 1))
ans =
x + 1
 
ans =
x^12 - 1

삼각 함수가 포함된 표현식을 단순화합니다.

simplify(cos(x)^(-2) - tan(x)^2)
simplify(cos(x)^2 - sin(x)^2)
ans =
1
 
ans =
cos(2*x)

지수 및 로그가 포함된 표현식을 단순화합니다. 세 번째 표현식에서는 log(3) 대신 log(sym(3))을 사용하십시오. log(3)을 사용하는 경우 MATLAB®은 배정밀도를 사용하여 log(3)을 계산한 다음 결과를 기호 숫자로 변환합니다.

simplify(exp(x)*exp(y))
simplify(exp(x) - exp(x/2)^2)
simplify(log(x) + log(sym(3)) - log(3*x) + (exp(x) - 1)/(exp(x/2) + 1))
ans =
exp(x + y)
 
ans =
0
 
ans =
exp(x/2) - 1

특수 함수가 포함된 표현식을 단순화합니다.

simplify(gamma(x + 1) - x*gamma(x))
simplify(besselj(2, x) + besselj(0, x))
ans =
0
 
ans =
(2*besselj(1, x))/x

또한 simplify를 사용하여 기호 함수를 단순화할 수도 있습니다.

syms f(x,y)
f(x,y) = exp(x)*exp(y)
f = simplify(f)
f(x, y) =
exp(x)*exp(y)
 
f(x, y) =
exp(x + y)

옵션을 사용하여 단순화하기

기본적으로 simplify는 엄격한 단순화 규칙을 사용하며 단순화된 표현식이 원래의 표현식과 항상 수학적으로 동등하도록 만듭니다. 예를 들어, 일반적으로 복소수 값의 로그를 결합하지는 않습니다.

syms x
simplify(log(x^2) + log(x))
ans =
log(x^2) + log(x)

추가적인 단순화 규칙을 적용할 수도 있는데, 비록 이런 규칙이 파라미터의 모든 값과 모든 사례에 적합하지는 않을 수 있지만 이런 규칙을 사용하면 simplify가 더 간단한 결과를 반환할 수 있습니다. 이런 방법에서는 IgnoreAnalyticConstraints를 사용하십시오. 예를 들어, IgnoreAnalyticConstraints를 사용하여 동일한 표현식을 단순화하면 로그가 결합된 형태의 결과를 얻게 됩니다.

simplify(log(x^2) + log(x),'IgnoreAnalyticConstraints',true)
ans =
3*log(x)

IgnoreAnalyticConstraints는 변수의 값에 대해 일반적으로 사용되는 가정하에 표현식을 단순화할 수 있는 손쉬운 방법을 제공합니다. 이 대신 변수에 대한 적절한 가정을 명시적으로 설정할 수도 있습니다. 예를 들어, 일반적으로 복소수 값에는 로그 결합이 불가능합니다. x가 실수 값이라고 가정하면 simplifyIgnoreAnalyticConstraints 없이 로그를 결합합니다.

assume(x,'real')
simplify(log(x^2) + log(x))
ans =
log(x^3)

추후 계산을 위해 syms를 사용하여 x를 다시 만들어서 가정을 지웁니다.

syms x

표현식이나 함수의 단순화를 향상시킬 수 있는 또 다른 방법은 simplify(f,'Steps',n) 구문을 사용하는 것입니다. 여기서 nsimplify가 수행하는 단계 수를 제어하는 양의 정수입니다. 더 많은 단순화 단계를 지정하면 표현식이 더 단순화될 수 있지만 더 많은 시간이 소요됩니다. 기본적으로는 n = 1입니다. 예를 들어, 다음 표현식을 작성하여 단순화해 보십시오. 결과는 원래의 표현식보다 짧아졌지만 더 단순화될 수 있습니다.

syms x
y = (cos(x)^2 - sin(x)^2)*sin(2*x)*(exp(2*x) - 2*exp(x) + 1)/...
    ((cos(2*x)^2 - sin(2*x)^2)*(exp(2*x) - 1));
simplify(y)
ans =
(sin(4*x)*(exp(x) - 1))/(2*cos(4*x)*(exp(x) + 1))

동일한 표현식에 대한 단순화 단계 수를 지정합니다. 먼저 25개의 단계를 사용합니다.

simplify(y,'Steps',25)
ans =
(tan(4*x)*(exp(x) - 1))/(2*(exp(x) + 1))

50개의 단계를 사용하여 표현식을 더 단순화합니다.

simplify(y,'Steps',50)
ans =
(tan(4*x)*tanh(x/2))/2

이미 표현식이나 함수를 단순화했지만 동일한 표현식에 대한 또 다른 형식을 원한다고 가정해 보겠습니다. 이렇게 하려면 'All' 옵션을 true로 설정하면 됩니다. 구문 simplify(f,'Steps',n,'All',true)는 단순화 단계에서 동일한 표현식에 대한 다른 동등한 결과를 보여줍니다.

syms x
y = cos(x) + sin(x)
simplify(y,'Steps',10,'All',true)
ans =
                                                   2^(1/2)*sin(x + pi/4)
                                                   2^(1/2)*cos(x - pi/4)
                                                         cos(x) + sin(x)
 2^(1/2)*((exp(- x*1i - (pi*1i)/4)*1i)/2 - (exp(x*1i + (pi*1i)/4)*1i)/2)

이보다 더 많은 동등한 결과를 반환하려면 단계 수를 25로 늘리십시오.

simplify(y,'Steps',25,'All',true)
ans =
                                                   2^(1/2)*sin(x + pi/4)
                                                   2^(1/2)*cos(x - pi/4)
                                                         cos(x) + sin(x)
                                      -2^(1/2)*(2*sin(x/2 - pi/8)^2 - 1)
           2^(1/2)*(exp(- x*1i + (pi*1i)/4)/2 + exp(x*1i - (pi*1i)/4)/2)
 2^(1/2)*((exp(- x*1i - (pi*1i)/4)*1i)/2 - (exp(x*1i + (pi*1i)/4)*1i)/2)

가정을 사용하여 단순화하기

일부 표현식은 일반적으로 단순화될 수 없지만 특정 가정하에서 훨씬 짧아집니다. 예를 들어, 추가 가정 없이 이 삼각 함수 표현식을 단순화하면 원래의 표현식이 반환됩니다.

syms n
simplify(sin(2*n*pi))
ans =
sin(2*pi*n)

그러나 변수 n이 정수를 나타내는 것으로 가정하면 동일한 삼각 함수 표현식이 0으로 단순화됩니다.

assume(n,'integer')
simplify(sin(2*n*pi))
ans =
0

추후 계산을 위해 가정을 지웁니다.

syms n

분수 단순화하기

일반 단순화 함수인 simplify를 사용하여 분수를 단순화할 수 있습니다. 그러나 Symbolic Math Toolbox는 이 작업에 특히 더 효율적인 함수인 simplifyFraction을 제공합니다. 명령문 simplifyFraction(f)는 표현식 f를 분수로 나타냅니다. 여기서 분자와 분모는 모두 최대공약수가 1인 다항식입니다. 예를 들어, 다음 표현식을 단순화하십시오.

syms x y
simplifyFraction((x^3 - 1)/(x - 1))
ans =
x^2 + x + 1
simplifyFraction((x^3 - x^2*y - x*y^2 + y^3)/(x^3 + y^3))
ans =
(x^2 - 2*x*y + y^2)/(x^2 - x*y + y^2)

기본적으로 simplifyFraction은 반환된 결과의 분자와 분모에 있는 표현식을 전개하지 않습니다. 결과 표현식에서 분자와 분모를 전개하려면 Expand 옵션을 사용하십시오. 비교를 위해 먼저 Expand 없이 이 분수를 단순화하십시오.

simplifyFraction((1 - exp(x)^4)/(1 + exp(x))^4)
ans =
(exp(2*x) - exp(3*x) - exp(x) + 1)/(exp(x) + 1)^3

이제 Expand를 사용하여 동일한 표현식을 단순화하십시오.

simplifyFraction((1 - exp(x)^4)/(1 + exp(x))^4,'Expand',true)
ans =
(exp(2*x) - exp(3*x) - exp(x) + 1)/(3*exp(2*x) + exp(3*x) + 3*exp(x) + 1)