32 views (last 30 days)

Show older comments

Hello,

My function is as follows:

function root = NM(f, f1, x_0, epsilon, iteration)

x = zeros(1, 50);

x(1) = x_0;

count = 0;

while abs(f(x)) < epsilon

count = count + 1;

if count > iteration

break

end

x = x - f(x)/f1(x);

end

root = x;

end

Here's how I tried to test my function:

clear

syms t

x_0 = 2*pi/3;

epsilon = 0.0001;

iteration = 30;

v = @(t) sin(t);

vprime = matlabFunction(diff(v(t)));

root1 = NM(v, vprime, x_0, epsilon, iteration)

The loop does not seem to work, as the result I got was the initial value 2pi/3. What have I done wrong?

Adam Danz
on 23 Aug 2020

TADA
on 23 Aug 2020

You have two mistakes

1. while loop should work with a scalar condition, but as far as I know if you use a logical vector it will only enter the loop if all values are true:

% endless loop - as expected

while true

disp(rand(1));

end

% never enters loop - as expected

while false

disp(rand(1));

end

% endless loop

while [true true]

disp(rand(1));

end

% never enters loop

while [false true]

disp(rand(1));

end

% never enters loop

while [true false]

disp(rand(1));

end

So when you declared x as a vector 1x50 you booby trapped your loop. just initialize x to the x_0 value

x = x_0;

2. In your loop condition you checked if the value is smaller than the tolerance value instead of larger, so naturally it will never enter the loop unless by luck you started from zero:

while abs(f(x)) > epsilon T % should work

TADA
on 23 Aug 2020

your preallocation was fine, it could be improved by using the input of number of iterations as vector size (that is if the vector size correlated to number of iterations):

x = zeros(1, iteration);

The problem wasn't the preallocation though, the problem was how you used it later on

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

Start Hunting!