Copyright (c) 2011, Felipe Mendes
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the distribution
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
Muhammad Umar Farooq (view profile)
Thank you for your work Mr. Felipe Mendes. It has solved my equations time and time again but it is stuck at my 4 equations and always provide a NaN value no matter what I do. Can you tell me what is the solution of this problem?
Mahmoud Y (view profile)
Juan Abuabara (view profile)
Hello, thank you for your great work...
at the moment, I'm getting an error when I try to to solve a 3 system equations. The error is
>> NewtonRaphson
Undefined function or variable 'nls_aleatory_initial_values'.
Error in NewtonRaphson (line 81)
nls_aleatory_initial_values;
Carl Witthoft (view profile)
My apologies - I failed to unzip all files. The main file has all the 'readme' info I was after.
Carl Witthoft (view profile)
Code looks good but it really needs a solid ReadMe or Help file to clarify how to set up the inputs
Ching-Chen (view profile)
OLUSEGUN ODUNOKUN (view profile)
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
paolo (view profile)
thanxs man great work
Felipe Mendes (view profile)
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!
Danny MA (view profile)
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.
Felipe Mendes (view profile)
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,
Danny MA (view profile)
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
Danny MA (view profile)
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
Felipe Mendes (view profile)
Thanks for the debugging. Update version already corrected.
Nello Troccia (view profile)
Probably this is the correct version:
abs_error=abs(error);
maxdx=max(abs_error);
if maxdx<epsilon
nloop=maxiter;
end
Nello Troccia (view profile)
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!
Felipe Mendes (view profile)
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!
Zhazira (view profile)
Hi there!
If a system has several solutions, is it possible to get all real solutions at once using your solver?
Felipe Mendes (view profile)
you're welcome!!
Yaan Yee Choy (view profile)
Thanks of ur work.
Felipe Mendes (view profile)
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!
Houssemus (view profile)
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,