Main Content

solve 함수로 방정식 해를 구할 때 발생하는 문제 해결하기

solve가 복잡해 보이는 해를 반환하거나 solve가 입력값을 처리할 수 없는 경우 사용할 수 있는 옵션이 많이 있습니다. 이러한 옵션은 solve의 해 공간을 단순화합니다. 또한 입력값이 복잡한 경우 solve를 지원하고, solve가 이전에는 구하지 못했던 해를 반환하도록 할 수도 있습니다.

하나의 실수 해만 반환하기

방정식 x^5 - 1 == 0을 풉니다. 이 방정식에는 5개의 해가 있습니다.

syms x
solve(x^5 - 1 == 0, x)
ans =
                                                     1
 - (2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 - 5^(1/2)/4 - 1/4
   (2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 - 5^(1/2)/4 - 1/4
   5^(1/2)/4 - (2^(1/2)*(5^(1/2) + 5)^(1/2)*1i)/4 - 1/4
   5^(1/2)/4 + (2^(1/2)*(5^(1/2) + 5)^(1/2)*1i)/4 - 1/4

실수 해만 필요한 경우 Real 옵션을 true로 지정합니다. solve 함수는 1개의 실수 해를 반환합니다.

solve(x^5 - 1, x, 'Real', true)
ans =
1

단순화 규칙 적용하기

아래의 방정식을 풉니다. solve 함수는 복잡한 해를 반환합니다.

syms x
solve(x^(5/2) + 1/x^(5/2) == 1, x)
ans =
                                                       1/(1/2 - (3^(1/2)*1i)/2)^(2/5)
                                                       1/((3^(1/2)*1i)/2 + 1/2)^(2/5)
 -(5^(1/2)/4 - (2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 + 1/4)/(1/2 - (3^(1/2)*1i)/2)^(2/5)
 -((2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 + 5^(1/2)/4 + 1/4)/(1/2 - (3^(1/2)*1i)/2)^(2/5)
 -(5^(1/2)/4 - (2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 + 1/4)/(1/2 + (3^(1/2)*1i)/2)^(2/5)
 -((2^(1/2)*(5 - 5^(1/2))^(1/2)*1i)/4 + 5^(1/2)/4 + 1/4)/(1/2 + (3^(1/2)*1i)/2)^(2/5)

방정식을 풀 때 단순화 규칙을 적용하려면 IgnoreAnalyticConstraints 옵션을 true로 지정하십시오. 적용된 단순화 규칙은 일반적으로 수학적으로 정확하지 않지만, 유용한 해를 생성할 수도 있으며 특히 물리학 및 공학에서 유용합니다. 이 옵션을 사용하는 경우 솔버가 결과의 정확성 및 완전성을 보장하지 않습니다.

solve(x^(5/2) + 1/x^(5/2) == 1, x, 'IgnoreAnalyticConstraints', true)
ans =
 1/(1/2 - (3^(1/2)*1i)/2)^(2/5)
 1/((3^(1/2)*1i)/2 + 1/2)^(2/5)

이 해는 더 단순하고 더 유용합니다.

가정을 사용하여 결과 좁히기

특정한 경우에 대한 해를 위해 적절한 해를 반환하도록 가정을 설정합니다. 아래의 방정식을 풉니다. solve 함수는 7개의 해를 반환합니다.

syms x
solve(x^7 + 2*x^6 - 59*x^5 - 106*x^4 + 478*x^3 + 284*x^2 - 1400*x + 800, x)
ans =
                  1
      - 5^(1/2) - 1
 - 17^(1/2)/2 - 1/2
   17^(1/2)/2 - 1/2
         -5*2^(1/2)
          5*2^(1/2)
        5^(1/2) - 1

x가 양수라고 가정하고 방정식을 다시 풉니다. solve 함수는 4개의 양수 해만 반환합니다.

assume(x > 0)
solve(x^7 + 2*x^6 - 59*x^5 - 106*x^4 + 478*x^3 + 284*x^2 - 1400*x + 800, x)
ans =
                1
 17^(1/2)/2 - 1/2
        5*2^(1/2)
      5^(1/2) - 1

in(x,'integer')를 사용하여 x가 정수라는 가정을 추가합니다. assumeAlso를 사용하여 변수에 대한 가정을 추가합니다.

assumeAlso(in(x,'integer'))
solve(x^7 + 2*x^6 - 59*x^5 - 106*x^4 + 478*x^3 + 284*x^2 - 1400*x + 800, x)
ans =
1

solvex에 대한 양의 정수 해만 반환합니다.

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

syms x

또는 여러 가정을 만들려는 경우 & 연산자를 사용합니다. 다음과 같이 가정을 설정하고 아래의 방정식을 풉니다.

syms a b c f g h y
assume(f == c & a == h & a~= 0)
S = solve([a*x + b*y == c, h*x - g*y == f], [x, y], 'ReturnConditions', true);
S.x
S.y
S.conditions
ans =
f/h
ans =
0
ans =
b + g ~= 0

지정된 가정하에서 해는 조건 b + g ~= 0 하에 x = f/h, y = 0입니다.

추후 계산을 위해 syms를 사용하여 변수를 다시 생성해서 가정을 지웁니다.

syms a c f h

해 단순화하기

solve 함수는 최종 결과에 대해 단순화 함수를 호출하지 않습니다. 해를 단순화하려면 simplify를 호출하십시오.

아래의 방정식을 풉니다. sym을 사용하여 숫자를 기호 숫자로 변환하여 기호 결과를 반환합니다.

syms x
S = solve((sin(x) - 2*cos(x))/(sin(x) + 2*cos(x)) == 1/2, x)
S =
 -log(-(- 140/37 + 48i/37)^(1/2)/2)*1i
  -log((- 140/37 + 48i/37)^(1/2)/2)*1i

simplify를 호출하여 해 S를 단순화합니다.

simplify(S)
ans =
        -log(37^(1/2)*(- 1/37 - 6i/37))*1i
 log(2)*1i - (log(- 140/37 + 48i/37)*1i)/2

더 많은 단계를 사용해 simplify를 호출하여 결과를 더 단순화합니다.

simplify(S, 'Steps', 50)
ans =
 atan(6) - pi
      atan(6)

  • 숫자를 정확히 나타내려면 sym을 사용하여 숫자를 부동소수점 객체로 변환하십시오. 예를 들어, 13/5 대신 sym(13)/5를 사용하십시오. 그러면 13/5를 부동소수점 숫자로 변환하는 대신 13/5를 정확히 나타냅니다. 큰 숫자는 따옴표로 묶습니다. sym(13)/5, sym(133333333333333333333)/5sym('133333333333333333333')/5를 비교합니다.

    sym(13)/5
    sym(133333333333333333333)/5
    sym('133333333333333333333')/5
    ans =
    13/5
    ans =
    133333333333333327872/5
    ans =
    133333333333333333333/5

    숫자를 따옴표로 묶고 sym을 사용하면 최상의 정확도가 제공됩니다.

  • 가능한 경우, solve를 사용하기 전에 연립방정식을 수동으로 단순화하십시오. 방정식, 파라미터 및 변수의 수를 줄여 보십시오.