def get_unit_quantity(name, base, scale_factor, abbrev=None, unit_system='SI'): '''Define a unit in terms of a base unit''' u = units.Quantity(name, abbrev=abbrev) base_unit = getattr(sympy_units, base) u.set_dimension(base_unit.dimension) u.set_scale_factor(scale_factor * base_unit, unit_system=unit_system) return u
def get_unit_quantity(name, base, scale_factor, abbrev=None, unit_system='SI'): '''Define a unit in terms of a base unit''' u = units.Quantity(name, abbrev=abbrev) base_unit = getattr(sympy_units, base) try: # sympy >= 1.5 raises the following warning: # Use unit_system.set_quantity_dimension or # <unit>.set_global_relative_scale_factor u.set_global_relative_scale_factor(scale_factor, base_unit) except AttributeError: u.set_dimension(base_unit.dimension) u.set_scale_factor(scale_factor * base_unit, unit_system=unit_system) return u
# %% r1 = 3E3 * u.ohms intensidad_ahkab = resultados['op']['I(V1)'][0][0] * u.ampere v2 = convert_to(intensidad_ahkab * r1, [u.volt]) pprint(v2) # %% [markdown] # > **Pregunta**: reproduce el resto de los valores anteriores de manera *manual* mediante Sympy (es decir, aplicando la ley de Ohm, pero con tun *toque computacional*). Te pongo aquí un ejemplo del que puedes partir… En él sólo calculo la corriente que circula por el circuito (sí, justo la que antes Ahkab ha devuelto de manera automática). Para ello necesito previamente computar la resistencia total (`r_total`). Faltarían el resto de resultados y convertirlos a unidades más *vistosas* (mediante la orden `convert_to` y `.n()`). # %% v1 = 9 * u.volts r1 = 3 * u.kilo * u.ohms r2 = 10 * u.kilo * u.ohms r3 = 5 * u.kilo * u.ohms r_total = r1 + r2 + r3 intensidad = u.Quantity('i') intensidad.set_dimension(u.current) ley_ohm = Eq(v1, intensidad * r_total) solucion_para_intensidad = solve(ley_ohm, intensidad) pprint(convert_to(solucion_para_intensidad[0], [u.ampere]).n(2)) # %% [markdown] # > **Pregunta**: Demuestra que se cumple la Ley de Kirchhoff de la energía en un circuito, es decir, que la suma de la energía suministrada por las fuentes (pilas) es igual a la consumida por las resistencias. Realiza la operación con Sympy. # # $$ # \sum_i^N V_{\text{fuentes}} = \sum_j^M V_{\text{consumido en resistencias}} # $$ # # Ten en cuenta que en este caso sólo hay una fuente. # %% [markdown] # ## Análisis `.op` de circuitos con resistencias en paralelo
class _storage: USgal = units.Quantity('US gallon', 'USgal') # units.systems.SI.set_quantity_scale_factor(USgal, 231*units.inch**3) # USgal.set_scale_factor(231*units.inch**3) # USgal.set_dimension(units.length**3) units.systems.SI.set_quantity_dimension(USgal, units.length**3) UKgal = units.Quantity('UK gallon', 'UKgal') # units.systems.SI.set_quantity_scale_factor(UKgal, 4.54609*units.liter) # UKgal.set_scale_factor(4.54609*units.liter) # UKgal.set_dimension(units.length**3) units.systems.SI.set_quantity_dimension(UKgal, units.length**3) lbf = units.Quantity('pound_force', 'lbf') # lbf.set_dimension(units.force) units.systems.SI.set_quantity_dimension(lbf, units.force) # units.systems.SI.set_quantity_scale_factor(lbf, units.pound.scale_factor) # lbf.set_scale_factor(units.pound.scale_factor) MPa = megapascal = megapascals = units.Quantity('megapascal', 'MPa') # MPa.set_dimension(units.pressure) units.systems.SI.set_quantity_dimension(MPa, units.pressure) # units.systems.SI.set_quantity_scale_factor(MPa, 1000*units.kPa) # MPa.set_scale_factor(1000*units.kPa) GPa = gigapascal = gigapascals = units.Quantity('gigapascal', 'GPa') # GPa.set_dimension(units.pressure) units.systems.SI.set_quantity_dimension(GPa, units.pressure) # units.systems.SI.set_quantity_scale_factor(GPa, 1e6*units.kPa) # GPa.set_scale_factor(1e6*units.kPa) kN = kilonewton = kilonewtons = units.Quantity('kilonewton', 'kN') # kN.set_dimension(units.force) units.systems.SI.set_quantity_dimension(kN, units.force) # units.systems.SI.set_quantity_scale_factor(kN, 1000*units.newton) # kN.set_scale_factor(1000*units.newton) weight = units.force density = units.mass / units.volume area = units.length**2 sec = units.second min = units.minute hr = units.hour lbm = units.pound distance = units.length Hertz = units.hertz for k, v in locals().copy().items(): if isinstance(v, (units.Quantity, units.Dimension)): setattr(units, k, v) del locals()[k] lengths = distances = { k: getattr(units, k) for k in units.find_unit(units.inch) } areas = {k + '^2': v**2 for k, v in lengths.items()} accelerations = {k: getattr(units, k) for k in units.find_unit(units.gee)} pressures = {k: getattr(units, k) for k in units.find_unit(units.pascal)} masses = {k: getattr(units, k) for k in units.find_unit(units.gram)} forces = weights = { k: getattr(units, k) for k in units.find_unit(units.newton) } times = {k: getattr(units, k) for k in units.find_unit(units.minute)} angles = {k: getattr(units, k) for k in units.find_unit(units.radian)} # velocities = {k: getattr(units, k) for k in units.find_unit(units.speed)} # frequencies = {k: getattr(units, k) for k in units.find_unit(units.hertz)} # information = {k: getattr(units, k) for k in units.find_unit(units.byte)} # powers = {k: getattr(units, k) for k in units.find_unit(units.power)} # voltages = {k: getattr(units, k) for k in units.find_unit(units.volts)} # currents = {k: getattr(units, k) for k in units.find_unit(units.ampere)} # charges = {k: getattr(units, k) for k in units.find_unit(units.coulomb)} # lights = {k: getattr(units, k) for k in units.find_unit(units.luminosity)} # resistances = {k: getattr(units, k) for k in units.find_unit(units.ohm)} # amounts = {k: getattr(units, k) for k in units.find_unit(units.mol)} # temperatures = {k: getattr(units, k) for k in units.find_unit(units.kelvin)} # magneticdensities = {k: getattr(units, k) for k in units.find_unit(units.tesla)} # magneticfluxes = {k: getattr(units, k) for k in units.find_unit(units.weber)} # energies = {k: getattr(units, k) for k in units.find_unit(units.electronvolt)} # capacitances = {k: getattr(units, k) for k in units.find_unit(units.farad)} # inductances = {k: getattr(units, k) for k in units.find_unit(units.henry)} volumes = {k: getattr(units, k) for k in units.find_unit(units.liter)} volumes.update({k + '^3': v**3 for k, v in lengths.items()}) unit_subs = dict() for name, d in locals().copy().items(): if not isinstance(d, dict) or name == 'unit_subs': continue for k, v in d.items(): if isinstance(v, (units.Dimension, units.Quantity)): unit_subs[k] = v del d, k, v dimensions = { k: v for k, v in vars(units).items() if isinstance(v, units.Dimension) } units.One = S.One