3 spreadsheet, plot, explanation edited Oct 10 '18 at 22:33 Roland 22315  vd id -0.4 1.84426548556218E-21 -0.2 1.04706618384119E-19 0 5.94463E-18 0.2 3.37501357433389E-16 0.4 1.91613550833913E-14 0.6 1.08786978346975E-12 0.8 6.17628899749531E-11 1.0 3.50653601747389E-09 1.2 1.99080626680972E-07 1.4 1.13026347718055E-05 1.6 0.000641697562011 1.8 0.036431838186809 2.0 2.06838690412047  The column Vd are the voltages, Id is the diode current according to the real formula, Id0 is the current with the simplified formula where the "minus 1" is changed to "minus zero". As Id0 is a true exponential curve, you can take the logaritm in column Id0_log. (You cannot take the log of a curve that becomes zero and negative like Id) The plot is from Id0_Log versus Vd. In this plot I made the lowest part dotted, because there it is NOT the actual diode current anymore, but does show the value of Is at the intersection with the Y-axis. Following the exponential curve to the left brings you asymptotally to zero. But the "minus 1" subtracts an amount of Is, so that the real diode curve goes through the origin and, with negative voltages, shows a reverse leakage current of amount Is. If the original manufacturers curve would have been on a really large log plot, we could have simply used a ruler to extend the straight line downwards to easily find Is at Vd=0 and then compute N, instead of compute first N then Is with the above macro's. The ruler method has been described in "The Spice Book" by Andrei Vladimirescu (1994).  vd id -0.4 1.84426548556218E-21 -0.2 1.04706618384119E-19 0 5.94463E-18 0.2 3.37501357433389E-16 0.4 1.91613550833913E-14 0.6 1.08786978346975E-12 0.8 6.17628899749531E-11 1.0 3.50653601747389E-09 1.2 1.99080626680972E-07 1.4 1.13026347718055E-05 1.6 0.000641697562011 1.8 0.036431838186809 2.0 2.06838690412047  The column Vd are the voltages, Id is the diode current according to the real formula, Id0 is the current with the simplified formula where the "minus 1" is changed to "minus zero". As Id0 is a true exponential curve, you can take the logaritm in column Id0_log. (You cannot take the log of a curve that becomes zero and negative like Id) The plot is from Id0_Log versus Vd. In this plot I made the lowest part dotted, because there it is NOT the actual diode current anymore, but does show the value of Is at the intersection with the Y-axis. Following the exponential curve to the left brings you asymptotally to zero. But the "minus 1" subtracts an amount of Is, so that the real diode curve goes through the origin and, with negative voltages, shows a reverse leakage current of amount Is. If the original manufacturers curve would have been on a really large log plot, we could have simply used a ruler to extend the straight line downwards to easily find Is at Vd=0 and then compute N, instead of compute first N then Is with the above macro's. The ruler method has been described in "The Spice Book" by Andrei Vladimirescu (1994). 2 reset debug value, but 0 or 1 do not make any difference for us edited Oct 9 '18 at 22:26 Roland 22315 Const Q as double = 1.6E-19 Const K as double = 1.38E-22 Const T as double = 300 rem The Shockley diode equation, to build the graph Id(Vd) for hardcoded values of Is and N Function shockley(Vd as double) as double Const Is1 as double = 5.94463E-18 rem Note that 'Is' is a reserved word and cannot be the name of a variable Const N as double = 0.191367 shockley = Is1 * (exp(Vd * Q / (N * K * T )) - 01) End Function rem Step 1 in solving the diode equation for N using values from a graph Function ComputeN(V1 as double, V2 as double, I1 as double, I2 as double) as double ComputeN = (Q / (K * T)) * (V1 - V2) / (log(I1) - log(I2)) End Function rem Step 2 in solving the diode equation for Is Function ComputeIS(V as double, I as double, N as double) as double ComputeIS = I / (exp(Q * V / (N * K * T))) End Function rem for debugging sub Test dim N as double N = ComputeN(1.85, 1.3, 0.1, 1.5E-6) dim Is1 as double Is1 = ComputeIs(1.85, 0.1, N) end sub  I get a somewhat similar value for Is: 5.94E-18 = 5.94 atto-ampere (W5VO found 1 aA), but much different N = 0.19 (W5VO found 1.8, typo?), still the data also computes back to the same graph: Const Q as double = 1.6E-19 Const K as double = 1.38E-22 Const T as double = 300 rem The Shockley diode equation, to build the graph Id(Vd) for hardcoded values of Is and N Function shockley(Vd as double) as double Const Is1 as double = 5.94463E-18 rem Note that 'Is' is a reserved word and cannot be the name of a variable Const N as double = 0.191367 shockley = Is1 * (exp(Vd * Q / (N * K * T )) - 0) End Function rem Step 1 in solving the diode equation for N using values from a graph Function ComputeN(V1 as double, V2 as double, I1 as double, I2 as double) as double ComputeN = (Q / (K * T)) * (V1 - V2) / (log(I1) - log(I2)) End Function rem Step 2 in solving the diode equation for Is Function ComputeIS(V as double, I as double, N as double) as double ComputeIS = I / (exp(Q * V / (N * K * T))) End Function rem for debugging sub Test dim N as double N = ComputeN(1.85, 1.3, 0.1, 1.5E-6) dim Is1 as double Is1 = ComputeIs(1.85, 0.1, N) end sub  I get a somewhat similar value for Is: 5.94E-18 = 5.94 atto-ampere, but much different N = 0.19, still the data also computes back to the same graph: Const Q as double = 1.6E-19 Const K as double = 1.38E-22 Const T as double = 300 rem The Shockley diode equation, to build the graph Id(Vd) for hardcoded values of Is and N Function shockley(Vd as double) as double Const Is1 as double = 5.94463E-18 rem Note that 'Is' is a reserved word and cannot be the name of a variable Const N as double = 0.191367 shockley = Is1 * (exp(Vd * Q / (N * K * T )) - 1) End Function rem Step 1 in solving the diode equation for N using values from a graph Function ComputeN(V1 as double, V2 as double, I1 as double, I2 as double) as double ComputeN = (Q / (K * T)) * (V1 - V2) / (log(I1) - log(I2)) End Function rem Step 2 in solving the diode equation for Is Function ComputeIS(V as double, I as double, N as double) as double ComputeIS = I / (exp(Q * V / (N * K * T))) End Function rem for debugging sub Test dim N as double N = ComputeN(1.85, 1.3, 0.1, 1.5E-6) dim Is1 as double Is1 = ComputeIs(1.85, 0.1, N) end sub  I get a somewhat similar value for Is: 5.94E-18 = 5.94 atto-ampere (W5VO found 1 aA), but much different N = 0.19 (W5VO found 1.8, typo?), still the data also computes back to the same graph: 1 answered Oct 9 '18 at 22:21 Roland 22315 Great answers, but it is easy to solve the Shockley diode equation algebraicly. Just note that the "minus 1" in the formula is very irrelevant for forward currents that are an order of magnitude greater than Is, which is very small, say, 1E-12 A. Find just two points in the graph with easy to read I and V values, and plug these into the formula. Dividing both formula's eliminates Is, so N is easy to compute. Then fill in N in a formula to find Is. Here are my LibreOffice Calc macro's in Basic: Const Q as double = 1.6E-19 Const K as double = 1.38E-22 Const T as double = 300 rem The Shockley diode equation, to build the graph Id(Vd) for hardcoded values of Is and N Function shockley(Vd as double) as double Const Is1 as double = 5.94463E-18 rem Note that 'Is' is a reserved word and cannot be the name of a variable Const N as double = 0.191367 shockley = Is1 * (exp(Vd * Q / (N * K * T )) - 0) End Function rem Step 1 in solving the diode equation for N using values from a graph Function ComputeN(V1 as double, V2 as double, I1 as double, I2 as double) as double ComputeN = (Q / (K * T)) * (V1 - V2) / (log(I1) - log(I2)) End Function rem Step 2 in solving the diode equation for Is Function ComputeIS(V as double, I as double, N as double) as double ComputeIS = I / (exp(Q * V / (N * K * T))) End Function rem for debugging sub Test dim N as double N = ComputeN(1.85, 1.3, 0.1, 1.5E-6) dim Is1 as double Is1 = ComputeIs(1.85, 0.1, N) end sub  If you look at the formula's, you might recognize simply the description of a straight line with slope of q/NkT but also of delta Log(Id) / delta Vd. I get a somewhat similar value for Is: 5.94E-18 = 5.94 atto-ampere, but much different N = 0.19, still the data also computes back to the same graph:  vd id -0.4 1.84426548556218E-21 -0.2 1.04706618384119E-19 0 5.94463E-18 0.2 3.37501357433389E-16 0.4 1.91613550833913E-14 0.6 1.08786978346975E-12 0.8 6.17628899749531E-11 1.0 3.50653601747389E-09 1.2 1.99080626680972E-07 1.4 1.13026347718055E-05 1.6 0.000641697562011 1.8 0.036431838186809 2.0 2.06838690412047