Bisection method not working. Is my code heading in the right direction?

4 vues (au cours des 30 derniers jours)
Erik Ramirez
Erik Ramirez le 15 Sep 2019
Commenté : Erik Ramirez le 16 Sep 2019
x=sym('x');
endpoint_a = input('Plese input your endpoint a: ');
endpoint_b = input('Plese input your endpoint b: ');
tol = input('Plese input your tolerance: ');
n_0 = input('Plese input your maximum iterations : ');
F= input('Plese input your equation : ');
N=0;
a=subs(F,x,endpoint_a);
b=subs(F,x,endpoint_b);
% p= (subs(F,x,endpoint_a)+subs(F,x,endpoint_b))/2;
while(N <= n_0 && not(abs((endpoint_a-endpoint_b)/2) <= tol ))
N= N + 1;
p = (subs(F,x,endpoint_a)+subs(F,x,endpoint_b))/2;
p=b;
if (a*b) > 0
a=p;
else
endpoint_b=p;
end
end

Réponses (1)

John D'Errico
John D'Errico le 15 Sep 2019
I had to laugh, as I recognized your coding style from a previous question. Then I remembered your name. Note that
not(abs((endpoint_a-endpoint_b)/2) <= tol)
is the logical equivalent of the simpler
abs((endpoint_a-endpoint_b)/2) > tol
There is no need to make things more complicated than they need be.
Ok, given that, you are making a reasonable effort in these. Your problem in this one is an error of thought. You compute this:
p = (subs(F,x,endpoint_a)+subs(F,x,endpoint_b))/2;
The bisection method wants to evaluate the functino F at the midpoint of the current interval. So it needs to compare the values of F(a), f(b), and the value at the midpoint, thus F((a+b)/2).
What did you do? You computed the new point p as (F(a) + F(b))/2.
Next, you don't want to test if a*b is less than zero! In fact, here a and b are not even defined in your code. You do want to test if F(a)*F(b) is less than zero. That ensures that F(a) and F(b) have different signs.
So, you are going in a reasonable directino in this code. Not there yet. I think you can fix this, as your basic logic in the code is not bad. So try again, and show what you have if there is still a problem. I have confidence that you will get this right though on your own, with just a small nudge or two.
  1 commentaire
Erik Ramirez
Erik Ramirez le 16 Sep 2019
x=sym('x');
endpoint_a = input('Plese input your endpoint a: ');
endpoint_b = input('Plese input your endpoint b: ');
tol = input('Plese input your tolerance: ');
n_0 = input('Plese input your maximum iterations : ');
F= input('Plese input your equation : ');
g=(endpoint_a + endpoint_b)/2;
N=0;
a=subs(F,x,endpoint_a);
b=subs(F,x,endpoint_b);
%p= (subs(F,x,endpoint_a)+subs(F,x,endpoint_b))/2;
%p = subs(F,x,g);
p = subs(F,x,g);
while(N <= n_0 && abs((endpoint_a-endpoint_b)/2) > tol )
N= N + 1;
p = subs(F,x,g);
g=p;
if a*b < 0
a=p;
else
b=p;
end
end
p
i changed the (f(a)+f(b))/2 to f((a+b)/2)
and i did f(a)*f(b) is less than zero.[a=subs(F,x,endpoint_a] and [b=subs(F,x,endpoint_b)]
now im getting an error in this loop. I cant figure out the issue. For the "if" loop is it not a=p and b=p?

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Produits


Version

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by