10 views (last 30 days)

Hi,

I wrote a simple code for Newton's Method in two variables but am having some trouble debugging it. Here's the message I get:

Index exceeds matrix dimensions.

Error in Root_finding_practice>@(x)[cos(x(2)),-x(1)*sin(x(2));x(2)*cos(x(1)),sin(x(1))]

Error in Root_finding_practice (line 34)

x(i+1) = x(i) - ( inv( J( x(i) ) ) * f( x(i) ) );

The function file code is:

function F = nonlinear_equations(x)

F(1) = x(1) * cos( x(2) );

F(2) = x(2) * sin( x(1) );

end

and the script file code is:

f = @(x) nonlinear_equations;

% Jacobian

J = @(x) [ cos( x(2) ), -x(1)*sin(x(2));

x(2) * cos(x(1)), sin(x(1)) ];

x = [ 1, 1 ];

for i = 1:1000 % it should be stopped when tolerance is reached

x(i+1) = x(i) - ( inv( J( x(i) ) ) * f( x(i) ) );

if( abs( f( x(i+1) ) ) < 0.0001 ) % tolerance

disp(double(x(i+1)));

break;

end

end

What am I missing? I suspect it's the way I've defined the Jacobian anonymous function ...

Thanks,

Ameer Hamza
on 21 Sep 2020

Edited: Ameer Hamza
on 21 Sep 2020

Check this code

f = @(x) nonlinear_equations(x);

% Jacobian

J = @(x) [cos( x(2) ), -x(1)*sin(x(2));

x(2)*cos(x(1)), sin(x(1))];

x = [1; 1];

for i = 1:1000 % it should be stopped when tolerance is reached

x(:,i+1) = x(:,i) - inv(J(x(:,i)))*f(x(:,i));

if( abs(f(x(:, i+1))) < 0.0001) % tolerance

disp(double(x(:, i+1)));

break;

end

end

function F = nonlinear_equations(x)

F = zeros(2, 1);

F(1) = x(1) * cos( x(2) );

F(2) = x(2) * sin( x(1) );

end

Opportunities for recent engineering grads.

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

Start Hunting!
## 0 Comments

Sign in to comment.