我是MATLAB新手,在分配时遇到问题。分配使用二等分法。我的原始代码是:
order_updates.id
但是,我需要计算它进行的迭代次数,因此我将代码的第二部分(在“二等分”之后)更改为:
a = -0.5;
b = 1.1;
f=@(x) x^5-2*x^4+3*x^3-2*x^2+x-1-cos(30*x);
val1 = f(a);
val2 = f(b);
p1a1 = val1*val2;
save('A1.dat','p1a1','-ascii')
%bisection
for i = 0:100
c = (a+b)/2;
if f(c) >= -0.000000001 && f(c) <= 0.000000001
answer = c;
elseif f(c) > 0
b = c;
else a = c;
end
end
answer = c;
save('A2.dat','answer','-ascii')
在规定的公差范围内,c表示该功能的零点。但是,新代码将无法运行,而且我似乎无法弄清楚哪里出了问题。抱歉,这很简单
答案 0 :(得分:1)
您不是在循环内更新c
的值,它永远不会改变,这意味着您陷入了while
循环中。与之前一样,将c = (a+b)/2
定义复制到循环内部。
c = (a+b)/2;
while abs(f(c))>tolerance
count=count+1;
if f(c) > 0
b = c;
else
a = c;
end
c = (a+b)/2; % <<<<<< This is needed to avoid an infinite loop!
end
answer = c;
二等分方法可以保证收敛到根(如果存在),但是对于数字方法,请注意使用while
循环。特别是,添加一个最大迭代计数器
maxIters = 1000;
c = (a+b)/2;
while abs(f(c)) > tolerance && count < maxIters
% Code as before ...
end