Using Levenberg-Marquardt algorithm in the optimization

How can I use the optimization tool preferable to find a given value in an equation. This is the main equation I=i_ph-Is.*(exp(U./(m_1*Ut))-1) and I have a IU curve, but i want to get the value of 'c_01' in the sub equation Is=c_01*T^(3)*exp((-e_g*eV)/(k*T)).

 Réponse acceptée

Hi RAPHAEL OWENS,
there are several solvers and methods available. One of the available functions in Matlab is lsqcurvefit(). Below there is a sketch of how to apply the function on your (supposedly) available data.
% known parameters
T
e_g
eV
k
i_ph
m_1
Ut
% underlying equation
Is = @(c_01) c_01 * T^3 * exp((-e_g*eV)/(k*T));
I = @(c_01,U) i_ph - Is(c0_1) .* (exp(U./(m_1*Ut))-1);
% start value(s) for optimization
c_01_guess = 1;
% choose algorithm, and possibly other options for optimization solver
opt = optimoptions('lsqcurvefit');
opt.Algorithm = 'levenberg-marquardt';
% run optimization
c_01_opt = lsqcurvefit(I,c_01_guess,U_measured,I_measured,[],[],opt);
Kind regards,
Robert

9 commentaires

Thank for your quick response Robert. I still need more clarity. I attached the data and formula here. I want to optimize the value of c_01 using a guess value of 870.80. The plot of the graph is also shown.
Also i read that using the levenberg-marquardt algorithm, I'll have to use the fsolver.
t=25; %temperature (C)
T=t+273; %temperature (K)
i_ph=3.113; %phase current [A]
e_g=1.12; %band gap [eV]
c_01=170.80; %co-efficient of saturation current [AK^(-3)]
m_1=1.00; %diode factor
e=1.6*10^-(19); %electronvolt [j]
k=1.38*10^-(23); %Boltzmann constant [JK^(-1)]
U=(0:0.001:0.6); %voltage [V]
Ut=(k*T)/e;
Is=c_01*T^(3)*exp(-((e_g*e)/(k*T)));
I=i_ph-Is.*(exp(U./(m_1*Ut))-1);
plot(U,I,'linewidth',2.5);
axis([0,0.6,0,3.5]);
xlabel('Spannung U');
ylabel('Strom A');
grid on;
Explicit code for the described case:
t=25; %temperature (C)
T=t+273; %temperature (K)
i_ph=3.113; %phase current [A]
e_g=1.12; %band gap [eV]
m_1=1.00; %diode factor
e=1.6*10^-(19); %electronvolt [j]
k=1.38*10^-(23); %Boltzmann constant [JK^(-1)]
U=(0:0.001:0.6); %voltage [V]
Ut=(k*T)/e;
% underlying equation
Is = @(c_01) c_01 * T^3 * exp((-e_g*e)/(k*T));
I = @(c_01,U) i_ph - Is(c_01) .* (exp(U./(m_1*Ut))-1);
fh = figure;
ah = axes(fh);
hold(ah,'on');
plot(ah,U,I(170.8,U),'xblack','DisplayName','real curve');
plot(ah,U,I(870.80,U),'--black','DisplayName','guessed curve');
legend show
% start value(s) for optimization
c_01_guess = 870.8;
% choose algorithm, and possibly other options for optimization solver
opt = optimoptions('lsqcurvefit');
opt.Algorithm = 'levenberg-marquardt';
% run optimization
c_01_opt = lsqcurvefit(I,c_01_guess,U,I(170.8,U),[],[],opt);
plot(ah,U,I(c_01_opt,U),'-black','DisplayName','optimization result curve');
axis(ah,[0,0.6,0,3.5]);
xlabel('Spannung U');
ylabel('Strom A');
grid on;
Can you give more clarity on the bold curly bracket in first and second equation and also the entire last equation*
Is = {@ (c_01)} c_01 * T ^ 3 * exp ((- e_g * e) / (k * T));
I = {@ (c_01, U)} i_ph - Is (c_01). * (Exp (U ./ (m_1 * Ut)) - 1);
c_01_opt = lsqcurvefit (I, c_01_guess, U, I (170.8, U), [], [], opt);
Kind regards,
Raphael
The equations you gave are formulated as anonymous functions. The free parameters are defined as function inputs. It seemed to be advantagous to define two equations to not expand the main equation too much.
According to lsqcurvefit()-documentation the model function has to be given in the form f(x,xdata) where x is the vector of free parameters.
Calling lsqcurvefit() with options requires to give lower and upper limits parameters. Since we do not want to limit our solution space, we input empty parameters. The result is the optimized free parameter value.
Kind regards,
Robert
Thanks alot Robert
Hello Robert, how do i use the optimization tool under the APP taskbar to solve this problem.
I don't know that tool. You can ask a new question in the forum. I am sure that someone can elaborate on that.
Kind regards,
Robert
Hallo Robert, I need further clarity. How can i get the value of a parameter using optimization.
I=i_ph - (c_01 * T^3 * exp(-((e_g*e)/(k*T)))) .* (exp(U./(m_1*Ut))-1);
The parameter is c_01
The real value of c_01 is 170.8
So the optimized value will be also the real value.
Can you kindly break down the explanation also, because the genral idea is to get a parameter when we are just given the vectors that makes up the curve.
If we were just given UI value and the curve, and also some constants, how will i get an X parameter.
I hope my question is clear enough. Thanks
t=25; %temperature (C)
T=t+273; %temperature (K)
i_ph=3.113; %phase current [A]
e_g=1.12; %band gap [eV]
m_1=1.00; %diode factor
e=1.6*10^-(19); %electronvolt [j]
k=1.38*10^-(23); %Boltzmann constant [JK^(-1)]
U=(0:0.001:0.6); %voltage [V]
Ut=(k*T)/e;
Ut=0.0257
I=i_ph - (c_01 * T^3 * exp(-((e_g*e)/(k*T)))) .* (exp(U./(m_1*Ut))-1);
Hi RAPHAEL OWENS,
I am not sure whether I understood your question correctly: Where do I acquire xdata and ydata on real data?
Usually you are measuring the U-I-curve by supplying U and measuring I. In that case the real data are "U" (xdata) and "I" (ydata). The grid does not matter since you are trying to fit the data to a model function. It just needs to be fine enough to cover the overall model function characteristics.
In a nutshell:
  1. Supply U (xdata)
  2. Measure I (ydata)
  3. Give known parameters
  4. Fit to model funcion.
Kind regards,
Robert

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Linear Programming and Mixed-Integer Linear Programming dans Centre d'aide et File Exchange

Produits

Version

R2020a

Community Treasure Hunt

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

Start Hunting!

Translated by