상세 컨텐츠

본문 제목

[Python] 파이썬으로 이차방정식 근의 공식의 해 구하기 프로그램 예제

IT & Programming/파이썬 (Python) 공부

by 그림아이 2023. 4. 5. 02:00

본문

반응형

 

수학에서 이차방정식이 차지하는 의미는 매우 큽니다. 수학의 역사에서 큰 비중을 차지하고 있습니다. 그 유명한 이차방정식의 해를 구하는 근의 공식이 만들어진지도 벌써 1,400년 정도 되었고, 3차방정식의 근의 공식도500년 전쯤에 만들어졌습니다. 수학이 발전하게 된 모멘텀 같은 역할을 했고 수와 기하학의 결합에 기틀을 마련했다고 볼 수 있습니다.

 

지난 시간 삼각형의 세 변의 길이가 주어졌을 때 삼각형의 넓이를 구하는 프로그램 예제를 만들어봤습니다. 아래 링크를 참고하시기 바랍니다.

 

[Python] 세 변의 길이로 삼각형의 넓이 구하기 파이썬 프로그램 예제

 

 

근의 공식을 모르는 사람은 없겠지만 다시 가져와 보겠습니다.

 

잘 아시겠지만, 근의 공식에는 조건이 두 가지 있습니다. a, b, c는 실수여야 하고 a는 0이면 안 됩니다. 왜냐하면 a가 근의 공식의 분모로 들어가기 때문입니다.

 

그럼 파이썬으로 만들어 보겠습니다. 지난 시간 공부했던 무한 반복 구문을 이용해보겠습니다. 왜인지 잘 아시죠? 다시 한 번 강조하지만 사용자가 항상 원하는 대로 프로그램을 구동하고 입력하지 않기 때문입니다.

 

import math

while True:
    while True:
        try:
            a = float(input("Input a : "))
            break
        except:
            print("Please try again...")

    while True:
        try:
            b = float(input("Input b : "))
            break
        except:
            print("Please try again...")

    while True:
        try:
            c = float(input("Input c : "))
            break
        except:
            print("Please try again...")

    if a==0 :
        print("a is not supposed to be zero. Try again!!!")
        continue
    else:
        break

d = (b ** 2) - (4*a*c)
answer1 = (-b - math.sqrt(d)) / (2*a)
answer2 = (-b + math.sqrt(d)) / (2*a)

print('The solutions are {0} and{1}'.format(answer1,answer2))

 

a, b, c에 각각 1, -4, 1을 입력하면 다음과 같이 결과 값을 출력합니다.

 

The solutions are 0.2679491924311228 and 3.732050807568877

 

그런데 제가 항상 강조하듯이, 사용자를 믿으면 안되겠죠. 그냥 막 눌러보는 사람들이 분명히 있을 것입니다. 만약 a, b, c에 각각 2, -3, 5를 입력하면 다음과 같이 에러 메시지가 출력됩니다.

 

ValueError: math domain error

 

반응형

 

에러의 원인은 바로 루트 안의 계산 값이 마이너스(-)가 되기 때문입니다. b의 제곱보다 4ac가 더 크니 처리할 수 없는 것입니다. 물론 여기에서 사용자의 입력 실수로 프로그램을 종료하는 것도 한 가지 방법일 수 있습니다. 확인 잘하고 입력하라고 할 수 있죠.

 

하지만 정말 수학에서 루트 안에 마이너스를 허용하지 않나요? 아니죠. 물리학과, 수학과는 물론이고 특히 공대를 다니는 사람들은 공업수학, 역학, 공학 등을 배우는데 허수를 이용한 개념이 넘쳐납니다.

 

그러니 저 같은 공대 출신 엔지니어들은 루트 안에 마이너스가 있다고 해서 에러로 내버려 둘 수가 없는 것입니다. 우린 원래 그런 사람들이니까요. 해결 방법은 cmath 라이브러리를 이용하는 것입니다. 기존의 math에 c만 붙이면 됩니다. 이렇게 하면 정답을 출력할 때 실수부와 허수부로 나누어 출력해줍니다. 코딩 내용은 전과 동일한데  math에 c만 붙이면 됩니다.

 

import cmath

while True:
    while True:
        try:
            a = float(input("Input a : "))
            break
        except:
            print("Please try again...")

    while True:
        try:
            b = float(input("Input b : "))
            break
        except:
            print("Please try again...")

    while True:
        try:
            c = float(input("Input c : "))
            break
        except:
            print("Please try again...")

    if a==0 :
        print("a is not supposed to be zero. Try again!!!")
        continue
    else:
        break

d = (b ** 2) - (4*a*c)
answer1 = (-b - cmath.sqrt(d)) / (2*a)
answer2 = (-b + cmath.sqrt(d)) / (2*a)

print('The solutions are {0} and{1}'.format(answer1,answer2))

 

위에서 하다가 에러났던 a, b, c에 각각 2, -3, 5를 입력해 보면 다음과 같은 결과값을 출력합니다.

 

The solutions are (0.75-1.3919410907075054j) and (0.75+1.3919410907075054j)

 

이래야 공돌이고 엔지니어잖아요. 우린 느낌 아니까. ^^

 

제가 만든 것이 정답은 아닙니다. 저는 정답이라고 글을 쓰거나 자랑하려고 올리는 것이 아닙니다. 저는 부족한 것 투성이임을 누구보다 잘 알고 있습니다. 그래서 공부를 놓지 못하고 계속하는 것입니다. 반복해서 말씀 드리지만, 저도 처음 공부 시작할 때 누군가에게 도움을 받았으니, 저도 누군가에게 도움을 드리고자 할 뿐입니다. 시작할 때의 그 막막함과 답답함을 저는 너무 잘 알고 있으니까요.

 

끝으로…

 

프로그램 언어 공부는 이렇게 갑자기 만들고 싶은 것이 있어야 실력이 향상됩니다. 함수를 잔뜩 외운다고 늘지 않습니다. 직접 프로그램을 만들어 보고, 책이나 인터넷에서 남이 만든 코딩을 영어 해석하듯이 해석해보고, 때론 응용도 하면서 씹고, 뜯고, 맛보고, 즐기고 해야 합니다. 저도 그랬습니다. 

 

세상 모든 것이 그러하듯이, 코딩도 꾸준히 하다 보면 실력이 늡니다.

 

728x90
반응형

관련글 더보기

댓글 영역