2013-10-08 71 views
0

我試圖用Matlab中的二分法找到方程的根,因爲q以10步間隔從2000-3000變化。然而,我的代碼並沒有打印出一個圖表,即使我有一個plot聲明,我認爲它創建了一個無限循環,因爲當我運行它時,matlab說繁忙,除非強制關閉,否則我無法關閉該程序。我看不到任何會導致此問題的代碼,有人可以幫我解決嗎?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

嘗試增加,僅僅低於我的T(I)的字符線=平分(F ...)和運行該功能。然後,每次迭代,您都可以看到循環計數器打印到MATLAB命令窗口中。它是做你期望的嗎?它會*真的*緩慢嗎?這是否告訴你什麼? –

+0

我實際上試過這樣做:'fprintf('%i',i);'並沒有打印 –

+0

它不會卡在for循環中,它會卡在while循環中,很確定。你可以刪除for循環,它不會改變行爲。你的函數f是否有根?我想這與你的功能有關......或者你的初始值選擇不當。 – thewaywewalk

回答

2

你的錯誤是在這裏:

c = (a-b)/2; 

您初始化a=20b=40c最初設置爲-10。但是,你真的想c是半路ab之間,這意味着你要:

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

神奇,謝謝。我完全忽略了當複製我的舊對分法時。 –

0

此外,添加一個drawnow後,您繪製語句強制MATLAB繪製圖形。

+0

我補充說,它仍然產生相同的結果,沒有圖。我的猜測是,它陷入了for循環,但我不知道爲什麼 –