1

所以我遇到了一个问题,我需要使用 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 functioninMatlab来查找从 2000 到 3000 以 10 为增量的不同 q 值(在上面的示例中,q 是固定数字 2600)的 c 值,并绘制 x vs 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 的代码是否正确。

4

1 回答 1

1

myFunction您的代码的主要问题:

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

小问题:

  1. 你没用过k
  2. cArray(q)您在 while 循环中分配给;这只需要在循环运行后完成。

修正功能:

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

及其输出:

输出

于 2015-03-02T23:32:36.277 回答