본문 바로가기
헷갈릴만한 개념

단변수 함수 해 구하기(repeat()함수 사용) - in R

by JSMATH 2024. 3. 26.

다음 식이 주어졌다. 

보시는분들도 손으로 한번씩 풀어보세요.

 

저는 x+sin(pix)=5로 두고,

f:sin(pix)와 g:5-x로 분리해서 비교했습니다.

그리고 sin의 특성 [-1,1]안에 존재하는 것을 이용했습니다.

 

그래서 해가 뭐냐면요? 함수가 주는 정보가 여기까지라 알수가 없네요..

여러분은 손풀이로 가능하신가요? 

다만, 임의의값 x=4를 넣었을 때, sin4pi=1 이라는 맞지 않는 식을 얻게 됩니다. 하지만, 여기서 값을 점차 증가 시킨다면?

sin4.1111111pi = 5-4.1111111.. sin값은 커지는 추세이고, 우측 상수항은 점차 작아지는 추세입니다. 우리는 추측할 수 있죠. 결국엔 만나긴한다. 

그래프로 그려보겠습니다. 함수는 맨 위의 식을 사용했습니다.

> curve(x+sin(pi*x),from=0,to=10)
> abline(h=5,col="red")

손으로 풀 수 없는 방정식같은 경우는 보통 그래프를 그리는게 최우선입니다.

이제 저희가 손으로 풀기 어렵다는 것을 알았으니 코딩으로 접근해봅시다. 알고리즘의 힌트는 위에있습니다.

x값을 점차 증가시키거나 감소시키는거죠.

딱 봐도, 4보다 살짝 큰 곳에서 근을 가지는 것을 볼 수 있습니다. 그렇다면 x를 계~~~속 쪼~~~금씩 증가시켜서 반복 시키면서 그 함숫값이 상수5보다 커지는 상황이 온다면? 해를 구할 수 있지 않을까요?

코드는 아래와 같습니다.

#초기값 설정
>x<-4
> repeat{
+   if(x+sin(pi*x)-5>0) break
+   x<-x+0.0001
+ }
> x #4.2636
[1] 4.2636

첫번째 해는 4.2636이라고 구했습니다. 다음해는 무엇인지 어떻게 알까요? 최소 우리가 구한 4.2636부터 시작하면 근을 찾아갈 수 있을겁니다. 그리고? 함숫값 경계에 따라 x를 브레이크시켜주면 될겁니다.

x+sin(pi*x)-5>0라는 식을 살짝 변형시켜줍시다. => x+sin(pi*x)-5<0

왜냐하면, 이제는 5보다 큰 함수값들이니까 5보다 작은 함수값들로 진입하면 브레이크 해주면 되겠죠?

> repeat{
+   if(x+sin(pi*x)-5<0) break
+   x<-x+0.0001
+ }
> x #5
[1] 5.0001

마지막 하나의 근이 남았습니다. 이것도 위와같은 방식으로 해줍니다.

> repeat{
+   if(x+sin(pi*x)-5>0) break
+   x<-x+0.0001
+ }
> x #5.7365
[1] 5.7365

그래서 우리가 구한 x값은 (4.2636,5.0001,5.7365)들이 되겠네요. y는 x값을 저 함수식에다 넣어주면 뱉어줍니다.