Bisection Method Code MATLAB

1,454 ビュー (過去 30 日間)
Emmanuel Pardo-Cerezo
Emmanuel Pardo-Cerezo 2019 年 10 月 4 日
回答済み: Prosun 2024 年 9 月 24 日
Problem 4 Find an approximation to (sqrt 3) correct to within 10−4 using the Bisection method (Hint: Consider f(x) = x 2 − 3.) (Use your computer code)
I have no idea how to write this code. he gave us this template but is not working. If you run the program it prints a table but it keeps running. for some reason the program doesnt stop.
tol = 1.e-10;
a = 1.0;
b = 2.0;
nmax = 100;
% Initialization
itcount = 0;
error = 1.0;
% Graph of the function
xval = linspace(a,b,100);
for i=1:100
fval(i) = func(xval(i));
end
plot(xval,fval);
grid on;
hold on;
% iteration begins here
while (itcount <= nmax && error >= tol)
itcount = itcount + 1;
% Generate and save iteratres
x = a + (b-a)/2;
z(itcount) = x;
fa = func(a);
fb = func(b);
fx = func(x);
error = abs(fx);
% error = abs(x - xold);
if (error < tol)
x_final = x;
else
if (fa*fx < 0)
% root is between a and x
b = x;
else
% root is between x and b
a = x;
end
end
plot(z(1:itcount),zeros(itcount,1),'r+');
pause(5)
end
if (itcount < nmax);
val = func(x);
fprintf(1,'Converged solution after %5d iterations',itcount);
fprintf(1,' is %15.7e, %e \n',x_final, val);
else fprintf(1,'Not converged after %5d iterations',nmax);
end
function val = func(x)
%val = x^3 + 4 * x^2 - 10;
val = x^3 - x - 3;
%val = sin(x);
end
  3 件のコメント
Aristi Christoforou
Aristi Christoforou 2021 年 4 月 14 日
function[x]=bisect(m)
a=1;
b=3;
k=0;
while b-a>eps*b
x=(a+b)/2
if x^2>m
b=x
else
a=x
end
k=k+1
end
Uttsa
Uttsa 2024 年 7 月 3 日
Whats the use of "eps" can you elaborate?

サインインしてコメントする。

回答 (6 件)

David Hill
David Hill 2019 年 10 月 4 日
function c = bisectionMethod(f,a,b,error)%f=@(x)x^2-3; a=1; b=2; (ensure change of sign between a and b) error=1e-4
c=(a+b)/2;
while abs(f(c))>error
if f(c)<0&&f(a)<0
a=c;
else
b=c;
end
c=(a+b)/2;
end
Not much to the bisection method, you just keep half-splitting until you get the root to the accuracy you desire. Enter function above after setting the function.
f=@(x)x^2-3;
root=bisectionMethod(f,1,2);
  1 件のコメント
Justin Vaughn
Justin Vaughn 2022 年 10 月 10 日
Thank you for this because I was not sure of how to easily send a functino into my method's function. yours helped tremendously!

サインインしてコメントする。


SHUBHAM GHADOJE
SHUBHAM GHADOJE 2021 年 5 月 29 日
編集済み: Walter Roberson 2024 年 7 月 12 日
function c = bisectionMethod(f,j,k,error)
%f=@(x)x^2-3;
%j=1;
%k=2;
%(ensure change of sign between a and b)
%error=1e-4
c=(j+k)/2;
while abs(f(c))>error
if f(c)<0&&f(a)<0
j=c;
else
k=c;
end
c=(j+k)/2;
end

Prathamesh Purkar
Prathamesh Purkar 2021 年 6 月 6 日
編集済み: Walter Roberson 2021 年 12 月 3 日
tol = 1.e-10;
a = 1.0;
b = 2.0;
nmax = 100;
% Initialization
itcount = 0;
error = 1.0;
% Graph of the function
xval = linspace(a,b,100);
for i=1:100
fval(i) = func(xval(i));
end
plot(xval,fval);
grid on;
hold on;
% iteration begins here
while (itcount <= nmax && error >= tol)
itcount = itcount + 1;
% Generate and save iteratres
x = a + (b-a)/2;
z(itcount) = x;
fa = func(a);
fb = func(b);
fx = func(x);
error = abs(fx);
% error = abs(x - xold);
if (error < tol)
x_final = x;
else
if (fa*fx < 0)
% root is between a and x
b = x;
else
% root is between x and b
a = x;
end
end
plot(z(1:itcount),zeros(itcount,1),'r+');
pause(5)
end
if (itcount < nmax);
val = func(x);
fprintf(1,'Converged solution after %5d iterations',itcount);
fprintf(1,' is %15.7e, %e \n',x_final, val);
else
fprintf(1,'Not converged after %5d iterations',nmax);
end
function val = func(x)
%val = x^3 -x + 1;
val = x^3 -x + 1;
%val = sin(x);
end

narendran
narendran 2022 年 7 月 2 日
5cosx + 4.5572 -cos30cosx-ssin30sinx
  3 件のコメント
Walter Roberson
Walter Roberson 2022 年 7 月 2 日
syms x
y = 5*cos(x) + 4.5572 - cos(30)*cos(x)-sin(30)*sin(x)
y = 
fplot(y, [-20 20]); yline(0)
vpasolve(y,x)
ans = 
Walter Roberson
Walter Roberson 2024 年 7 月 3 日
Note by the way that cos(30) is cos of 30 radians. It seems unlikely that is what is desired.

サインインしてコメントする。


Aman Pratap Singh
Aman Pratap Singh 2021 年 12 月 3 日
編集済み: Walter Roberson 2021 年 12 月 3 日
f = @(x)('x^3-2x-5');
a = 2;
b = 3;
eps = 0.001;
m = (a+b)/2;
fprintf('\nThe value of, after bisection method, m is %f\n', m);
while abs(b-a)>eps
if (f(a)*f(m))<0
b=m;
else
a=m;
end
m = (a+b)/2;
end
fprintf('\nThe value of, after bisection method, m is %f\n', m);
  1 件のコメント
Walter Roberson
Walter Roberson 2021 年 12 月 3 日
f = @(x)('x^3-2x-5');
That means that f will become a function handle that, given any input, will return the character vector ['x', '^', '3', '-', '2', 'x', '-', '5'] which is unlikely to be what you want to have happen.
f(0)
ans = 'x^3-2x-5'
f(1)
ans = 'x^3-2x-5'
f(rand(1,20))
ans = 'x^3-2x-5'

サインインしてコメントする。


Prosun
Prosun 2024 年 9 月 24 日
% Clearing Screen
clc
% Setting x as symbolic variable
syms x;
% Input Section
y = input('Enter non-linear equations: ');
a = input('Enter first guess: ');
b = input('Enter second guess: ');
e = input('Tolerable error: ');
% Finding Functional Value
fa = eval(subs(y,x,a));
fb = eval(subs(y,x,b));
% Implementing Bisection Method
if fa*fb > 0
disp('Given initial values do not bracket the root.');
else
c = (a+b)/2;
fc = eval(subs(y,x,c));
fprintf('\n\na\t\t\tb\t\t\tc\t\t\tf(c)\n');
while abs(fc)>e
fprintf('%f\t%f\t%f\t%f\n',a,b,c,fc);
if fa*fc< 0
b =c;
else
a =c;
end
c = (a+b)/2;
fc = eval(subs(y,x,c));
end
fprintf('\nRoot is: %f\n', c);
end

カテゴリ

Help Center および File ExchangeNumbers and Precision についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by