Экспоненциальное распределение значений между заданным диапазоном в Python - PullRequest
2 голосов
/ 25 октября 2019

У меня есть три переменные: Мин = 0,29, Макс = 6,52 и Центр = 2,10. Я хочу создать таблицу, которая распределяет эти данные на 100 значений в формате таблицы следующим образом:

enter image description here

Здесь это изображение можно разделитьна две части от 0 до 50 и от 50 до 100.

В первой части увеличение x против y для последующего значения выше между 1-10 против 10-20 и выше в 10-20 против 20-30 и т. Д.

Во второй части увеличение x против y для последующего значения ниже между 50-60 против 60-70 и ниже между 60-70 против 70-80 и т. Д.

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

Iпопытался использовать решение, указанное в ссылка , но не смог заставить его работать для моего случая. Любая помощь будет оценена.

1 Ответ

1 голос
/ 28 октября 2019

Каждая из двух экспоненциальных функций определяется 3 параметрами, но у вас есть только 2 точки, принадлежащие каждому. Одна возможность состоит в том, чтобы предоставить асимптотическое значение для обеих функций. Я вставлю свой код сюда, включая вывод всех формул, из-за нехватки времени - извините:

from math import exp, log
from matplotlib import pyplot as plt

X_MIN, X_CTR, X_MAX = 1, 50, 100
Y_MIN, Y_CTR, Y_MAX = 0.29, 2.10, 6.52

c1 = float(input(f"c1 (> {Y_CTR}): "))
c2 = float(input(f"c2 (< {Y_CTR}): "))
plot = input("plot? (y|n): ")[:1] in "yY"

# c1 - a1 * exp(-b1 * X_MIN) == Y_MIN  # with a1 > 0, b1 > 0, c1 > Y_CTR
# c1 - a1 * exp(-b1 * X_CTR) == Y_CTR
# c2 + a2 * exp( b2 * X_CTR) == Y_CTR  # with a2 > 0, b2 > 0, c2 < Y_CTR
# c2 + a2 * exp( b2 * X_MAX) == Y_MAX

# a1 * exp(-b1 * X_MIN) == c1 - Y_MIN
# a1 * exp(-b1 * X_CTR) == c1 - Y_CTR
# a2 * exp( b2 * X_CTR) == Y_CTR - c2
# a2 * exp( b2 * X_MAX) == Y_MAX - c2

# log(a1) - b1 * X_MIN == log(c1 - Y_MIN)
# log(a1) - b1 * X_CTR == log(c1 - Y_CTR)
# log(a2) + b2 * X_CTR == log(Y_CTR - c2)
# log(a2) + b2 * X_MAX == log(Y_MAX - c2)

# b1 * (X_CTR - X_MIN) == log(c1 - Y_MIN) - log(c1 - Y_CTR)
# b2 * (X_MAX - X_CTR) == log(Y_MAX - c2) - log(Y_CTR - c2)

b1 = (log(c1 - Y_MIN) - log(c1 - Y_CTR)) / (X_CTR - X_MIN)
b2 = (log(Y_MAX - c2) - log(Y_CTR - c2)) / (X_MAX - X_CTR)

# log(a1) == log(c1 - Y_MIN) + b1 * X_MIN
# log(a2) == log(Y_MAX - c2) - b2 * X_MAX

a1 = exp(log(c1 - Y_MIN) + b1 * X_MIN)
a2 = exp(log(Y_MAX - c2) - b2 * X_MAX)

x_lst = list(range(X_MIN, X_MAX+1))
y_lst = [c1 - a1 * exp(-b1 * x) if x < X_CTR else
         c2 + a2 * exp( b2 * x) for x in x_lst]

if plot:
    plt.plot(x_lst, y_lst)
    plt.grid(True)
    plt.show()
else:
    for x, y in zip(x_lst, y_lst):
        print(f"{x},{y:.14}")

Например, с этим вводом:

c1 (> 2.1): 2.13
c2 (< 2.1): 2.08
plot? (y|n): y

вывод:plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...