Skip to main content

Python library for calculating and formatting errors in LaTeX in lab work.

Project description

FabPy

Библиотека на Python для вычисления и оформления погрешностей в LaTeX в физических лабораторных работах.

Установка

Вы можете использовать для установки pip:

pip install fabpy

Использование

Среднеквадратичное отклонение, случайная, приборная и абсолютная погрешности

fabpy может использоваться в различных средах программирования, однако рекомендуется использовать Jupiter Notebook или Jupyter Lab.

import fabpy as fb

Допустим что у вас некоторые измерения времени t = [21.5, 22.1, 21.9] с погрешностью прибора измерения $\Delta t = 0,2 ,с$. Занесем эти данные в объект Values:

import fabpy as fb

t = fb.Values(name='t', values=[21.5, 22.1, 21.9], delta=0.2)

Объект Values имеет такие параметры как:

  • name - имя переменной, которое будет использоваться в формулах LaTeX;
  • values - значения измерений, может принимать как множество значений (list, tuple), так и одно значение (int, float);

Учитывайте, что при создании объекта с одним значением ($n = 1$), случайная погрешность (RandomError) будет равно 0, т.к. при расчете среднеквадратичного отклонения (StandardError), знаменатель равен 0;

$$S_t = \sqrt{\frac{\sum_{i=1}^{n} (\overline{t} - t_i)^2}{n(n-1)}}$$

  • delta - погрешность измерительного прибора в тех же единицах, что и измерения;
  • roundoff - количество знаков после запятой для округления;
  • alpha - доверительный коэффициент для расчета доверительного интервала. По умолчанию 0.95;
  • use_instrumental_error - использовать ли при расчетах абсолютной погрешности приборную погрешность;
  • use_random_error - использовать ли при расчетах абсолютной погрешности случайную погрешность;
  • rounded - использовать при расчетах округленные значения (по roundoff) или точные значения;

После создания объекта класса, можно и получить необходимые данные.

from fabpy.dataclass import Values

t = Values(name='t', values=[21.5, 22.1, 21.9], delta=0.2)

# Получение точного значения СРЕДНЕКВАДРАТИЧНОГО ОТКЛОНЕНИЯ 
print(t.standard_deviation.value)
>>> 0.17638342073763963
# Получение округленного значения СРЕДНЕКВАДРАТИЧНОГО ОТКЛОНЕНИЯ
print(t.standard_deviation.round_value())
>>> 0.2
# Получение формулы вычисления LaTeX
print(t.standard_deviation.latex())
>>> S_{ t } = \sqrt{\frac{ \sum_{ i=1 }^{n} (\overline{ t } - { t }_{i})^2}{ n(n-1) }} = \sqrt{\frac{ (21,8 - 21,5)^2 + (21,8 - 22,1)^2 + (21,8 - 21,9)^2 }{ 3 \, (3 - 1) } } = 0,2

print(t.random_error.value)
>>> 0.7589778594340633
print(t.random_error.round_value())
>>> 0.8
print(t.random_error.latex())
>>> \Delta \, { t }_{\text{сл}} = t_{ 0,95, \, n-1 } \cdot S_{ t, \, n } = 4,303 \cdot 0,2 = 0,8

print(t.instrumental_error.value)
>>> 0.13066666666666668
print(t.instrumental_error.round_value())
>>> 0.1
print(t.instrumental_error.latex())
>>> \Delta \, { t }_{\text{пр}} = t_{ 0,95, \, \infty } \cdot \frac{ \delta_{ t } }{ 3 } = 1,96 \cdot \frac{ 0,2 }{ 3 } = 0,1

print(t.absolute_error.value)
>>> 0.7701436027708667
print(t.absolute_error.round_value())
>>> 0.8
print(t.absolute_error.latex())
>>> \Delta \, { t } = \sqrt{ { \Delta { t }_{\text{сл}} }^2 + { \Delta { t }_{\text{пр}} }^2 } = \sqrt{ { 0,8 }^2 + { 0,1 }^2 } = 0,8

В результате получаете как серию точных и округленных значений, так и формулу вычисления:

$$S_{ t } = \sqrt{\frac{ \sum_{ i=1 }^{n} (\overline{ t } - { t }{i})^2}{ n(n-1) }} = \sqrt{ \frac{ (21,8 - 21,5)^2 + (21,8 - 22,1)^2 + (21,8 - 21,9)^2 }{ 3 , (3 - 1) }} = 0,2\newline\Delta , { t }{\text{сл}} = t_{ 0,95, , n-1 } \cdot S_{ t, , n } = 4,303 \cdot 0,2 = 0,8\newline\Delta , { t }{\text{пр}} = t{ 0,95, , \infty } \cdot \frac{ \delta_{ t } }{ 3 } = 1,96 \cdot \frac{ 0,2 }{ 3 } = 0,1\newline\Delta , { t } = \sqrt{ { \Delta { t }{\text{сл}} }^2 + { \Delta { t }{\text{пр}} }^2 } = \sqrt{ { 0,8 }^2 + { 0,1 }^2 } = 0,8$$

