I wrote this program (with a lot of help) that finds multiple roots using bisection. For example, this program found the first 10 roots of cos(5x). Now, I'm supposed to find and store the first 50 roots of
Where
= 50; L = 200; = 0.447; = 4.47
= 25; L= 200; = 0.748; = 1.875
= 15; L= 200; = 0.045; = 19.25
The instructions say: Now we must only modify the variable that determines the number of roots to find. We must also refine (i.e. improve) the bracket search algorithm so that roots that are not evenly spaced can be found. Test your algorithm by finding the roots for at least three different combinations of the parameters and L. How can you verify that your algorithm has not missed any of the roots? HINT: Consider the maximum frequency (dig back to that trig you forgot) to help determine the size of an appropriate bracket for this part of the problem.
(1) I only understand the first sentence of these instructions. How do I modify my program to find those 50 roots and, yes, how can I verify that my algorithm has not missed any of the roots?
(2) Also, could you please describe what each line of the main program is doing? I understand the subprogram, ‘bisection,' pretty well. I know the two programs are similar.
Main Program (for finding first 10 roots of cos(5x))
function root=multibisection(func,j,xtol,ftol)
xlower=0;
xupper=xlower+j;
ylower=feval(func,xlower); %takes func and evaluates xlower into that function
yupper=feval(func,xupper);
i=1;
while i<11
ylower=feval(func,xlower); %takes func and evaluates xlower into that function
yupper=feval(func,xupper);
if abs(ylower) root=xlower;
return
elseif abs(yupper) root=xupper;
return
end
while (yupper*ylower)>0
xlower=xupper;
xupper=xlower+j;
yupper=feval(func,xupper);
ylower=feval(func,xlower);
end
b=bisection(func,xlower,xupper,xtol,ftol);
roots(i)=b;
i=i+1;
xlower=b+j;
xupper=xlower+j;
end
roots
format long
Sub Program
function root=bisection(func,xlower,xupper,xtol,ftol)
xroot=(xlower + xupper)/2;
yroot=feval(func,xroot);
count=0;
while abs(yroot)>ftol;
ylower=feval(func,xlower); %takes func and evaluates xlower into that function
yupper=feval(func,xupper);
if ylower*yroot<0;
xupper=xroot;
yupper=yroot;
else
xlower=xroot;
ylower=yroot;
end
if abs(xupper-xlower) root=xroot;
return
end
root=xroot;
xroot=(xlower + xupper)/2;
yroot=feval(func,xroot);
count=count + 1;
if count>500 %max number of iterations
count
range=xupper-xlower
disp ('too many interval halvings, stopping ...')
root=xroot
return
end
end %ends the while loop
Line4 m-file
function y=line4(x)
y=cos(5*x);
Testing:
>> multibisection(@line4,0.314,1e-11,1e-11)
roots =
Columns 1 through 4
0.31415926533914 0.94247779608140 1.57079632675968 2.19911485721864
Columns 5 through 8
2.82743338823505 3.45575191891333 4.08407044967386 4.71238898037956
Columns 9 through 10
5.34070751111268 5.96902604181838