exp(2 x₁) –x₂ -4 =0.0
x₂ – x₃² -1 =0.0
x₃ – sin x₁ =0.0
Solution:
The following program is developed in MATLAB to implement the Newton-Raphson algorithm. A function named "newtonraphson" is created, which applies the technique.
% Newton-Raphson method applied to a system of non-linear equations f(x)=0,
% given the jacobian function J, where J = del(f1,f2,...,fn)/del(x1,x2,...,xn)
% and x=[x1;x2;...;xn], f=[f1;f2;...;fn]; x0 is the initial guess to run
% the program for solution
function [x,iteration] = newtonraphson(x0,f,J)
N = 100; % Maximum number of iterations definition
epsilon = 1e-15; % Tolerance Definition
maxvalue = 10000.0; % Definition of value for divergence
xxx = x0; % Initial guess for the solution
while (N>0)
JJJ = feval(J,xxx); % "feval" is used here to evaluate functions
if abs(det(JJJ))<epsilon
error('newtonraphson - Jacobian is singular - consider new x0');
abort;
end;
xn = xxx - inv(JJJ)*feval(f,xxx); % Newton-Raphson algorithm in matrix form
if abs(feval(f,xn))<epsilon
x=xn;
iteration = 100-N;
return;
end;
if abs(feval(f,xxx))>maxvalue
iteration = 100-N;
disp(['iterations = ',num2str(iteration)]);
error('Solution diverges');
abort;
end;
N = N - 1;
xxx = xn;
end;
error('No convergence after 100 iterations.');
abort;
end % Function end
% given the jacobian function J, where J = del(f1,f2,...,fn)/del(x1,x2,...,xn)
% and x=[x1;x2;...;xn], f=[f1;f2;...;fn]; x0 is the initial guess to run
% the program for solution
function [x,iteration] = newtonraphson(x0,f,J)
N = 100; % Maximum number of iterations definition
epsilon = 1e-15; % Tolerance Definition
maxvalue = 10000.0; % Definition of value for divergence
xxx = x0; % Initial guess for the solution
while (N>0)
JJJ = feval(J,xxx); % "feval" is used here to evaluate functions
if abs(det(JJJ))<epsilon
error('newtonraphson - Jacobian is singular - consider new x0');
abort;
end;
xn = xxx - inv(JJJ)*feval(f,xxx); % Newton-Raphson algorithm in matrix form
if abs(feval(f,xn))<epsilon
x=xn;
iteration = 100-N;
return;
end;
if abs(feval(f,xxx))>maxvalue
iteration = 100-N;
disp(['iterations = ',num2str(iteration)]);
error('Solution diverges');
abort;
end;
N = N - 1;
xxx = xn;
end;
error('No convergence after 100 iterations.');
abort;
end % Function end
The following function determines the derivatives:
function [f] = funcdef(x)
% funcdef(x) = 0, with x = [x(1);x(2);x(3)] represents a system of 3 nonlinear equations
f1 = exp(2*x(1))-x(2)-4;
f2 = x(2)-(x(3)*x(3))-1;
f3 = x(3)-sin(x(1));
f = [f1;f2;f3]; % End of function
The following function determines the Jacobian:
function [J] = jacobmatrix(x)
% Evaluates the Jacobian of a 3x3 for a system of 3 nonlinear equations
J(1,1) = 2*exp(2*x(1));
J(1,2) = -1;
J(1,3) = 0;
J(2,1) = 0;
J(2,2) = 1;
J(2,3) = -2*x(3);
J(3,1) = -cos(x(1));
J(3,2) = 0;
J(3,3) = 1;
end % Function end
Program Outputs:
>> [x,iteration] = newtonraphson([1;1;1],'funcdef','jacobmatrix')
x =
0.8590
1.5733
0.7572
iteration =
4
>> funcdef([0.85;1.57;0.75])
ans =
-0.0961
0.0075
-0.0013
So, the solutions are 0.85, 1.57 and 0.75.
No comments:
Post a Comment