2013-10-08 1 views
0

방정식의 근원을 찾기 위해 Matlab에서 이분법을 사용하려고합니다. q은 10-3 단계에서 2000-3000까지 다양합니다. 내 코드는 비록 비록 내가 plot 문을 가지고있는 그래프를 인쇄하지 않습니다 그리고 내가 그것을 실행하면 무한 루프를 만드는 것 같아요. 그리고 내가 강제로 닫지 않으면 프로그램을 닫을 수 없다. 내 코드에서이 문제를 일으킬만한 것을 볼 수 없지만 누군가 나를 도울 수 있습니까?Matlab은 플롯하지 않고 끝없는 루프

function myFunction 

a = 20; 
b = 40; 
tol = 1e-4; 
q = 2000:10:3000; 
t = zeros(101,1); 

for i=(1:length(q)) 
    f = @(x) (((1800).*log((160000)./(160000 - (x.*q(i)))) - (9.812).*x)./750) - 1; 
    t(i) = bisect(f,a,b,tol); 
end 

figure(1) 
plot(q,t) 

    function c=bisect(f,a,b,tol) 
     k=0; 
     while b-a > tol 
      c = (a-b)/2; 
      if sign(f(c)) == sign(f(b)) 
       b=c; 
      else 
       a=c; 
      end 
      k=k+1; 
     end 
    end 
end 

그것은 또한 내가 전에이 bisect 방법을 사용하고 그렇게 나는 문제가 그 기능을 생각하지 않는다 작동 않음을 유의해야한다.

+0

시도 단지 i를 t (I) 아래의 문자가있는 줄을 추가 = 양분 (F, ...) 및 함수를 실행하십시오. 그런 다음 매 반복마다 루프 카운터가 MATLAB 명령 창에 인쇄되는 것을 볼 수 있습니다. 당신이 기대하는대로하고 있습니까? 정말 천천히가는거야? 그게 당신에게 뭐라고 말합니까? –

+0

실제로 그것을 추가하여 시도 :'fprintf ('% i', i);'아무 것도 출력하지 않습니다. –

+0

for 루프에서 멈추지 않고 while 루프에서 멈추게됩니다. for 루프는 제거 할 수 있으며 동작을 변경하지는 않습니다. 함수 f가 루트를 가지고 있습니까? 나는 그것이 당신의 기능과 관련이 있다고 생각합니다 ... 아니면 초기 값이 적절하게 선택되지 않았습니다. – thewaywewalk

답변

2

귀하의 오류가 여기에 있습니다 :

c = (a-b)/2; 

당신은 a=20b=40를 초기화합니다. c은 처음에 -10으로 설정됩니다. 하지만 당신이 정말로 당신이 원하는 의미 cab 사이가되고 싶어요 :

c = (a+b)/2; 
+0

환상적입니다. 감사합니다. 나는 옛날의 이등분법을 복사 할 때 그것을 간과했다. –

0

또한 그림을 그릴 때 MATLAB이 그래픽을 그리도록 명령을 내린 직후에 drawnow을 추가하십시오.

+0

나는 그것을 덧붙였지만 여전히 그래프와 같은 결과를 산출한다. 내 생각 엔 for 루프에 갇혀 있지만 그 이유는 모르겠다. –