簡體   English   中英

Python 中給定范圍內值的指數分布

[英]Exponential distribution of values between a given range in Python

我有三個變量 Min=0.29、Max=6.52 和 center = 2.10。 我希望創建一個表格,以下列方式將這些數據分配到表格格式的 100 個值中:

在此處輸入圖像描述

在這里,該圖像可以分為兩部分,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 中實現它。

我嘗試使用鏈接中給出的解決方案,但無法讓它適用於我的情況。 任何幫助將不勝感激。

兩個指數函數中的每一個都由 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

output 是: 陰謀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM