Math 看起来像一个简单的绘图问题

Math 看起来像一个简单的绘图问题,math,graph,plot,Math,Graph,Plot,目前,我有一个控制,我需要添加设施,以应用各种敏锐度(或灵敏度)。这个问题最好用一幅图来说明: 正如你所看到的,我有X轴和Y轴,它们都有100的任意极限——这应该足以解释这个问题。目前,我的控件是红线(线性行为),但我想添加其他3条曲线(或更多)的功能,即如果控件更敏感,则设置将忽略线性设置,并选择其中一条。起点始终为0,终点始终为100 我知道指数太陡了,但似乎找不到前进的方向。有什么建议吗?您可能正在寻找类似的建议。二次/三次/四次插值应该给出问题中显示的曲线类型。您显示的三条曲线之间的差

目前,我有一个控制,我需要添加设施,以应用各种敏锐度(或灵敏度)。这个问题最好用一幅图来说明:

正如你所看到的,我有X轴和Y轴,它们都有100的任意极限——这应该足以解释这个问题。目前,我的控件是红线(线性行为),但我想添加其他3条曲线(或更多)的功能,即如果控件更敏感,则设置将忽略线性设置,并选择其中一条。起点始终为0,终点始终为100


我知道指数太陡了,但似乎找不到前进的方向。有什么建议吗?

您可能正在寻找类似的建议。二次/三次/四次插值应该给出问题中显示的曲线类型。您显示的三条曲线之间的差异可能仅通过调整系数(间接确定陡度)即可实现。

对于
x
从0到1的
y=x^p
曲线图将根据您的需要从1向上变化
p
(这将给出红线)。随着
p
的增加,曲线将被越来越多地“推入”
p
不必是整数


(你必须按比例从0到100,但我相信你能解决这个问题)

我提出一个简单的公式,(我相信)能满足你的需求。为了得到一个完整的“四分之一圆”,这是您的极端情况,您可以使用
(1-cos((x*pi)/(2*100)))*100

我建议你在y=x和y=(1-cos((x*pi)/(2*100))*100之间取一个加权平均值。例如,要获得非常接近线性(99%线性),请执行以下操作:

或者更一般地说,假设线性水平为L,在区间[0,1]内,则公式为:

y = L*x + (1-L)*[(1-cos((x*pi)/(2*100)))*100]

编辑:我将
cos(x/100)
更改为
cos((x*pi)/(2*100))
,因为要使cos结果在[1,0]范围内,x应该在[0,pi/2]范围内,而不是[0,1],对于最初的错误,我深表歉意。

我赞成Rax Olgud的一般想法,但有一个修改:

y = alpha * x + (1-alpha)*(f(x/100)*100)

其中f(0)=0,f(1)=1,f(x)是超线性的,但我不知道这个“四分之一圆”的概念是从哪里来的,也不知道为什么1-cos(x)是一个好的选择


我建议f(x)=xk,其中k=2,3,4,5,无论什么都可以为&alpha=0提供所需的陡度。选择一个k值作为固定数字,然后改变α以选择特定的曲线。

您所示的曲线看起来很像曲线。这里的想法是,范围的最小值和最大值与输入值保持一致,但中间是弯曲的,就像在图形中一样(我可能会注意到,这不是从余弦实现中得到的圆弧)

从图形上看,它如下所示:

public class SensitivityAdjuster {
    public SensitivityAdjuster() { }
    public SensitivityAdjuster(int level) {
        SetSensitivityLevel(level);
    }
    private double _Gamma = 1.0;
    public void SetSensitivityLevel(int level) {
        _Gamma = Math.Pow(1.5, level);
    }
    public double Adjust(double x) {
        return (Math.Pow((x / 100), _Gamma) * 100);
    }
}

(来源:)

因此,以此为灵感,这里的数学

如果x值在0到1之间,则函数相当简单:

y = f(x, gamma) = x ^ gamma
为缩放添加一个xmax值(即x=0到100),函数变为:

y = f(x, gamma) = ((x / xmax) ^ gamma) * xmax
或者:

y = f(x, gamma) = (x ^ gamma) / (xmax ^ (gamma - 1))
如果您想添加非零xmin,那么可以更进一步

当gamma为1时,直线始终是完全线性的(y=x)。如果x小于1,则曲线向上弯曲。如果x大于1,则曲线向下弯曲。gamma的倒数值将把该值转换回原始值(x=f(y,1/g)=f(f(x,g),1/g)

只需根据您自己的喜好和应用需要调整gamma的值。由于您希望为用户提供多个“灵敏度增强”选项,因此您可能希望为用户提供线性范围的选择,例如从-4(最低灵敏度)到0(无变化)到4(最高灵敏度),并使用幂函数缩放内部gamma值。换句话说,为用户提供(-4,-3,-2,-1,0,1,2,3,4)的选择,但将其转换为(5.06,3.38,2.25,1.50,1.00,0.67,0.44,0.30,0.20)的gamma值

用C#编写的代码可能如下所示:

public class SensitivityAdjuster {
    public SensitivityAdjuster() { }
    public SensitivityAdjuster(int level) {
        SetSensitivityLevel(level);
    }
    private double _Gamma = 1.0;
    public void SetSensitivityLevel(int level) {
        _Gamma = Math.Pow(1.5, level);
    }
    public double Adjust(double x) {
        return (Math.Pow((x / 100), _Gamma) * 100);
    }
}

要使用它,请创建一个新的灵敏度调整器,根据用户偏好设置灵敏度级别(使用构造函数或方法,并且-4到4可能是合理的级别值)并调用Adjust(x)获得调整后的输出值。如果您想要更宽或更窄的合理水平范围,您可以在SetSensitityLevel方法中减少或增加该1.5值。当然,100代表您的最大x值。

对于此类问题,我通常会从曲线中获取一些点,并通过曲线拟合程序将其抛出是的,外面有很多


通过尝试不同的模型,我学到了很多。通常,你可以得到一个非常简单的表达式来接近你的曲线。

我已经研究过了,插值,就像曲线拟合一样,是一种情况,你有几个或多个离散点,你正试图连接在一起。然后你可以使用m=x中的变化/y中的变化来区分。我的例子很简单,我想让用户输入一个变量,或者从一个包含陡峭、平均和温和(我知道的糟糕名称)的枚举中进行选择为了让他们选择曲线的陡度,就像关闭汽车上的牵引力控制,而不插值当前没有的点。我需要生成它们。谢谢,我将尝试这一点和AakashM的建议。为什么使用C标记?您的解决方案可能最终是C,但我看不到C的问题。删除标签…解释你想要的行为。(除了起点/终点)它是指数型的?多项式型的?对数型的?看起来0附近的斜率是线性的,然后根据需要向上缩放以满足端点……或者线性和其他东西之间的插值。为了便于其他人搜索站点,您可能希望将标题改为“What Is a good mat”(什么是好的mat