Открыть список
Как стать автором
Обновить

Комментарии 11

Пост можно было бы сделать намного лучше, если бы вначале вставить параграф-другой про нечёткие треугольные числа: что это такое и с чем их едят. Я, например, мехмат, но впервые о них слышу. Осмелюсь на основании этого предположить, что очень большой процент читателей столкнётся с аналогичной трудностью.

Ну или ссылку хотя быть дать на описание. Я сразу подумал про фигурные числа, частным случаем которых являются треугольные. Но в топике, по-видимому, речь о другом.

Я даже не подумал про схожесть с фигурными числами… Да, действительно, речь не о них. Добавил две ссылки: на описание того, что такое нечеткое число и на описание того, что такое нечеткое треугольное число.
Спасибо! Добавил в начало статьи небольшой комментарий по поводу нечетких треугольных чисел. Пусть вас не смущает то, что операции над этими числами в статье реализованы несколько иначе, чем в приведенных ссылках — в мире пока нет абсолютно устоявшегося подхода (виной проблема постоянного «расплыва» нечеткости осуществлении вычислений). Просто цимус туториала в другом — на примере работы с нечеткими треугольными числами здесь показано как с помощью python + sympy вычислять символьные мат.выражения с нестандартными операциями. Вы можете описать собственный класс нестандартных мат.конструкций, переопределить операции над ними и воспользоваться sympy.lambdify для формирования лямбда-функции, воспринимающей вашу пользовательскую математику.
Ого, это можно использовать для вычислений с чиcлами типа a±∆a в виде (a-∆a, a, a+∆a).
PS: хотя для этого частного случая удобнее определить числа как (a, ∆a).
Можно, только обратите внимание на сами операции сложения/вычитания/умножения — мнения об их реализации расходятся, исследования еще идут, вероятно, еще будут идти… Вы можете изменить код на собственную реализацию.
Бегло просмотрел код и не вижу что не так с вашими операциями:
(a, ∆a) + (b, ∆b) = (a + b, ∆a + ∆b);
(a, ∆a) - (b, ∆b) = (a - b, ∆a + ∆b);
(a, ∆a) * (b, ∆b) = (a * b, abs(b)*∆a + abs(a)*∆b);
(a, ∆a) / (b, ∆b) = (a / b, (∆a + abs(a)*∆b / abs(b)) / abs(b));
(a, ∆a)n = (an, n * an-1 * ∆a);

Кроме отсутствующих последних двух операций, все соответствует данному частному случаю.
Все дело в растущем «расплыве», но это отдельная тема для беседы. Спасибо за полезный комментарий! Соответствие есть. Кстати, это хорошая мысль добавить перевод пары чисел (a, ∆a) в треугольное (a, b, c). Добавил в статью.
Ошибка в 4-ой строке должно быть:
(a, ∆a) / (b, ∆b) = (a * b, abs(b)*∆a + abs(a)*∆b);
Сложение, вычитание, умножение на константу — операции линейные, они сохраняют симметричность, а вот умножение и деление — нелинейные операции, они приводят к разной длине левого и правого «хвостов».
Конкретная реализация зависит от задачи, точнее от того, что означают для нас нечёткие числа. Если это — некая величина и её погрешность, типа a±∆a, где ∆a невелико, то при перемножении можно пользоваться приближенной формулой типа (a, ∆a) * (b, ∆b) = (a * b, abs(b)*∆a + abs(a)*∆b).
Например, вычисление (2, 0.1) * (3, 0.1) даст (6, 0.5).
Если «нечёткое число» — это заранее неизвестная величина, у которой известны «типичное» значение и интервал, за пределы которого она никогда не выходит, то оно будет представлено тремя параметрами (минимум, мода, максимум), которые могут принимать любые значения, лишь бы их последовательность была неубывающей. В этом случае для границ интервала придётся проводить точные вычисления, в т.ч. отслеживать переходы интервала через 0.
Для того же примера из двух симметричных чисел (1.9, 2, 2.1) * (2.9, 3, 3.1) точный результат равен (5.51, 6, 6.51) — он оказался несимметричным.
Ну а если нам важно количественно знать, как часто встречаются те или иные значения результата внутри интервала, то потребуются аналитические действия над случайными распределениями, там простое сложение двух случайных величин требует вычисления свёртки их плотностей распределения, и вообще всё становится очень сложно и затратно.
В этом комментарии прекрасно все! Жаль не могу поставить более одного плюсика…
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.