Newton's root finding method in MATLAB: quadratic vs cubic convergence
up vote
1
down vote
favorite
So I have this example Newton's method for root finding with quadratic convergence below. It takes a function f, the derivative of f df, initial guess g, and tolerance tol. It outputs the # iterations it to reach nth root, the root estimate r, and the error approximation err.
function [it, r, err] = QuadraticN(f, df, g , tol)
num_it = 20;
it_max = num_it + 1;
x(1)=(g + num_it)/2; %set x at n = 1
n = 1;
r = 0; % root
it = 0; % iteration #
err =0; % error
% n = 1
r(1) = x(1)-f(x(1))/df(x(1)); % root at n = 1
err(1) = abs(x(1)-g); % error at n = 1
% n > 1
while (min(abs(f(x(n))))) && (abs(x(n)-it_max)>tol) && (it < num_it)
x(n+1)=x(n)-f(x(n))/df(x(n)); % quadratic method
it_max=x(n); % reset counter
r= x(n); % set root to current at n
err = f(x(n)); % set error to current
it = n; % keep track of iterations
n=n+1; % increment to next n
end
end
Given this example, I am trying to implement a second version of the method that uses cubic convergence as opposed to quadratic and this is what I have (this is just the part of the function that would be changed to cubic, it takes the same inputs with the addition of ddf = the second derivative):
r(1) = x(1)-df(x(1))/ddf(x(1)) + (sqrt((df(x(1)))^2 -
2*f(x(1))*ddf(x(1)))) / ddf(x(1));
err(1) = abs(x(1)-g); % error at n = 1
while (min(abs(ddf(x(n))))) && (abs(x(n)-it_max)>tol) && (it < num_it)
cube = ((sqrt((df(x(n)))^2 - 2*f(x(n))*ddf(x(n)))) / ddf(x(n)));
first = x(n) - df(x(n))/ddf(x(n));
first = real(first); % is this right?
x(n+1) = first + (cube);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% FIX THIS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% check when to do plus or minus
if( first > 0)
x(n+1)=x(n)-df(x(n))/ddf(x(n)) + cube;
else
x(n+1)=x(n)-df(x(n))/ddf(x(n)) - cube;
% end
I'm not sure if I am checking when to use +/- cube correctly. I know it will depend on the multiplicity but I'm not sure if using first (Newton's basic method). It is outputting some of the roots correctly, but for instance for the equation -x^3 + 8 with initial guess 2 I am getting -9.85985274E-01. Now I don't know if this is part of the problem above or if converting to real before calculating is. I am also getting negative errors. I am checking in the same way as I did with quadratic but I am not sure if this is right.
algorithm matlab newtons-method cubic
add a comment |
up vote
1
down vote
favorite
So I have this example Newton's method for root finding with quadratic convergence below. It takes a function f, the derivative of f df, initial guess g, and tolerance tol. It outputs the # iterations it to reach nth root, the root estimate r, and the error approximation err.
function [it, r, err] = QuadraticN(f, df, g , tol)
num_it = 20;
it_max = num_it + 1;
x(1)=(g + num_it)/2; %set x at n = 1
n = 1;
r = 0; % root
it = 0; % iteration #
err =0; % error
% n = 1
r(1) = x(1)-f(x(1))/df(x(1)); % root at n = 1
err(1) = abs(x(1)-g); % error at n = 1
% n > 1
while (min(abs(f(x(n))))) && (abs(x(n)-it_max)>tol) && (it < num_it)
x(n+1)=x(n)-f(x(n))/df(x(n)); % quadratic method
it_max=x(n); % reset counter
r= x(n); % set root to current at n
err = f(x(n)); % set error to current
it = n; % keep track of iterations
n=n+1; % increment to next n
end
end
Given this example, I am trying to implement a second version of the method that uses cubic convergence as opposed to quadratic and this is what I have (this is just the part of the function that would be changed to cubic, it takes the same inputs with the addition of ddf = the second derivative):
r(1) = x(1)-df(x(1))/ddf(x(1)) + (sqrt((df(x(1)))^2 -
2*f(x(1))*ddf(x(1)))) / ddf(x(1));
err(1) = abs(x(1)-g); % error at n = 1
while (min(abs(ddf(x(n))))) && (abs(x(n)-it_max)>tol) && (it < num_it)
cube = ((sqrt((df(x(n)))^2 - 2*f(x(n))*ddf(x(n)))) / ddf(x(n)));
first = x(n) - df(x(n))/ddf(x(n));
first = real(first); % is this right?
x(n+1) = first + (cube);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% FIX THIS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% check when to do plus or minus
if( first > 0)
x(n+1)=x(n)-df(x(n))/ddf(x(n)) + cube;
else
x(n+1)=x(n)-df(x(n))/ddf(x(n)) - cube;
% end
I'm not sure if I am checking when to use +/- cube correctly. I know it will depend on the multiplicity but I'm not sure if using first (Newton's basic method). It is outputting some of the roots correctly, but for instance for the equation -x^3 + 8 with initial guess 2 I am getting -9.85985274E-01. Now I don't know if this is part of the problem above or if converting to real before calculating is. I am also getting negative errors. I am checking in the same way as I did with quadratic but I am not sure if this is right.
algorithm matlab newtons-method cubic
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
So I have this example Newton's method for root finding with quadratic convergence below. It takes a function f, the derivative of f df, initial guess g, and tolerance tol. It outputs the # iterations it to reach nth root, the root estimate r, and the error approximation err.
function [it, r, err] = QuadraticN(f, df, g , tol)
num_it = 20;
it_max = num_it + 1;
x(1)=(g + num_it)/2; %set x at n = 1
n = 1;
r = 0; % root
it = 0; % iteration #
err =0; % error
% n = 1
r(1) = x(1)-f(x(1))/df(x(1)); % root at n = 1
err(1) = abs(x(1)-g); % error at n = 1
% n > 1
while (min(abs(f(x(n))))) && (abs(x(n)-it_max)>tol) && (it < num_it)
x(n+1)=x(n)-f(x(n))/df(x(n)); % quadratic method
it_max=x(n); % reset counter
r= x(n); % set root to current at n
err = f(x(n)); % set error to current
it = n; % keep track of iterations
n=n+1; % increment to next n
end
end
Given this example, I am trying to implement a second version of the method that uses cubic convergence as opposed to quadratic and this is what I have (this is just the part of the function that would be changed to cubic, it takes the same inputs with the addition of ddf = the second derivative):
r(1) = x(1)-df(x(1))/ddf(x(1)) + (sqrt((df(x(1)))^2 -
2*f(x(1))*ddf(x(1)))) / ddf(x(1));
err(1) = abs(x(1)-g); % error at n = 1
while (min(abs(ddf(x(n))))) && (abs(x(n)-it_max)>tol) && (it < num_it)
cube = ((sqrt((df(x(n)))^2 - 2*f(x(n))*ddf(x(n)))) / ddf(x(n)));
first = x(n) - df(x(n))/ddf(x(n));
first = real(first); % is this right?
x(n+1) = first + (cube);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% FIX THIS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% check when to do plus or minus
if( first > 0)
x(n+1)=x(n)-df(x(n))/ddf(x(n)) + cube;
else
x(n+1)=x(n)-df(x(n))/ddf(x(n)) - cube;
% end
I'm not sure if I am checking when to use +/- cube correctly. I know it will depend on the multiplicity but I'm not sure if using first (Newton's basic method). It is outputting some of the roots correctly, but for instance for the equation -x^3 + 8 with initial guess 2 I am getting -9.85985274E-01. Now I don't know if this is part of the problem above or if converting to real before calculating is. I am also getting negative errors. I am checking in the same way as I did with quadratic but I am not sure if this is right.
algorithm matlab newtons-method cubic
So I have this example Newton's method for root finding with quadratic convergence below. It takes a function f, the derivative of f df, initial guess g, and tolerance tol. It outputs the # iterations it to reach nth root, the root estimate r, and the error approximation err.
function [it, r, err] = QuadraticN(f, df, g , tol)
num_it = 20;
it_max = num_it + 1;
x(1)=(g + num_it)/2; %set x at n = 1
n = 1;
r = 0; % root
it = 0; % iteration #
err =0; % error
% n = 1
r(1) = x(1)-f(x(1))/df(x(1)); % root at n = 1
err(1) = abs(x(1)-g); % error at n = 1
% n > 1
while (min(abs(f(x(n))))) && (abs(x(n)-it_max)>tol) && (it < num_it)
x(n+1)=x(n)-f(x(n))/df(x(n)); % quadratic method
it_max=x(n); % reset counter
r= x(n); % set root to current at n
err = f(x(n)); % set error to current
it = n; % keep track of iterations
n=n+1; % increment to next n
end
end
Given this example, I am trying to implement a second version of the method that uses cubic convergence as opposed to quadratic and this is what I have (this is just the part of the function that would be changed to cubic, it takes the same inputs with the addition of ddf = the second derivative):
r(1) = x(1)-df(x(1))/ddf(x(1)) + (sqrt((df(x(1)))^2 -
2*f(x(1))*ddf(x(1)))) / ddf(x(1));
err(1) = abs(x(1)-g); % error at n = 1
while (min(abs(ddf(x(n))))) && (abs(x(n)-it_max)>tol) && (it < num_it)
cube = ((sqrt((df(x(n)))^2 - 2*f(x(n))*ddf(x(n)))) / ddf(x(n)));
first = x(n) - df(x(n))/ddf(x(n));
first = real(first); % is this right?
x(n+1) = first + (cube);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% FIX THIS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% check when to do plus or minus
if( first > 0)
x(n+1)=x(n)-df(x(n))/ddf(x(n)) + cube;
else
x(n+1)=x(n)-df(x(n))/ddf(x(n)) - cube;
% end
I'm not sure if I am checking when to use +/- cube correctly. I know it will depend on the multiplicity but I'm not sure if using first (Newton's basic method). It is outputting some of the roots correctly, but for instance for the equation -x^3 + 8 with initial guess 2 I am getting -9.85985274E-01. Now I don't know if this is part of the problem above or if converting to real before calculating is. I am also getting negative errors. I am checking in the same way as I did with quadratic but I am not sure if this is right.
algorithm matlab newtons-method cubic
algorithm matlab newtons-method cubic
asked Nov 12 at 0:54
dgdgdg
61
61
add a comment |
add a comment |
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53254768%2fnewtons-root-finding-method-in-matlab-quadratic-vs-cubic-convergence%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown