2013-10-08 47 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循环,但我不知道为什么 –