Code covered by the BSD License  

Highlights from
Non-linear equations system solver (Newton Raphson)

3.83333

3.8 | 6 ratings Rate this file 193 Downloads (last 30 days) File Size: 47 KB File ID: #33332
image thumbnail

Non-linear equations system solver (Newton Raphson)

by

 

18 Oct 2011 (Updated )

Solves a non-linear system with iterative Newton-Raphson. Very easy and powerfull!!

| Watch this File

File Information
Description

This code solves a system of non-linear equations.
It is practical to use since there's no need to enter the derivation matrix (the code calculates itself).
Also, there's an indetermined number of variables (no restriction). You can put 1 million equations! :)
Inside the code there are instructions of how to use it, and also a folder with a simple exemple.
Hope it's going to be usefull for you! Comments and debugs are deeply enjoyed.

MATLAB release MATLAB 7.4 (R2007a)
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (17)
27 Oct 2014 Ching-Chen  
10 Sep 2014 OLUSEGUN ODUNOKUN

Good day people, I am new to MATLAB and I currently have a system of theree coupled nonlinear equation to solve. i will like to implement newton raphson iteration to solve the system of equation but I donot know how to go about this. ANy form of help will be appreciated. Thank you

12 Aug 2014 paolo

thanxs man great work

17 Oct 2012 Felipe Mendes

Thanks Danny! I've also spent a couple of hours trying to figure out how to solve this, but I couldn't. If you find it, please share with us! And if it is a bug I'll be very greatful with you for correcting it!
Thanks! Good luck!

17 Oct 2012 Danny MA

Felipe, thank you all the same, i will try to solve it by myself. if i have the ansewer, i will send it to you for sharing.

16 Oct 2012 Felipe Mendes

You should try to reformulate your system. Maybe it's not even possible to solve by newton-raphson!
(Sorry can't really help you) :/
Best regards,

15 Oct 2012 Danny MA

Hi Felipe,

thanks for your work. When i use your code to solve five nonlinear equations, the answers are NaN, and the message is: Warning: Matrix is singular, close to singular or badly scaled.
Results may be inaccurate. RCOND = NaN.
Could you give me some suggestions on how to solve it? thanks

15 Oct 2012 Danny MA

here are my code:
%%%%% 1 Reading of the parameters of the solution:

%maximum number of iterations

maxiter=1000;

%parameter to establish the convergenvce criteria

epsilon=0.0000000001;

%number of equations in the non-linear system to solve

nsys=5;

%%
%%%%% 2)Reading of the (nsys)equations
Voc=33.4;
Isc=8.12;
Vm=26.2;
Im=7.63;
Ns=54;
Np=1;

%Standard form of definition of the equations:
%
%F1 = @(x1,x2,x3) x1+x2-x3+b*a;
%
% *The equations are defined as an anonymous function;
% *They must be numbered sequentially: F1,F2,F3,... ,Fnsys;
% *The function array must be filled with all the F(nsys) functions of
% the system: F={F1,F2,F3,... F(nsys)}
% *Variables must be numbered like: x1,x2,x3,... ,xnsys;
% *Number of equations must be equal to the number of variables and
% equal to (nsys)
%
%Equation 1: (F1)

F1 = @(x) Np*x(1)-Np*x(2)*(exp(Voc/Ns/x(5))-1)-Np*Voc/Ns/x(4);

%Equation 2: (F2)

F2 = @(x) Np*x(1)-Np*x(2)*(exp(Isc*x(3)/Np/x(5))-1)-Isc*x(3)/x(4)-Isc;
F3 = @(x) Np*x(1)-Np*x(2)*(exp((Vm/Ns+Im*x(3)/Np)/x(5))-1)-Np/x(4)*(Vm/Ns+Im*x(3)/Np)-Im;
F4 = @(x) (Np*x(2)*exp((Vm+Im*Ns*x(3)/Np)/Ns/x(5))/Ns/x(5)+Np/Ns/x(4))/(1+x(3)*x(2)*exp((Vm+Im*Ns*x(3)/Np)/Ns/x(5))/x(5)+x(3)/x(4))-Im/Vm;
F5 = @(x) (Np*x(2)*exp(Isc*Ns*x(3)/Np/Ns/x(5))/Ns/x(5)+Np/Ns/x(4))/(1+x(3)*x(2)*exp(Isc*Ns*x(3)/Np/Ns/x(5))/x(5)+x(3)/x(4))-1/x(4);

