在matlab中绘制bisect方法

时间:2013-10-03 00:36:18

标签: matlab

所以我遇到了一个问题,我需要使用bisect方法找到根:

功能:

function [ c,k ] = 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

脚本:

f = @(x) (((1800).*log((160000)./(160000 - (x.*2600))) - (9.812).*x)./750) - 1;

a = 10;
b = 50;
tol = 1e-4;

[root, iter] = bisect(f,a,b,tol);
fprintf(' iterations = %i root = %15.10e ' ,iter, root);

这非常有效,现在我需要在embedded function中使用Matlab来查找q的不同值的c值(在上面的例子中q是固定数字2600)从2000到以10为增量的3000并绘制x与q的关系。为此,我有以下脚本:

function myFunction

h = 10; 
a = 10;
b = 50;
tol = 1e-4;

    function y = f(x)
        y = (((1800).*log((160000)./(160000 - (x.*q))) - (9.812).*x)./750) - 1;
    end
        for q = (2000:h:3000)
            k=0;
            while b-a > tol
                c=(a+b)/2;
                if sign(f(c)) == sign(f(b))
                    b=c;
                    cArray(q) = c;
                else
                    a=c;
                    cArray(q) = c;
                end
                k=k+1;
            end
        end
        plot(q,cArray)
end

此代码没有错误,但是当我运行它时没有图表。有人可以帮我解决这个问题吗?我甚至不知道我的代码找到c vs q是否正确。

1 个答案:

答案 0 :(得分:1)

您的myFunction代码存在的主要问题:

  1. 应在for循环内重置端点a,b,以便重新开始根搜索。
  2. q中使用cArray(q)作为索引会导致对于低于2000的索引使用零填充过大的数组。您需要一个索引变量来跟踪该数组。 (我使用下面的j
  3. plot(q,cArray)应为plot(2000:h:3000,cArray),因为q不是数组,而是标量。
  4. 小问题:

    1. 您从未使用k
    2. 您在while循环中分配给cArray(q);这只需要在循环运行后完成。
    3. 更正功能:

      function myFunction
      h = 10;
      tol = 1e-4;
          function y = f(x)
              y = (((1800).*log((160000)./(160000 - (x.*q))) - (9.812).*x)./750) - 1;
          end
      
      j = 0;
      for q = 2000:h:3000
          a = 10;
          b = 50;
          while b-a > tol
              c=(a+b)/2;
              if sign(f(c)) == sign(f(b))
                  b=c;
              else
                  a=c;
              end
          end
          j=j+1;
          cArray(j)=c;
      end
      plot(2000:h:3000,cArray)
      end
      

      及其输出:

      output