본문 바로가기
공부 목록/IT & 프로그래밍

파이썬 sympy를 이용하여 복잡한 수식을 단순 수식으로 변환하는 방법

by 독학박사 2024. 8. 6.

목차


    공학 계산을 하다 보면 수식을 단순화해야 하는 과정이 필요합니다. 일일이 모든 수식을 손으로 풀기에 매우 복잡한 공식이 있을 수 있기 때문에 프로그램을 이용하여 단순화하는 방법을 알아보고자 합니다.

     

    복잡한 공대 수식 파이썬으로 단순화 하기
    복잡한 공대 수식 파이썬으로 단순화 하기

     

     

    sympy의 simplify 함수는?

    sympy는 파이썬에서 기호 수학을 다루기 위한 라이브러리입니다. 라이브러리 안에는 많은 함수들이 존재하는데, 그중 'simplify' 함수는 복잡한 수식을 단순화하는 데 사용됩니다.

     

    'siimplify' 함수를 사용하기 위해 우선 필요한 인자들을 symbols 함수로 정의해줘야 합니다. 정의하는 방법에 대해서는 아래 사용법 및 예제 내용을 참고하시기 바랍니다.

     

     

    sympy의 simplify 함수 사용법 : 2차 방정식

    'x' 인자 한 개를 이용한 복잡한 수식을 만들고 이를 간소화하는 코드를 작성해 봤습니다. 처음 작성하는 코드이니 조금 쉬운 수식을 사용했습니다.

     

    from sympy import simplify, symbols
    
    # 기호 정의
    x, y = symbols('x y')
    
    # 단순화할 수식 정의
    expr = (x**2 + 2*x + 1)/(x + 1)
    
    # 수식 단순화
    simplified_expr = simplify(expr)
    
    print(simplified_expr)  # 출력: x + 1

     

    vscode의 대화형 창에 'expr'을 확인해 보면 아래와 같이 2차 방정식의 수식을 확인할 수 있습니다. 분자가 '(x+1)^2'로 단순화되니 결과는 'x+1'로 단순화됩니다.

     

    사전 정의한 2차 방정식의 수식
    사전 정의한 2차 방정식의 수식

     

    sympy의 simplify 함수 사용법 : 삼각함수

    'simplify'는 다항식뿐만 아니라 분수, 삼각 함수, 지수 함수 등 다양한 형태의 수식을 처리할 수 있습니다. 이번 예제에서는 삼각 함수와 다항식을 포함하는 복잡한 수식을 단순화해 보았습니다.

     

    삼각함수를 사용하기 위해서는 'sympy'에서 별도로 'sin'과 'cos'을 'import'해야 합니다.

     

    from sympy import simplify, symbols, sin, cos
    
    # 기호 정의
    x, y = symbols('x y')
    
    # 단순화할 복잡한 수식 정의
    expr = (sin(x)**2 + cos(x)**2) * (x**2 - y**2) / (x - y)
    
    # 수식 단순화
    simplified_expr = simplify(expr)
    
    print(simplified_expr)  # 출력: x + y

     

    expr은 아래와 같이 삼각함수를 포함한 복잡한 수식임을 알 수 있습니다. 삼각함수 부분이 '1'임을 감안하면 분모와 분자에서 (x-y)가 약분되어 최종 'x+y'만 남게 됩니다.

     

    삼각함수를 포함한 다항식
    삼각함수를 포함한 다항식

     

     

    sympy의 simplify 함수 사용법 : 지수 로그 함수

    이번 예제는 좀 생각대로 결과가 나오지 않아서 중간에 인수분해와 수식 확장 함수인 'factor'와 'expand'를 사용했습니다.

     

    from sympy import simplify, symbols, exp, log, factor, expand
    
    # 기호 정의
    x, y = symbols('x y')
    
    # 복잡한 수식 정의
    expr = exp(log(x)+log(y))*factor(x**3 - y**3) / (x - y)
    
    # 수식 단순화
    expanded_expr = expand(expr)
    
    print(expanded_expr)  # 출력: x**3 + x2*y2 + y**3

     

    지수와 로그 함수가 자동으로 간소화되기 때문에 'expr'의 형태를 보면 아래와 같이 나옵니다. 또한 (x^3-y^3)이 단순화된 상태이기 때문에 분모와 나눠지지 않습니다. 이러한 문제를 해결하기 위해 'factor' 함수로 인수분해를 진행합니다. '(x-y)'가 약분되어 최종 모습이 아래와 같이 됩니다.

     

    지수와 로그가 자동 계산되어 xy의 형태가 됨
    지수와 로그가 자동 계산되어 xy의 형태가 됨

     

    이번 코드에서는 단순화가 아닌 모든 괄호를 푸는 것을 목적으로 했기 때문에 마지막에 'expand' 함수를 사용하여 괄호를 없애줬습니다.

     

    마지막 예제 코드의 최종 모습
    마지막 예제 코드의 최종 모습

     

     

    마치며

    지금까지 복잡한 수식은 간단하게 만들기 위해 'sympy' 라이브러리의 함수인 'simplify'에 대해 알아보았습니다. 공대생들에게 수식을 단순화한다는 것이 매우 어려운 숙제일 수 있습니다. 'simplify'와 'expand'를 잘 사용하여 최종 원하는 단순화된 수식을 구해보세요.

    댓글