3차 방정식 해 구하는 함수 만들어보기
함수계산기에서는 자바스크립트와 비슷한 코딩문법을 가진 SimpleMath라 불리는 스크립트를 이용하여 사용자가 자기만의 수학함수를 만들 수 있습니다.
일단 만들어서 저장해 놓으면 계산시 그 함수를 불러와서 숫자만 입력해 넣으면 자동계산이 되기때문에 매우 유용합니다.
이번에는 3차 방정식 ax^3+bx^2+cx+d=0 의 해를 구하는 함수를 만들어 봅시다.
이번에도 AI에게 코딩을 요청했고 여러번 테스트를 해 봤는데 어쩐일인지 틀린 결과가 자꾸 나와서 할 수 없이 인터넷 검색하여 삼차방정식 해를 구하는 공식을 설명하는 영어사이트를 찾아내서 그 글을 참조하여 직접 아래와 같이 코딩을 하였습니다.
함수계산기 코딩을 위해 개인적으로 만든 코딩스크립트인 SimpleMath를 써서 ax^3+bx^2+cx+d=0 의 해를 구하는 함수를 만들었습니다.
만약 해가 없으면 -515151.515151을 반환하도록 설정했습니다.
먼저 도우미 함수 round6 를 만들었습니다.
이 함수는 숫자가 소숫점 아래로 너무 길게 늘어지지 않고 여섯자리까지만 표현되도록 하는 함수입니다.
def round6(value)=round(value*10^6)/10^6;
그 다음으로는 본격적으로 3차 방정식 해를 구하는 솔루션함수를 아래와 같이 만들었습니다.
이해할 수 있으신 분들은 읽어보셔도 좋지만 꼭 이해를 해야 하는것은 아닙니다. 함수 내부가 어떻게 되었느냐는 함수를 만든 사람의 몫이고 사용자는 함수가 뭐하는 용도인지만 알고 함수를 계산에 써먹으면 그만이니까요.
def solveEq3(a,b,c,d,x123){
var A=b/a;
var B=c/a;
var C=d/a;
var Q=(A^2−3*B)/9;
var R=(2*A^3−9*A*B+27*C)/54;
var M=R^2−Q^3;
if(M<0){
var angle=R/sqrt(Q^3);
var theta=acos(angle);
var x1=-(2*sqrt(Q)*cos(theta/3))−A/3;
var x2=-(2*sqrt(Q)*cos((theta+2*pi)/3))−A/3;
var x3=-(2*sqrt(Q)*cos((theta−2*pi)/3))−A/3;
if(x123==1){
return round6(x1);
}
elseif(x123==2){
return round6(x2);
}
return round6(x3);
}
elseif(M>0){
var sign=R/abs(R);
var inner=abs(R)+sqrt(M);
var S=-sign*cbrt(inner);
var T=Q/S;
var x1=S+T−A/3;
var bb=A+x1;
var cc=-C/x1;
var D=bb^2−4*cc;
var x2=-515151.515151;
var x3=-515151.515151;
if(D>=0){
if(x123==1){
return round6(x1);
}
elseif(x123==2){
return round6((-bb+sqrt(D))/2);
}
return round6((-bb−sqrt(D))/2);
}
return round6(x1);
}
else{
return -515151.515151;
}
}
영어이름의 함수가 친숙하지 않다면 기억하고 알아보기 쉽게 한글이름의 함수를 기존함수를 이용하여 아래와 같이 하나 더 만들 수 있습니다.
def 삼차방정식근(a,b,c,d,x123)=solveEq3(a,b,c,d,x123);
자 이제 과정과 내용을 설명을 하겠습니다...
먼저 ax^3+bx^2+cx+d=0 으로 주어진 원래 수식을 코딩에서는 계수 a를 1이 되도록 모든 항을 a로 나누어 주는 작업을 시작했습니다.
참고사이트 에서 x^3+Ax^2+Bx+C=0 의 형태를 염두에 두고 솔루션을 제공하고 있기때문에 거기에 맞춘것입니다.
이 함수의 목적은 실근을 구하는 것이기때문에 해가 없거나 허근인 경우에는 해가 없다는 신호를 주기위해 -515151.515151을 반환하도록 설정을 했습니다.
그 다음 이어지는 과정은 참고사이트에서 설명한 3차방정식 해를 구하는 방식을 코딩으로 구현해 놓은것입니다. 저도 그 사이트의 내용을 다 속속들이 이해한 것은 아니고 그냥 설명에 나온대로 구현을 해 놓은것 뿐입니다.
코딩부분을 몇 부분 설명하자면
*기호는 코딩할 때 사용되는 곱셈 기호입니다. 코딩에서는 곱셈기호로 ×를 사용하지 않습니다.
/기호는 코딩에서 사용되는 나눗셈 기호입니다.
코딩에서는 ÷ 기호는 사용되지 않습니다.
^기호는 여러 제곱을 할 때 연산하는 기호로 가령 2의 제곱은 2^2, 2의 3승은 2^3 으로 표현되는 연산기호입니다.
코딩에서 가잠 중요한 기호인 = 기호는 =기호 오른쪽에서 연산한 값을 = 기호 왼쪽에 있는 변수의 값으로 설정하라라는 의미입니다.
변수란 값을 가질 수 있는 이름들을 말하는데 = 기호를 통해서 이름에 값을 매기는 것입니다.
가령 사과=500 이라고 하면 사과라는 이름은 그 순간부터 500이란 값을 가지게 됩니다.
그래서 차후 계산시 사과+사과 를 하게 되면 1000이란 값이 나오게 됩니다.
코딩에서 = 기호는 수학에서의 = 기호와 뜻이 다르다는 것을 코딩을 처음 배우시는 분들은 반드시 기억해야 합니다.
코딩에서도 수학에서처럼 같다는 의미의 기호가 있는데 == 기호가 코딩에서 같다라는 뜻을 가진 기호입니다.
=기호가 두개 표기되는 기호이죠.
abs는 절대값을 연산하는 함수계산기가 제공하는 함수입니다.
sqrt는 함수계산기가 제공하는 제곱근 함수입니다.
cbrt는 함수계산기에 내장된 세제곱근 함수입니다.
var 는 변수를 처음 만들때 사용되는 변수선언 키워드이고 def는 함수를 처음 만들 때 사용되는 함수선언 키워드입니다
.
이제 함수를 실행해봅시다.
위 함수 3개를 모두 복사한 후 함수계산기의 공장페이지로 가서 페이지 오른쪽 상단에 점점점 메뉴버튼을 눌러 붙여넣기를 클릭해서 코드창에 코드를 붙여놓은 후 run버튼을 눌러 코드를 실행을 하고 save버튼을 눌러 실행된 함수를 DB에 저장하세요.
그 다음에 계산기 페이지로 와서 F2버튼을 누르면 방금 만든 함수를 선택해서 계산에 이용할 수 있습니다.
x^3-6x^2+11x-6=0의 해를 아래 그림3개와 같이 구할 수 있습니다.



이번에는 x^3-3x+1의 해를 구해봅시다.
해를 구하기위해서는
삼차방정식근(1,0,-3,1,1),
삼차방정식근(1,0,-3,1,2),
삼차방정식근(1,0,-3,1,3)
을 각각 계산하면 됩니다.
기억할것은 해가 -515151.515151이 나오면 방정식의 해가 없다는 뜻입니다.
왜냐하면 함수정의에서 그렇게 설정했기때문입니다.
아래 그림 3개는 각각에 대한 계산결과 입니다. chatgpt에게 점검을 받아보니 모두 정확한 답이라고 확인해주었습니다.



함수계산기의 프로그래밍 기능을 활용하여 수학이나 과학 공학용 계산을 할 수 있고 일상생활에서도 매우 유용하게 사용할 수 있습니다.