Solving for two variable.
1 view (last 30 days)
Show older comments
I have:
clearclc
x=[7.53*10^(-5) 3.17*10^(-4) 1.07*10^(-3) 3.75*10^(-3) 1.35*10^(-2) 4.45*10^(-2) 1.75*10^(-1) 5.86*10^(-1)];
y=[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85];
but I need do find n and I0 from:
I = I0 * e^( (q*U)/(n*k*T) )
I already know q, U, k and T.
2 Comments
Alan Stevens
on 10 Sep 2022
Edited: Alan Stevens
on 10 Sep 2022
What are the equivalents of x and y in your equation? Presumably, y represents I. What does x represent?
Accepted Answer
Alan Stevens
on 10 Sep 2022
Edited: Alan Stevens
on 10 Sep 2022
In that case one way is to take logs of both sides to get:
log(I) = log(I0) + q/(n*k*T)*U
then do a best-fit straight line to the data (use log(x)) and get log(I0) from the intercept and q/(n*k*T) from the slope, from which yoiu can then get I0 and n.
4 Comments
Torsten
on 10 Sep 2022
x=[7.53*10^(-5) 3.17*10^(-4) 1.07*10^(-3) 3.75*10^(-3) 1.35*10^(-2) 4.45*10^(-2) 1.75*10^(-1) 5.86*10^(-1)];
y=[0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85];
% You said x = I and U = y so
p=polyfit(y,log(x),1);
f=polyval(p,y);
figure(1)
plot(y,log(x),'o',y,f,'-'), grid
xlabel('U'),ylabel('logI')
% Intercept is p(2), slope is p(1)
I0 = exp(p(2));
q_on_nkT = p(1); % You need to rearrange this to get n, using
% your known values for q, k and T
q = 1.60*10^(-19);
k = 1.38*10^(-23);
T = 300;
n = q/(k*T*q_on_nkT);
disp(I0)
disp(n)
figure(2)
plot(y,x,'o',y,I0*exp(q/(k*T)*y/n),'-'), grid
xlabel('U'),ylabel('I')
More Answers (1)
Torsten
on 10 Sep 2022
Edited: Torsten
on 10 Sep 2022
I = [7.53*10^(-5) 3.17*10^(-4) 1.07*10^(-3) 3.75*10^(-3) 1.35*10^(-2) 4.45*10^(-2) 1.75*10^(-1) 5.86*10^(-1)];
U = [0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85];
q = 1.60*10^(-19);
k = 1.38*10^(-23) ;
T = 300;
value = q/(k*T);
fun = @(I0,n) I - I0 * exp( value * U / n );
p0 = [1 ; 10]; % Initial guess for I0 and n
options = optimset('TolX',1e-10,'TolFun',1e-10,'MaxFunEvals',100000,'MaxIter',100000);
sol = lsqnonlin(@(p)fun(p(1),p(2)),p0,[],[],options);
format long
I0 = sol(1)
n = sol(2)
hold on
plot(U,I,'o')
plot(U,I0 * exp( value * U / n ))
grid
hold off
4 Comments
Torsten
on 10 Sep 2022
Edited: Torsten
on 10 Sep 2022
No, you are wrong.
Applying log to your equation distorts the fitting.
You must fit I0*exp(value * U / n) against U to get unbiased estimates for your parameters.
Fitting log(I0) + value/n * U against log(U) only gives an approximation for I0 and n.
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!