Newton method 는 미분 가능한 연속 함수 f(x) 대하여 다음과 같은 방식으로 f(x) =0 해를 구하는 방법이다.

 

 

 

식에 대하여 Newton method 이용하여 f(x) =0 되는 실수 x 구해 보자.

 

식에 대한 미분 결과는 다음과 같다. 

 

Newton method 의 최대 반복 횟수는 100 회로 하고 상대 오차는 10-9 으로 설정 한 후 이를 만족하는 해를 찾아 본다.

 

MATLAB code 는 다음과 같다. 

 

 

command 창에서 결과를 확인 하면 Newton method 를 이용한 결과roots() 함수를 이용한 결과가 근사적으로 일치 함을 확인 할 수 있다. 



  1. 이상훈 2012.10.02 12:08

    감사합니다 ㅎㅎ

  2. 2013.04.03 21:06

    비밀댓글입니다

    • 남성 2013.04.03 21:10 신고

      도움되셨다니 다행이네요~ 방문해 주셔서 감사합니다. ^^

  3. 민경원 2014.02.11 17:35

    fprintf 에서 에러가 나는데요?
    Error using fprintf
    Function is not defined for 'sym' inputs.

    Error in Untitled (line 23)
    fprintf('Estimated x : %10.7f \n', x)

    • 남성 2014.02.12 03:16 신고

      방문자 님이 작성하신 코드를 봐야 답변 드릴 수 있을것 같네요.

  4. LU 2015.09.26 16:01

    혹시 그래프 표현은 어떻게 하나요...

    • 남성 2015.09.26 18:03 신고

      수렴되는 모습에 대한 그래프 말씀하시는건가요? 수렴되는 모습이라면 일단 f(x) 에 대한 그래프를 하나 그려 놓은 다음에 while 문 내에서 x,f(x) 의 값을 그래프로 나타내면 되겠죠.

  5. 준트랩 2015.09.30 00:02

    %%수식 정의
    syms x
    f= x^3-x^2-x-1;
    diff_f=diff(f,x);
    N_steps= 0;
    x = 1.5;
    required_error= 1e-3;
    estimated_error= 1;
    N_iter= 100;

    while estimated_error > required_error && (N_steps < 30)
    xold = x;
    x = x - subs(f,x)/subs(diff_f, x);
    N_steps = N_steps + 1;
    disp( [x subs(f,x)] )
    estimated_error = abs((x-xold)/x);
    end

    fprintf('Estimated x: %10.7f \n', x)

    roots_result=roots([4 3 2 1])


    이렇게 적고 실행시키려는데

    다음 사용 중 오류가 발생함: fprintf
    'sym' 입력값에 대해 함수가 정의되지 않았습니다.

    이렇게 에러가 뜨네요 어떻게 수정해야할까요?

    • 남성 2015.09.30 01:08 신고

      예전 버전에서는 문제 없이 됐었는데 최신 버전에서는 syms 사용 중에 문제가 있군요. 정확히 왜 그런지는 모르겠지만 다음과 같이 변경해주니 정상적으로 동작은 되더군요.

      fprintf('Estimated x: %g \n', double(x))

      아마도 x 값이 rational 형태로 표현되면서 뭔가 에러가 있는것 같습니다. double 로 변환하니 정상적으로 동작합니다.

  6. 공도리 2015.09.30 18:45

    게시글 잘 보았습니다 ^^ 뉴턴랩슨법을 매틀랩으로 풀다가 방문하게 되었어요.
    혹시 f1=x1^2+x2^2-x1=0 f2=x1^2-x2^2-x2=0
    에서 초기치는 x1=0.7, x2=0.5로 주어져있는데
    위의 두 방정식을 뉴턴 랩슨법으로 풀기 위해서는 어떤 방식으로 위의 방법을 적용시켜야 할 지 여쭈어 보고 싶습니다..!
    변수가 두개에다가 연립방정식이다 보니 어떻게 적용해야 할지 감이 오지 않네요...
    답변 부탁드립니다!

    • 남성 2015.09.30 21:39 신고

      아래 주소에 포스팅 했습니다.

      http://iamaman.tistory.com/1659

    • 공도리 2015.10.01 12:45

      앗 감사합니다..! 잘 참고할게요

  7. 공대생 2016.03.14 23:25

    감사합니다 큰 도움 되었어요

    • 남성 2016.03.15 20:23 신고

      도움되었다니 다행이네요. 방문해 주셔서 감사합니다. ^^

  8. 기계 2017.05.24 09:11

    좋은글 잘보고 있습니다.
    한가지 궁금한게있는데, 매트랩 명령어 중에 몇번째줄로 돌아가라는 명령어가있을까요?

    예를 들어서 해를구해야되는데 수렴하지 않고 발산할때 일정 iter을 넘게되면 초기값을 다시 설정해주는프로그램을 짜려고하는데, 2번째줄에 초기치를 정해주는 명령어가있다면 그 줄로 돌아가라는..

    • 남성 2017.05.24 09:38 신고

      MATLAB 에 goto 같은 명령어는 없습니다. iteration 부분을 함수 등으로 작성해서 다시 시작하게 설정하는게 좋을듯 합니다.

  9. 헤헤 2017.06.01 10:20

    식을 똑같이 해서 2차식을 풀려고 하는데 function 기능을 써서
    임의의 값을 넣었을때 뉴턴법으로 푸는걸 만들려고 하는데
    3차식일때는 초기값이 바뀌어도 값은 근사하게 나왔는데
    2차식이 되면 초기값에 따라 근 값이 바뀌고. 근사하게도 안나와요
    어떻게 해야할까요?

    • 남성 2017.06.01 18:22 신고

      글쎄요... 질문만 봐서는 저도 이유를 잘 모르겠네요.

    • 헤헤 2017.06.08 21:26

      function y=asdd(a, b, c, x0)
      syms x
      y= a.*x.^2+b.*x+c;
      diff_y=diff(y,x);
      N_steps=0; %반복횟수
      x=x0; %x의 초기값
      last_error=0.000001; %이것보다 오차가 작아야한다.
      first_error=1; %처음 오차
      N_iter=100;

      while first_error > last_error && (N_steps<30);
      xold=x;
      x=x-subs(y,x)/subs(diff_y,x);
      N_steps=N_steps+1;
      disp([x subs(y,x)])
      estimated_error=abs((x-xold)/x);
      end
      fprintf('Estimated x, %10.7f\n',x)
      roots_y=roots([a b c])



      이렇게 했는데 root한 거랑 값이 좀 많이 달라서요.
      어떻게 해야할까요?

    • 남성 2017.06.09 02:08 신고

      일단 최대 반복 횟수를 한번 늘려 보세요.
      while 문에는 (N_steps<30) 에서 30 이란 숫자를 100 이나 안되면 그 이상으로 늘려보시는게 좋을 겁니다.

  10. 급ㅠ 2018.06.11 18:23

    1. matlab을 활용하여 2차시스템에서 상승시간(tr)과 zeta와의 관계를 찾는것

    2. matlab을 활용하여 1번에서 구한것을 이를 최소자승법으로 관계를 찾는것
    이것을해야하는데 도대체어떻게해야하는지..건드릴수가없네요...도와주실수잇을까요??

    • 남성 2018.06.11 18:33 신고

      아니요. 숙제는 도와 드리기 힘들 것 같습니다.

    • 급ㅠ 2018.06.11 18:57

      관리자의 승인을 기다리고 있는 댓글입니다

  11. 안녕하세요 2018.06.12 11:25

    관리자의 승인을 기다리고 있는 댓글입니다

  12. 성민 2018.06.12 15:31

    관리자의 승인을 기다리고 있는 댓글입니다

+ Recent posts