# Performing calculations (Newton's method) over values in loop

10 views (last 30 days)
g on 9 Feb 2020
Commented: g on 10 Feb 2020
I am trying to perform Newton's method over a series of values given by the array p_init.
I am trying to perform Newton's method on the jth value, check if Newton's method was convergent within 10 iterations (indexed by i), then move onto the (j+1)th value. The Newton's method code itself works for one value, but it does not seem to be properly looping and initializing over the j values in my array. Where is my problem, or how can I properly accomplish this task? Thanks!
f = @(x) x^3 - x^2 - 6*x;
df = @(x) 3*x^2 - 2*x - 6;
p_init = -3:.1:4;
tol = 1e-12; n_iter = 10;
i = 1;
converge = false;
p0 = p_init(1);
for j = 1:length(p_init)
while i<=n_iter
p = p0-f(p0)/df(p0);
disp(p);
error = abs(p-p0);
if (error< tol)
converge = true; break
else
i = i+1;
p0 = p;
end
end
p0 = p_init(j);
% Here, I want to check convergence of my jth value
end

Jim Riggs on 9 Feb 2020
Yes, your loop is not quite right.
Notice your placement of the three lines
i=1;
converge = false;
po = p_init(1);
These three lines are brfore the loops, and thus, none of these three parameters ever gets reset.
This is why your loop does not work right.
After solving the first value, p0 never gets set to the next value, and i never gets reset to 1 for the next itteration.
Also, after the loop converges on an answer, you do not display or save the answer, so you won't know what it is.
f = @(x) x^3 - x^2 - 6*x;
df = @(x) 3*x^2 - 2*x - 6;
p_init = -3:.1:4;
tol = 1e-12;
n_iter = 10; % it's not a good ides to put more than one command on one line.
% i = 1; Move this inzide the "for" loop
% converge = false; This is not used for anything, so it is unneeded.
% if you want to use "converge" it needs to move inside the "while" loop too
% p0 = p_init(1); Move this inside the "for" loop
% create an array to save the solution data. 3 parameters will be saved
Sol = nan(3,numel(p_init));
for j = 1:length(p_init)
i=1; % initialize the "while" loop counter
p0=p_init(j); % set the initial value of p0
Sol(1,j) = p_init(j); % save the initial guess in "Sol"
while i<=n_iter
p = p0-f(p0)/df(p0);
disp(p);
error = abs(p-p0);
if (error< tol)
% converge = true; % this is never used.
Sol(2,j) = p0; % save the solution in
Sol(3,j) = i; % save the number of itterations
break % it's not a good ides to put more than one command on one line.
else
i = i+1;
p0 = p;
end
end
%p0 = p_init(j);
% Here, I want to check convergence of my jth value
end
At the end of this "while" loop, you have matrix "sol";
Sol(1,:) is the initial guess value
Sol(2,:) is the final solution value
Sol(3,:) is the number of itterations used to get the solution.
Notice that Sol(1,j) (the initial guess) is saved before entering the "for" loop. If the loop ends without finding a solution, them Sol(2,j) and Sol(3,j) wil be "nan", so you will know that convergence was not achieved for this guess within the itteration limit (n_iter).
g on 10 Feb 2020
Thank you very much!