2013-06-24 83 views
0

這可能不是這樣做的正確的地方,所以提前道歉,如果事實並非如此。時間溫度計算

我的情況 - 我需要拿出的給它一個小時,例如一個簡單的公式/方法13,15,01等,並根據該數字,該方法將返回該特定時間的「大約」溫度。

這是非常近似的,它不會使用氣象數據之類的東西,只是會需要一天的時間,說之間的返回值-6攝氏度> 35℃(非常極端的天氣,但你的想法)

這是哪門子的例子,我想知道怎麼做:

TimevsTemp

正如一個音符,我可以使用的24個項目的醜陋陣列,每個引用那個小時的溫度,但是這需要基於float的 - 例如19.76應該返回9.25度......

另注:我不想要一個完整的解決方案 - 我在各種語言的自信程序員,但數學真的難倒我在此。我已經使用TimeToPeak(高峯時段爲下午1點或者身邊有),但無濟於事試圖在紙上的各種方法。任何幫助將不勝感激在這一點上。

+2

寫類將有24個元素,其中你將有每小時值的數組。添加一個需要浮動的函數。取整數和它的分數,並且(取決於你需要的分佈)選擇正確的溫度。我沒有看到任何複雜的;) –

+1

不應該19.76回到9.25左右? –

+0

@ElRonnoco - 是的,我給了一個(非常差)的近似值。 – verenion

回答

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

然而,這並不能解決有24個溫度值的問題。 – Sander

+0

@桑德爾我明白你的觀點。 – Jodrell

+0

這是一個簡單的解決方案,可能會工作得很好 - 但我不想使用一組值。這是爲了一個遊戲,當玩家在不同的「區域」中漫遊時,不同的最大值和最小值時,我不希望改變一系列值。 無論如何,這是一個很好的解決方案。 – verenion

0
  1. 您可以使用簡單的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. 類似正弦函數這樣就可以使正弦函數逼近你的樣本數據。
1

表中的數據從小時13的峯值和小時1的最小值呈線性上升和下降。如果這是您想要的模型類型,那麼這很容易放入公式化解決方案中。您只需簡單地根據小時值在兩個極端溫度之間執行線性插值。您將有兩個數據點:

(XMIN,YMIN)爲(小時分鐘,溫敏)

(XMAX,YMAX)爲(小時最大值,溫度-MAX)

你將具有以下形式的兩個等式:

enter image description here

這兩個方程將使用(X0,Y0)和(X1,Y1)的值作爲上面的兩個數據點,但應用這些相反的分配(即峯在另一個方程中將是(x0,y0),而在另一個方程中將是(x1,y1)

然後,您將根據小時值選擇要使用的公式,插入X值作爲小時,並計算Y作爲溫度值。

您將需要偏移等式中使用的X值,以便您注意小時0與最小溫度峯值發生位置之間的偏移量。

+0

這聽起來很完美。然而,我的數學會讓我失望 - 我是一個自信的程序員,而不是數學家。有什麼地方可以解釋這是一個白癡嗎? – verenion

+0

這是基本上只是說 - 如果小時低於峯值,最低溫度和最高溫度之間的lerp。如果高於峯值,則在最大溫度和最小溫度之間翻轉lerp左右的值? – verenion

+0

@brighterdean - 是的。這幾乎是那麼簡單。但是,您需要抵消小時,以考慮最低溫度發生在小時1的事實。 –

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,但是,或許您可以管理自己:)

2

對於任意的數據點,我將與其他線性插值的解決方案之一是去已經提供。

然而,由triangle wave產生的數據的這套特殊:

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

該死的,那很乾淨。 – Sander

+0

該死的,這個答案太小了,我差點錯過了。有這個公式很好,但是有沒有人有機會解釋它背後的數學? – verenion

+0

悲傷但真實。如果您輕鬆解決某個人推出解決方案的方法,您將永遠無法提升您的知識水平。 –