%%%%% Function array

F={F1,F2,F3,F4,F5};

%%%%% Reading of the initial condition of all the (nsys) variables

%nls_aleatory_initial_values;

%The values could instead be inputed one by one like done bellow:
x(1)=8.12;
x(2)=2e-9;
x(3)=6e-7;
x(4)=8700;
x(5)=0.0275;

%%%%% Verification of the input data:

%(to be created)

%Function array has an order equivalent to nsys

%(to be created)

%%
%%%%% 3)Iterative calculations

nloop=0;
nconverg=0;

while nloop<maxiter

%%%%% Assemblage of the matrix of derivative functions

dFidxj=zeros(nsys,nsys);

for i=1:1:nsys
for j=1:1:nsys
nls_derivada;
end
end

%%
%%%%% Calculation of the vector with the values of each function

for i=1:1:nsys
j=F{i};
D(i,1)=j(x);
end

%%
%%%%% Calculation of the error

A=inv(dFidxj);
error=A*D;
dx=error';

%%
%%%%% Adding the error to the x to obtain the new iteration

x=x-dx;

%%
%%%%% Parameter to determine the end of the while loop

%%%% While loop counter

nloop=nloop+1;
nconverg=nconverg+1;
%%
%%%% Converging criteria (error < epsilon)

maxdx=max(abs(error));

if maxdx<epsilon
nloop=maxiter;
end


end
%%
%%%%% 4)Presentation and store of the result values

x
nconverg

%%% The values of the variables x(1), x(2),... x(nsys) can now be atributed
%%% to their respective destines

04 Oct 2012 Felipe Mendes

Thanks for the debugging. Update version already corrected.

01 Oct 2012 Nello Troccia

Probably this is the correct version:

abs_error=abs(error);
maxdx=max(abs_error);

if maxdx<epsilon
nloop=maxiter;
end

01 Oct 2012 Nello Troccia

Hi
thanks for your work!
I think that the part of the "convergin criteria" it's wrong. You write:

maxdx=max(error);

if abs(maxdx)<epsilon
nloop=maxiter;
end

Probably this is the correct version:

abs_error=abs(error);
maxdx=max(abs_error);

if maxdx<epsilon
nloop=maxiter;
end

Are you agree with me?
Thanks again!

19 Aug 2012 Felipe Mendes

No Zhazira, it will always converge to the solution that is the nearest to the initial values! What you could do if you want to explore a system with multiple solutions could be assign a score function at the end of the main routine. After that you could use a genetic algorithm to explore all the range of variation of the set of parameters and choose the solution that best fits the criteria you want to fulfill!
Good luck!

30 Jul 2012 Zhazira

Hi there!
If a system has several solutions, is it possible to get all real solutions at once using your solver?

13 Jun 2012 Felipe Mendes

you're welcome!!

13 Jun 2012 Yaan Yee Choy

Thanks of ur work.

14 Nov 2011 Felipe Mendes

Hi Houssemus!
Exactly! "nconverg" is the number of iterations done by the routine until the maximum error (creteria of convergence) was reached!
If you have a very big non-linear system, it might give you some information about how near your initial values are!
Good luck!

14 Nov 2011 Houssemus

hi man,
thanx for this work,, but i'm wondering if 'nconverg' is the number of iterations done during the calculation,
waiting for ur answer,

Updates
08 Jun 2012

A better functional description.

09 Oct 2012

Correction of small bug!

Contact us