时间到温度计算

时间:2013-06-24 11:08:09

标签: c# math time

这可能不是正确的地方,如果不是,请提前道歉。

我的情况 - 我需要想出一个简单的公式/方法,给它一个小时的时间。 13,15,01等,根据该数字,该方法将返回该特定时间的“近似”温度。

这是非常近似的,它不会使用天气数据或类似的东西,它只需要一天中的小时,并返回介于-6 deg C之间的值。 35摄氏度(极端天气,但你明白了。)

这是我想知道如何做的一些例子:

TimevsTemp

正如笔记一样,我可以使用一个由24个项目组成的丑陋数组,每个项目都引用该小时的临时值,但这需要基于浮点数 - 例如19.76应该返回9.25度...

另一个注意事项:我不想要一个完整的解决方案 - 我是一个有各种语言的自信程序员,但是数学确实让我难以理解。我已经尝试了使用TimeToPeak的纸张上的各种方法(高峰时间是下午1点或那里),但无济于事。在这一点上,任何帮助都将受到赞赏。

5 个答案:

答案 0 :(得分:3)

修改

根据您的评论,这是一个提供正弦分布的函数,其中包含各种有用的可选参数。

private static double SinDistribution(
    double value,
    double lowToHighMeanPoint = 0.0,
    double length = 10.0,
    double low = -1.0,
    double high = 1.0)
{
    var amplitude = (high - low) / 2;
    var mean = low + amplitude;
    return mean + (amplitude * Math.Sin(
        (((value - lowToHighMeanPoint) % length) / length) * 2 * Math.PI));
}

您可以像这样使用它来获得您想要的结果。

for (double i = 0.0; i < 24.0; i++)
{
    Console.WriteLine("{0}: {1}", i, SinDistribution(i, 6.5, 24.0, -6.0, 35.0));
}

这显然是对环境因素的折扣,并假设这一天是分点,但我认为它回答了这个问题。


所以,

double EstimatedTemperature(double hour, double[] distribution)
{
    var low = Math.Floor(hour);
    var lowIndex = (int)low;
    var highIndex = (int)Math.Ceiling(hour);

    if (highIndex > distribution.Count - 1)
    {
       highIndex = 0;
    }

    if (lowIndex < 0)
    {
        lowIndex = distribution.Count - 1;
    }  

    var lowValue = distribution.ElementAt(lowIndex);
    var highValue = distribution.ElementAt(highIndex);

    return lowValue + ((hour - low) * (highValue - lowValue));
}

假设分布中每个点之间的线性过渡相当简单。如果小时映射到分布中不存在的元素,则会得到错误的结果。

答案 1 :(得分:2)

对于任意数据点,我会使用已经提供的其他线性插值解决方案之一。

但是,这一特定数据集由triangle wave

生成
temp = 45*Math.Abs(2*((t-1)/24-Math.Floor((t-1)/24+.5)))-10;

答案 2 :(得分:1)

表格中的数据是从第13小时的峰值向上和向下线性变化,在第1小时是最小值。如果这是您想要的模型类型,那么很容易将其放入公式化解决方案中。您只需根据小时值在温度的两个极端之间执行线性插值。您将有两个数据点:

(xmin,ymin)as(hour-min,temp-min)

(xmax,ymax)as(hour-max,temp-max)

你将有两个形式的方程式:

enter image description here

这两个方程将使用(x0,y0)和(x1,y1)值作为上述两个数据点但是将它们应用于相反的分配(即峰值将是(x0,y0)在一个和(x1,y1) )在另一个等式中。

然后,您将根据小时值选择要使用的等式,将X值作为小时插入,并将温度值计算为Y.

您需要偏移方程中使用的X值,以便处理小时0和最小温度峰值发生之间的偏移。

答案 3 :(得分:1)

以下是如何使用函数中的一组简单值来执行此操作的示例,如果您愿意,可以将这些值添加为参数;

    public double GetTemp(double hour)
    {
        int min = 1;
        int max = min + 12;

        double lowest = -10;
        double highest = 35;

        double change = 3.75;

        return (hour > max) ? ((max - hour) * change) + highest : (hour < min) ? ((min - hour)*change) + lowest : ((hour - max) * change) + highest;
    }

我已根据您的示例对此进行了测试,并且它与19.75 = 9.6875一起使用。

没有检查输入的值是否在0-24之内,但您可以自己管理:)

答案 4 :(得分:0)

  1. 您可以使用简单的2点线性近似。尝试这样的事情:
  2.     function double hourTemp(double hour)
        {
           idx1 = round(hour); 
           idx2 = idx1 + 1;
           return (data[idx2] - data[idx1]) * (hour - idx1) + data[idx1];
        }
    
    1. 或者使用3,5或更多点来获得普通最小二乘法的多项式cofficients。
    2. 您的样本数据类似于sin函数,因此您可以使sin函数逼近。