所以我遇到了一个问题,我需要使用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是否正确。
答案 0 :(得分:1)
您的myFunction
代码存在的主要问题:
for
循环内重置端点a,b,以便重新开始根搜索。q
中使用cArray(q)
作为索引会导致对于低于2000的索引使用零填充过大的数组。您需要一个索引变量来跟踪该数组。 (我使用下面的j
)plot(q,cArray)
应为plot(2000:h:3000,cArray)
,因为q
不是数组,而是标量。 小问题:
k
cArray(q)
;这只需要在循环运行后完成。 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
及其输出: