Newton-Raphson Method for Non-linear System of 3 variables in Matlab

AI Thread Summary
The discussion focuses on using the Newton-Raphson method in MATLAB to solve a system of three non-linear equations involving variables c, s, and q. The user provides their MATLAB code but seeks validation on the accuracy of the results. A key issue identified in the code is the incorrect definition of the Jacobian matrix, which should include the correct partial derivatives for each variable. The correct Jacobian should be structured as J = [dfdc dfds dfdq; dgdc dgds dgdq; dhdc dhds dhdq]. The user is encouraged to correct this error to ensure accurate computation of c, s, and q.
wel
Gold Member
Messages
36
Reaction score
0
I am trying to solve 3 non-linear system of 3 variables using the Newton-raphson method in matlab. Here are the 3 non-linear equations:

\begin{equation} c[\alpha I+ k_f+k_d+k_ns+k_p(1-q)]-I \alpha =0 \end{equation}
\begin{equation} s[\lambda_b c P_C +\lambda_r (1-q)]- \lambda_b c P_C =0 \end{equation}
\begin{equation} q[\gamma +c k_p \frac{P_C}{P_Q}]- c k_p \frac{P_C}{P_Q}=0 \end{equation}

I need to find the values of c,s, and q using the Newton-raphson method.

=>
This is my MATLAB code :

Code:
 format long
    clear; 
  
 %values of parameters
    I=1200;
    k_f= 6.7*10.^7;
    k_d= 6.03*10.^8; 
    k_n=2.92*10.^9; 
    k_p=4.94*10.^9;
    lambda_b= 0.0087;
    lambda_r =835; 
    gamma =2.74; 
    alpha =1.14437*10.^-3;
    P_C= 3 * 10.^(11);
    P_Q= 2.87 * 10.^(10);    
tol = 10.^-4;  %tol is a converge tolerance    
%initial guess or values
  c=1; 
  s=0.015;
  q=0.98; 
  iter= 0; %iterations
  xnew =[c;s;q];
  xold = zeros(size(xnew));
  while norm(xnew - xold) > tol
      iter= iter + 1;
      xold = xnew;      % update c, s, and q
      c = xold(1);
      s = xold(2);
      q = xold(3);
      
%Defining the functions for c,s and q.
      f = c * (alpha*I + k_f + k_d + k_n * s + k_p*(1-q))-I *alpha;
      g = s * (lambda_b * c* P_C + lambda_r *(1-q))- lambda_b* c * P_C; 
      h = q * ( gamma + c * k_p *(P_C / P_Q))- (c * k_p * (P_C / P_Q));     

%Partial derivatives in terms of c,s and q.
      dfdc = alpha*I + k_f + k_d + k_n * s + k_p*(1-q);
      dfds = k_n *c ;
      dfdq = - k_p *c;      
      
      dgdc = lambda_b * P_C *(s-1);
      dgds = lambda_b * c* P_C + lambda_r *(1-q);
      dgdq = - lambda_r * s;      
      
      dhdc = k_p *(P_C / P_Q)*(q-1);
      dhds = 0;
      dhdq = gamma + c * k_p *(P_C / P_Q);     
      
       %Jacobian matrix 
      J = [dfdc dfds dfdq; dgdc dgds dgdq; dhdc dhds dhdq];    
      
      % Applying the Newton-Raphson method
      xnew = xold - J\[f;g;h];
      disp(sprintf('iter=%6.15f,  c=%6.15f,  s=%6.15f, q=%6.15f', iter,xnew)); 
  end
can someone please check my code, there are no errors but did i got accurate values of c,s, and q?. Thanks in advance.
 
Last edited:
Physics news on Phys.org
I'm not a Matlab expert, and I didn't check your code in detail, but clearly your definition of the Jacobian is wrong.

You have: J = [dfdc dfds dfds; dgds dgds dgds; dhds dhds dhds];

You want: J = [dfdc dfds dfdq; dgdc dgds dgdq; dhdc dhds dhdq];
 
  • Like
Likes 1 person
Back
Top