cms.equation.equation_selfconsistent_diode のソースコード

import csv
import numpy as np
from numpy import sin, cos, tan, pi, exp
import sys
from matplotlib import pyplot as plt


# physical parameeters
e  = 1.60218e-19      # C";
kB = 1.380658e-23     # JK<sup>-1</sup>";


# circuit parameters
I0 = 1.0e-12
ndiode = 1.0
R = 1.0
T = 300.0
ekBT = e / kB / T / ndiode

# V range to be calculated
Vmin = 0.0
Vmax = 0.7
Vstep = 0.01

# self-consistent parameters
Iini   = 0.0
kmix   = 0.2
eps    = 1.0e-10
nmaxiter = 200
iprintiterval = 10


if __name__ == "__main__":
    argv = sys.argv
    n = len(argv)
    if n >= 2:
        Vmin = float(argv[1])
    if n >= 3:
        Vmax = float(argv[2])
    if n >= 4:
        Vstep = float(argv[3])
    if n >= 5:
        kmin = float(argv[4])

[ドキュメント] def current(V, I): global I0, ekVT, R Vd = V - R * I return I0 * (exp(ekBT * Vd) - 1.0)
[ドキュメント] def main(): global Iini, kmix, eps, nmaxiter, iprintinterval print("Solution of diode circuit current by self-consistent method") print("") xV = [] yI = [] for V in np.arange(Vmin, Vmax+1.0e-10, Vstep): print("V = {} V".format(V)) I = Iini for i in range(nmaxiter): Inext = current(V, Iini) dI = Inext - I if i % iprintiterval == 0: print("Iter {:5d}: I: {:>16.12f} => {:>16.12f}, dI = {:>10.4g}".format(i, I, Inext, dI)) if abs(dI) < eps: print(" Success: Convergence reached: dI = {} < eps = {}".format(dI, eps)) break I = (1.0 - kmix) * I + kmix * Inext else: print(" Failed: Convergence did not reach: dI = {} > eps = {}".format(dI, eps)) return 0 Iini = I xV.append(V) yI.append(I) #============================= # Plot graphs #============================= fig = plt.figure() ax1 = fig.add_subplot(1, 1, 1) ax1.plot(xV, yI) ax1.set_xlabel("V (V)") ax1.set_ylabel("I (A)") plt.pause(0.1) print("Press ENTER to exit>>", end = '') input() print("") print("Usage: python {} Vmin Vmax Vstep kmin".format(argv[0])) print("") return 1
if __name__ == "__main__": main()