Как исправить ZeroDivisionError при использовании пакета неопределенностей? - PullRequest
1 голос
/ 16 апреля 2020

У меня есть два unumpy массива:

A= [390.9999999999952+/-19.77371993328507
 129.99999999999932+/-11.40175425099135
 34.99999999999997+/-5.9160797830996135
 4.999999999999999+/-2.2360679774997894 0.0+/-0 0.0+/-0
 4.999999999999999+/-2.2360679774997894]
B= [33.999999999999964+/-5.830951894845297
 17.33333333333334+/-4.163331998932266
 9.666666666666666+/-3.1091263510296048
 4.999999999999999+/-2.2360679774997894 0.0+/-nan 0.0+/-nan
 4.999999999999999+/-2.2360679774997894]

Я хотел бы распространять их ошибки при вычислении ошибки в среднем соотношении через:

fraction = np.where(unumpy.nominal_values(A) > 0, unumpy.std_devs(B/A), np.nan)

Но я не знаю, как исправить следующую ошибку, которую я получаю:

Traceback (most recent call last):
  File "my_code4.py", line 2076, in <module>
    fraction =            np.where(unumpy.nominal_values(A) > 0, unumpy.std_devs(B/A), np.nan)
  File "/home/username/anaconda3/lib/python3.6/site-packages/uncertainties/core.py", line 661, in f_with_affine_output
    f_nominal_value = f(*args_values, **kwargs)
ZeroDivisionError: float division by zero

Ответы [ 3 ]

1 голос
/ 22 апреля 2020

Замените все нули на некоторое значение epsilon ( т.е. : 1e-9 или 1e-7) A.clip(1e-9)

fraction = np.where(unumpy.nominal_values(A) > 0, unumpy.std_devs(B/A.clip(1e-9)), np.nan)
1 голос
/ 21 апреля 2020

0 имеет физическое значение наверняка. Но для вычислений Computer Science не может обрабатывать NaN или Inf, поскольку они неопределенны. Так обычно, как мы обрабатываем эту математическую ошибку, добавляя небольшое значение. Что не окажет большого влияния.

Обычно во многих математических библиотеках они обрабатывают, как показано ниже:

Допустим, у нас есть матрица / вектор A, который может содержать 0. И я собираюсь разделить другой матрицей. Поэтому перед этим мы можем выполнить предварительную обработку ниже.

import sys
eps = sys.float_info.epsilon

A+=eps

Это добавит очень маленькое значение, например 2.220446049250313e-16, ко всем элементам. таким образом, ваше распределение матрицы будет сохранено.

Надеюсь, это поможет. :)

0 голосов
/ 23 апреля 2020

Я решил эту проблему с помощью следующих изменений в строке выше: То, что я сделал, было в основном распространение ошибки путем деления двух значений, где ошибки в двух параметрах добавляются в квадратуре из первого принципа.

fraction = np.where(unumpy.nominal_values(B) * unumpy.nominal_values(A) > 0, (unumpy.nominal_values(B)/unumpy.nominal_values(A)) * np.sqrt(np.sum(np.square([unumpy.std_devs(B)/unumpy.nominal_values(B), unumpy.std_devs(A)/unumpy.nominal_values(A)]), axis=0)), 0.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...