fyec
fyec

Reputation: 150

Newton's Method in Matlab

I am trying to apply Newton's method in Matlab, and I wrote a script:

syms f(x)
f(x) = x^2-4
g = diff(f)
x_1=1 %initial point
while f(['x_' num2str(i+1)])<0.001;% tolerance
    for i=1:1000 %it should be stopped when tolerance is reached
       ['x_' num2str(i+1)]=['x_' num2str(i)]-f(['x_' num2str(i)])/g(['x_' num2str(i)])
    end
end

I am getting this error:

   Error: An array for multiple LHS assignment cannot contain M_STRING.

Newton's Method formula is x_(n+1)= x_n-f(x_n)/df(x_n) that goes until f(x_n) value gets closer to zero.

Upvotes: 0

Views: 2957

Answers (1)

TroyHaskin
TroyHaskin

Reputation: 8401

All of the main pieces are present in the code present. However, there are some problems.

The main problem is assuming string concatenation makes a variable in the workspace; it does not. The primary culprit is this line is this one

['x_' num2str(i+1)]=['x_' num2str(i)]-f(['x_' num2str(i)])/g(['x_' num2str(i)])

['x_' num2str(i+1)] is a string, and the MATLAB language does not support assignment to character arrays (which is my interpretation of An array for multiple LHS assignment cannot contain M_STRING.).

My answer, those others' may vary, would be

  1. Convert the symbolic functions to handles via matlabFunction (since Netwon's Method is almost always a numerical implementation, symbolic functions should be dropper once the result of their usage is completed)
  2. Replace the string creations with a double array for x (much, much cleaner, faster, and overall better code).
  3. Put a if-test with a break in the for-loop versus the current construction.

My suggestions, implemented, would look like this:

syms f(x)
f(x) = x^2-4;
g = diff(f);

f = matlabFunction(f);
g = matlabFunction(g);

nmax = 1000;
tol = 0.001;% tolerance
x = zeros(1, nmax);
x(1) = 1; %initial point

fk = f(x(1));
for k = 1:nmax
    if (abs(fk) < tol)
        break;
    end

    x(k+1) = x(k) - f(x(k))/g(x(k));
    fk = f(x(k));

end

Upvotes: 1

Related Questions