Newton method for solving a nonlinear system of equations!

9 views (last 30 days)
Hello,
I am trying to write a function that solves a non linear system of equations. In my exercise I have 2,3 and 4 dimensional equation system. I am not allowed to use fsolve function. I also have a function called "Score4" which is suppose to calculate the score of my function ( should be around 1 if the code that I wrote is correct).
Below you will find the score and the code that I wrote.
Thank you in advance for your time.
function [score,error,details] = Score4()
%% Parameter
% 2 dimensional equation system
A{1} = @(x)[4*cos(x(1)),2*cos(x(1)+x(2));
5*sin(x(1)),1*sin(x(1)+x(2))];
x0{1} = [0,0]';
y{1} = [2,3]';
y0{1} = [-1,1]';
% 3 dimensional equation system
A{2} = @(x)[1,0,0;0,cos(x(1)),-sin(x(2));0,sin(x(2))^2,cos(x(1))];
x0{2} = [0;0];
y0{2} = [1;2;3];
y{2} = [1;0;1];
% 4 dimensional transformation matrix with 5d input
A{3} = @(x)[cos(x(1)),sin(x(1)),0,-x(3);
-sin(x(1))*cos(x(4)),cos(x(1))*cos(x(4)),sin(x(4))*sin(x(5)),-x(2)*sin(x(4))*cos(x(5));
sin(x(4))*sin(x(1)),-cos(x(1))*sin(x(4)),cos(x(4))*sin(x(5)),-x(2)*cos(x(4))*cos(x(5));
0,0,0,1];
x0{3} = [0;0;0;0;0];
y0{3} = [1;3;2;1];
y{3} = [1;2;-1;1];
%% Score Berechnung
score = 0;
error = '';
details = struct();
try
% Iteration ueber testcases
for i = 1:3
% Aufstellen des nullstellenproblems
RootProblem = @(z) A{i}(z)*y0{i}-y{i};
T = 0;
% Mitteln ueber Zeit
timer = tic();
for j = 1:10
x = nlinSolve(RootProblem,x0{i});
end
T = toc(timer)/10;
output = A{i}(x)*y0{i}-y{i};
Err = norm(output);
Sc = (Err+0.01)*(T+0.5);
score = score+Sc;
details.(['time',num2str(i)]) = T;
details.(['error',num2str(i)]) = Err;
end
score = 0.017 / score;
catch err
score = 0;
error = err.message;
end
end
To solve this problem I was thinking to use Newton method but I am having a lot of problems. Can someone give me some suggestions how to improve my code and what am I doing wrong. My code is as follows:
function x = nlinSolve (g,x0)
select = @(g,r,c) g(r,c);
G1 = @(x)select(g(x), 1, 1); % selecting the first row of g(x)
G2 = @(x)select(g(x), 2, 1); % selecting the second row
G3 = @(x)select(g(x), 3, 1);
G4 = @(x)select(g(x), 4, 1);
G5 = @(x)select(g(x), 5, 1);
x = x0; % x0 initial guess which is given in the score function
for m=1:10
%calculating Jacobian
for k=1:numel(x)
for n =1: numel(x)
Jakobian(k,n)= Derivative(eval(['G',num2str(k)]),x,x(n),n);
end
end
x = x-inv(Jakobian)*g(x); % Newton formula to find roots
end
end
function J = Derivative(G,x,xm,m)
% the funciton that calculates the derivative using numerical method
e = 0.0001;
x1=x;
x2=x;
x1(m) = xm;
x2(m) = xm+e;
J = (G(x2)-G(x1))/e;
end
Now this code is clearly not working, I am messing up something. Also the score should be around 1 at the end.
If anyone can help me that would be more than appritiated.
  1 Comment
Rigon
Rigon on 19 Apr 2022
If someone can tell me how to calculate the Jacobian of this type of functions. For example
A{1} = @(x)[4*cos(x(1)),2*cos(x(1)+x(2));
5*sin(x(1)),1*sin(x(1)+x(2))];
g = g=@(x) A{i}(x)*y0{i} - y{i};
How to calculate the Jacobian of the function g. That probably would be really helpful.
Thank you again!

Sign in to comment.

Accepted Answer

Matt J
Matt J on 19 Apr 2022
How to calculate the Jacobian of the function g. If Ja is the Jacobian of A{i}(:), then the Jacobian Jgof g will be
Jg=kron(y0{i}.',eye(2))*Ja;
  20 Comments
munazama
munazama on 13 Sep 2024
Edited: munazama on 13 Sep 2024
1-cos3x1 + cos3x2 = 0
1-cos5x1 + cos5x2 = 0
can anybody plz provide its coding and solution using newton method. thanks in advance

Sign in to comment.

More Answers (0)

Products


Release

R2022a

Community Treasure Hunt

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

Start Hunting!