这可能不是正确的地方,如果不是,请提前道歉。
我的情况 - 我需要想出一个简单的公式/方法,给它一个小时的时间。 13,15,01等,根据该数字,该方法将返回该特定时间的“近似”温度。
这是非常近似的,它不会使用天气数据或类似的东西,它只需要一天中的小时,并返回介于-6 deg C之间的值。 35摄氏度(极端天气,但你明白了。)
这是我想知道如何做的一些例子:
正如笔记一样,我可以使用一个由24个项目组成的丑陋数组,每个项目都引用该小时的临时值,但这需要基于浮点数 - 例如19.76应该返回9.25度...
另一个注意事项:我不想要一个完整的解决方案 - 我是一个有各种语言的自信程序员,但是数学确实让我难以理解。我已经尝试了使用TimeToPeak的纸张上的各种方法(高峰时间是下午1点或那里),但无济于事。在这一点上,任何帮助都将受到赞赏。
答案 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)
你将有两个形式的方程式:
这两个方程将使用(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)
function double hourTemp(double hour)
{
idx1 = round(hour);
idx2 = idx1 + 1;
return (data[idx2] - data[idx1]) * (hour - idx1) + data[idx1];
}