mirror of
https://hub.njuu.cf/TheAlgorithms/Python.git
synced 2023-10-11 13:06:12 +08:00
Add carrier concentrations calculation algorithm (#4791)
* added carrier concentrations algorithm * Add more references Added more references to the carrier concentrations file * Update electronics/carrier_concentration.py Co-authored-by: John Law <johnlaw.po@gmail.com> * Update electronics/carrier_concentration.py Co-authored-by: John Law <johnlaw.po@gmail.com> Co-authored-by: John Law <johnlaw.po@gmail.com>
This commit is contained in:
parent
729b4d875a
commit
fadb97609f
75
electronics/carrier_concentration.py
Normal file
75
electronics/carrier_concentration.py
Normal file
@ -0,0 +1,75 @@
|
||||
# https://en.wikipedia.org/wiki/Charge_carrier_density
|
||||
# https://www.pveducation.org/pvcdrom/pn-junctions/equilibrium-carrier-concentration
|
||||
# http://www.ece.utep.edu/courses/ee3329/ee3329/Studyguide/ToC/Fundamentals/Carriers/concentrations.html
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
def carrier_concentration(
|
||||
electron_conc: float,
|
||||
hole_conc: float,
|
||||
intrinsic_conc: float,
|
||||
) -> tuple:
|
||||
"""
|
||||
This function can calculate any one of the three -
|
||||
1. Electron Concentration
|
||||
2, Hole Concentration
|
||||
3. Intrinsic Concentration
|
||||
given the other two.
|
||||
Examples -
|
||||
>>> carrier_concentration(electron_conc=25, hole_conc=100, intrinsic_conc=0)
|
||||
('intrinsic_conc', 50.0)
|
||||
>>> carrier_concentration(electron_conc=0, hole_conc=1600, intrinsic_conc=200)
|
||||
('electron_conc', 25.0)
|
||||
>>> carrier_concentration(electron_conc=1000, hole_conc=0, intrinsic_conc=1200)
|
||||
('hole_conc', 1440.0)
|
||||
>>> carrier_concentration(electron_conc=1000, hole_conc=400, intrinsic_conc=1200)
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 37, in <module>
|
||||
ValueError: You cannot supply more or less than 2 values
|
||||
>>> carrier_concentration(electron_conc=-1000, hole_conc=0, intrinsic_conc=1200)
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 40, in <module>
|
||||
ValueError: Electron concentration cannot be negative in a semiconductor
|
||||
>>> carrier_concentration(electron_conc=0, hole_conc=-400, intrinsic_conc=1200)
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 44, in <module>
|
||||
ValueError: Hole concentration cannot be negative in a semiconductor
|
||||
>>> carrier_concentration(electron_conc=0, hole_conc=400, intrinsic_conc=-1200)
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 48, in <module>
|
||||
ValueError: Intrinsic concentration cannot be negative in a semiconductor
|
||||
"""
|
||||
if (electron_conc, hole_conc, intrinsic_conc).count(0) != 1:
|
||||
raise ValueError("You cannot supply more or less than 2 values")
|
||||
elif electron_conc < 0:
|
||||
raise ValueError("Electron concentration cannot be negative in a semiconductor")
|
||||
elif hole_conc < 0:
|
||||
raise ValueError("Hole concentration cannot be negative in a semiconductor")
|
||||
elif intrinsic_conc < 0:
|
||||
raise ValueError(
|
||||
"Intrinsic concentration cannot be negative in a semiconductor"
|
||||
)
|
||||
elif electron_conc == 0:
|
||||
return (
|
||||
"electron_conc",
|
||||
intrinsic_conc ** 2 / hole_conc,
|
||||
)
|
||||
elif hole_conc == 0:
|
||||
return (
|
||||
"hole_conc",
|
||||
intrinsic_conc ** 2 / electron_conc,
|
||||
)
|
||||
elif intrinsic_conc == 0:
|
||||
return (
|
||||
"intrinsic_conc",
|
||||
(electron_conc * hole_conc) ** 0.5,
|
||||
)
|
||||
else:
|
||||
return (-1, -1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import doctest
|
||||
|
||||
doctest.testmod()
|
Loading…
Reference in New Issue
Block a user