Однако, если посторонний человек посмотрит такие формулы, у него могут возникнуть сомнения в верности вычисления. Это связано с тем, что при вычислении используются точные значения. Если вы хотите, чтобы в вычислениях участвовали значения округленные, нужно установить параметр класса Values(rounded=True):

from fabpy.dataclass import Values

t = Values(name='t', values=[21.5, 22.1, 21.9], delta=0.2, rounded=True)

print(t.absolute_error.value)
>>> 0.9055385138137417
print(t.absolute_error.round_value())
>>> 0.9
print(t.absolute_error.latex())
>>> \Delta \, { t } = \sqrt{ { \Delta { t }_{\text{сл}} }^2 + { \Delta { t }_{\text{пр}} }^2 } = \sqrt{ { 0,9 }^2 + { 0,1 }^2 } = 0,9

$$\Delta , { t } = \sqrt{ { \Delta { t }{\text{сл}} }^2 + { \Delta { t }{\text{пр}} }^2 } = \sqrt{ { 0,9 }^2 + { 0,1 }^2 } = 0,9$$

Косвенная погрешность

В качестве примера, возьму формулу для вычисления момента инерции из лабораторной работы "Матяник Обребека".

$$J = \frac{mgr^2(t_2 - t_1)^2}{h\left(1 - \frac{t_2}{t_1}\right)^2 + h'} - mr^2$$

Для начала заводим все данные в объект Values:

from fabpy import Values, Formula

# Создаем переменные эксперементальных измерений и констант
_R = [18.7, 18.7, 18.7]
_m = 190
_r = 1.75
_h = 150
_g = 980
_t_1 = [11.6, 11.1, 11.7]
_t_2 = [21.5, 22.1, 21.9]
_h__prime = [127.5, 127.5, 127.0]

# Создаем объекты Values
R = Values(name=f'R', values=_R, delta=0.1, rounded=True)
m = Values(name=f'm', values=_m, delta=0.5, use_random_error=False, rounded=True)
g = Values(name=f'g', values=_g, delta=0., use_instrumental_error=False, use_random_error=False, rounded=True)
r = Values(name=f"r", values=_r, delta=0.005, use_random_error=False, roundoff=3, rounded=True)
t_1 = Values(name=f"t_{{1}}", values=_t_1, delta=0.2, rounded=True)
t_2 = Values(name=f"t_{{2}}", values=_t_2, delta=0.2, rounded=True)
h = Values(name=f"h", values=_h, delta=0.1, use_random_error=False, rounded=True)
h__prime = Values(name=f"h'", values=_h__prime, delta=0.1, rounded=True)

Теперь нужно записать изначальную формулу, по которой будем считать ее значение и косвенную погрешность. Для этого создаем любую переменную и записываем формулу на подобии с библиотекой sympy, добавляя к переменным данных .sp, означающая что используется в качестве объекта sympy.

После чего заносим формулу и данные в объект Formula.

J = (m.sp * g.sp * r.sp**2 * (t_2.sp - t_1.sp)**2) / (h.sp * (1 - t_2.sp/t_1.sp)**2 + h__prime.sp) - m.sp * r.sp**2

f = Formula(J, [h__prime, R, m, g, r, t_1, t_2, h], 'J', rounded=True)

Объект Formula имеет следующие параметры:

  • formula - символьное выражение (тип sympy.Expr), представляющее формулу для вычисления;
  • data - список объектов Values, содержащих измеренные значения и их погрешности;
  • name - имя переменной, которое будет использоваться в формулах LaTeX (по умолчанию 't');
  • roundoff - количество знаков после запятой для округления (по умолчанию 1);
  • floating_point - символ разделителя десятичной части в LaTeX-выводе (по умолчанию ',');
  • rounded - использовать при расчетах округленные (по roundoff) или точные значения (по умолчанию False).

Теперь выведим формулу LaTeX:

print(f.latex())
print(f.value)
print(f.round_value())

>>> J = \frac{g m r^{2} \left(- t_{1} + t_{2}\right)^{2}}{h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'} - m r^{2} = \frac{1,75^{2} \cdot 190 \cdot 980 \left(- 11,5 + 21,8\right)^{2}}{127,3 + 150 \left(1 - \frac{21,8}{11,5}\right)^{2}} - 1,75^{2} \cdot 190 = 243721,
>>> 243721.156186329
>>> 243721.2

print(f.indetect_error.latex())
print(f.indetect_error.value)
print(f.indetect_error.round_value())

>>> \Delta{ J } = \sqrt{\frac{\Delta { h }^{2} g^{2} m^{2} r^{4} \left(1 - \frac{t_{2}}{t_{1}}\right)^{4} \left(- t_{1} + t_{2}\right)^{4}}{\left(h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'\right)^{4}} + \frac{\Delta { h' }^{2} g^{2} m^{2} r^{4} \left(- t_{1} + t_{2}\right)^{4}}{\left(h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'\right)^{4}} + \Delta { m }^{2} \left(\frac{g r^{2} \left(- t_{1} + t_{2}\right)^{2}}{h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'} - r^{2}\right)^{2} + \Delta { r }^{2} \left(\frac{2 g m r \left(- t_{1} + t_{2}\right)^{2}}{h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'} - 2 m r\right)^{2} + \Delta { t_{1} }^{2} \left(- \frac{2 g h m r^{2} t_{2} \left(1 - \frac{t_{2}}{t_{1}}\right) \left(- t_{1} + t_{2}\right)^{2}}{t_{1}^{2} \left(h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'\right)^{2}} + \frac{g m r^{2} \left(2 t_{1} - 2 t_{2}\right)}{h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'}\right)^{2} + \Delta { t_{2} }^{2} \left(\frac{2 g h m r^{2} \left(1 - \frac{t_{2}}{t_{1}}\right) \left(- t_{1} + t_{2}\right)^{2}}{t_{1} \left(h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'\right)^{2}} + \frac{g m r^{2} \left(- 2 t_{1} + 2 t_{2}\right)}{h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'}\right)^{2}} = \sqrt{0,003^{2} \left(\frac{2 \cdot 1,750 \cdot 190,0 \cdot 980,0 \left(- 11,5 + 21,8\right)^{2}}{127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}} - 2 \cdot 1,750 \cdot 190,0\right)^{2} + \frac{0,1^{2} \cdot 1,750^{4} \cdot 190,0^{2} \cdot 980,0^{2} \left(1 - \frac{21,8}{11,5}\right)^{4} \left(- 11,5 + 21,8\right)^{4}}{\left(127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}\right)^{4}} + 0,3^{2} \left(\frac{1,750^{2} \cdot 980,0 \left(- 11,5 + 21,8\right)^{2}}{127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}} - 1,750^{2}\right)^{2} + \frac{0,9^{2} \cdot 1,750^{4} \cdot 190,0^{2} \cdot 980,0^{2} \left(- 11,5 + 21,8\right)^{4}}{\left(127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}\right)^{4}} + 0,9^{2} \left(\frac{1,750^{2} \cdot 190,0 \cdot 980,0 \left(- 2 \cdot 11,5 + 2 \cdot 21,8\right)}{127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}} + \frac{2 \cdot 1,750^{2} \cdot 150,0 \cdot 190,0 \cdot 980,0 \left(1 - \frac{21,8}{11,5}\right) \left(- 11,5 + 21,8\right)^{2}}{11,5 \left(127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}\right)^{2}}\right)^{2} + 0,9^{2} \left(\frac{1,750^{2} \cdot 190,0 \cdot 980,0 \left(2 \cdot 11,5 - 2 \cdot 21,8\right)}{127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}} - \frac{2 \cdot 1,750^{2} \cdot 150,0 \cdot 190,0 \cdot 21,8 \cdot 980,0 \left(1 - \frac{21,8}{11,5}\right) \left(- 11,5 + 21,8\right)^{2}}{11,5^{2} \left(127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}\right)^{2}}\right)^{2}} = 22241,4
>>> 22241.44380543627
>>> 22241.4

$$J = \frac{g m r^{2} \left(- t_{1} + t_{2}\right)^{2}}{h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'} - m r^{2} = \frac{1,75^{2} \cdot 190 \cdot 980 \left(- 11,5 + 21,8\right)^{2}}{127,3 + 150 \left(1 - \frac{21,8}{11,5}\right)^{2}} - 1,75^{2} \cdot 190 = 243721$$

$$\Delta{ J } = \sqrt{\frac{\Delta { h }^{2} g^{2} m^{2} r^{4} \left(1 - \frac{t_{2}}{t_{1}}\right)^{4} \left(- t_{1} + t_{2}\right)^{4}}{\left(h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'\right)^{4}} + \frac{\Delta { h' }^{2} g^{2} m^{2} r^{4} \left(- t_{1} + t_{2}\right)^{4}}{\left(h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'\right)^{4}} + \Delta { m }^{2} \left(\frac{g r^{2} \left(- t_{1} + t_{2}\right)^{2}}{h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'} - r^{2}\right)^{2} + \Delta { r }^{2} \left(\frac{2 g m r \left(- t_{1} + t_{2}\right)^{2}}{h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'} - 2 m r\right)^{2} + \Delta { t_{1} }^{2} \left(- \frac{2 g h m r^{2} t_{2} \left(1 - \frac{t_{2}}{t_{1}}\right) \left(- t_{1} + t_{2}\right)^{2}}{t_{1}^{2} \left(h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'\right)^{2}} + \frac{g m r^{2} \left(2 t_{1} - 2 t_{2}\right)}{h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'}\right)^{2} + \Delta { t_{2} }^{2} \left(\frac{2 g h m r^{2} \left(1 - \frac{t_{2}}{t_{1}}\right) \left(- t_{1} + t_{2}\right)^{2}}{t_{1} \left(h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'\right)^{2}} + \frac{g m r^{2} \left(- 2 t_{1} + 2 t_{2}\right)}{h \left(1 - \frac{t_{2}}{t_{1}}\right)^{2} + h'}\right)^{2}} = \sqrt{0,003^{2} \left(\frac{2 \cdot 1,750 \cdot 190,0 \cdot 980,0 \left(- 11,5 + 21,8\right)^{2}}{127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}} - 2 \cdot 1,750 \cdot 190,0\right)^{2} + \frac{0,1^{2} \cdot 1,750^{4} \cdot 190,0^{2} \cdot 980,0^{2} \left(1 - \frac{21,8}{11,5}\right)^{4} \left(- 11,5 + 21,8\right)^{4}}{\left(127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}\right)^{4}} + 0,3^{2} \left(\frac{1,750^{2} \cdot 980,0 \left(- 11,5 + 21,8\right)^{2}}{127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}} - 1,750^{2}\right)^{2} + \frac{0,9^{2} \cdot 1,750^{4} \cdot 190,0^{2} \cdot 980,0^{2} \left(- 11,5 + 21,8\right)^{4}}{\left(127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}\right)^{4}} + 0,9^{2} \left(\frac{1,750^{2} \cdot 190,0 \cdot 980,0 \left(- 2 \cdot 11,5 + 2 \cdot 21,8\right)}{127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}} + \frac{2 \cdot 1,750^{2} \cdot 150,0 \cdot 190,0 \cdot 980,0 \left(1 - \frac{21,8}{11,5}\right) \left(- 11,5 + 21,8\right)^{2}}{11,5 \left(127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}\right)^{2}}\right)^{2} + 0,9^{2} \left(\frac{1,750^{2} \cdot 190,0 \cdot 980,0 \left(2 \cdot 11,5 - 2 \cdot 21,8\right)}{127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}} - \frac{2 \cdot 1,750^{2} \cdot 150,0 \cdot 190,0 \cdot 21,8 \cdot 980,0 \left(1 - \frac{21,8}{11,5}\right) \left(- 11,5 + 21,8\right)^{2}}{11,5^{2} \left(127,3 + 150,0 \left(1 - \frac{21,8}{11,5}\right)^{2}\right)^{2}}\right)^{2}} = 22241,4$$

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fabpy-1.0.1.tar.gz (14.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fabpy-1.0.1-py3-none-any.whl (13.8 kB view details)

Uploaded Python 3

File details

Details for the file fabpy-1.0.1.tar.gz.

File metadata

  • Download URL: fabpy-1.0.1.tar.gz
  • Upload date:
  • Size: 14.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.0

File hashes

Hashes for fabpy-1.0.1.tar.gz
Algorithm Hash digest
SHA256 849d68f46fe3de28446cdcdad31f177d8a0be507681044f62517e9946551a58b
MD5 89b25cd378e743eb728979f9100a9343
BLAKE2b-256 516ec5bb37a7c1a4e4834ac12491b334bc07024fd64dd2ff184f83c8a3199217

See more details on using hashes here.

File details

Details for the file fabpy-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: fabpy-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 13.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.0

File hashes

Hashes for fabpy-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4ef9b551d97df0ef4416082db9137c7147f25caed6146c7ec2d3d44b3f7b9787
MD5 8ef1268fec4780c49a1051c335b9a1d2
BLAKE2b-256 c1745fb314e3907bd16a32c83a762b4d6e197e9d2d89e0a543bbeb6649cc714f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page