计算对数百分比

问题描述 投票:0回答:5

我有一个应用程序监视多个数据点,并且我正在根据线性百分比绿色、黄色和红色之间的褪色执行着色。然而,这并不能准确地形象化问题,因为数字越高,问题就越严重。范围是 0 -> 30000,我怎样才能生成我认为的对数百分比值而不是线性百分比值?

c# c#-4.0 math logarithm
5个回答
10
投票

我假设通过“对数百分比”,您希望以对数为基础将数据映射到范围 [0, 100]。你可以尝试这样的事情:

double Scale(int val)
{
    if (val <= 1)
        return 0; // log is undefined for 0, log(1) = 0
    return 100 * Math.Log(val) / Math.Log(30000);
}

4
投票

使用以下形式的函数。

f(x) = s bx / 30000 + t

我们知道 0 应该映射到 0%,30000 应该映射到 100%。

f(0) = 0
f(30000) = 100

这意味着以下方程组。

s + t = 0
s b + t = 100

解决方案(关于b)如下。

s = 100 / (b - 1)
t = -100 / (b - 1)

选择一个特定的 b > 1 值(假设 b = 10)。然后你会得到以下解决方案。

s = 100 / 9
t = -100 / 9

也就是说,函数f(x)如下。

f(x) = (100 10x / 30000 - 100) / 9

您可以在此处查看此函数的图:Wolfram Alpha

在 C# 中,这将如下所示。

double x = ...;

double b = 10.0;
double s = 100.0 / (b - 1);
double t = -100.0 / (b - 1);

double f = s * Math.Pow(b, x / 30000.0) + t;

2
投票

改进bmm6o的答案:

public static double Scale(long value, long maxInputValue, long maxOutputValue)
{
    if (value <= 1)
        return 0; // log is undefined for 0, log(1) = 0
    return maxOutputValue * Math.Log(value) / Math.Log(maxInputValue);
}

如果您正在寻找线性和对数之间的东西,以下内容可能会有所帮助:

public static double Scale(long value, long maxInputValue, long maxOutputValue, double scaleFactor)
{
    if (value <= 1)
        return 0; // log is undefined for 0, log(1) = 0
    return maxOutputValue * Math.Pow(Math.Log(value), scaleFactor) / Math.Pow(Math.Log(maxInputValue), scaleFactor);
}

0
投票

使用

Math.Log(double)
(或
Math.Log(double, double)
,如果您想使用基数)来获取值的对数,然后您可以将其映射到颜色值。


0
投票

挤出机及其分类 挤出机是用于挤出加工的设备。 食品挤压机可设计用于执行多个单元 同时进行操作,包括混合或均化, 剪切、淀粉糊化、蛋白质变性、 组织化、酶失活、热烹饪、 巴氏灭菌、脱水、成型和粉碎 (阿赫塔尔等人,2015)[2]。挤出机主要由五部分组成 部件: (i) 预调节系统; (ii) 饲喂系统; (iii) 螺杆或蜗杆; (iv) 桶; (v) 模具和 切割机构。它们可能因螺丝而异, 机筒和模具配置。其中每一项的选择 项目将取决于所使用的原材料和最终的 所需的产品(Riaz,2000)[27]。 (i) 预调节:通过蒸汽或 水并手动混合。此法适用于潮湿时 含量约20%至30%,且停留时间长 材料被使用。预处理有利于均匀颗粒 水合作用,减少在挤出机内的保留时间 由于减少了磨损,提高了吞吐量 机筒和螺杆组件增加了使用寿命 设备并减少 t

© www.soinside.com 2019 - 2024. All rights reserved.