2016-02-12 67 views
0

我有一些功能:javascript數學公式。發現反

function calc_degree(a,b,c,cnt) { 
    if(cnt==0) { 
     return a; 
    } 
    b = b+c; 
    a = a-b; 
    return calc_degree(a,b,c,cnt-1); 
} 

不久,它Calcs(計算)的旋轉度一些cicle,其轉速增大順利。函數返回旋轉的摘要度數。例如:

calc_degree(0,0,1.5,6*1000/time_out); 
//a - start angle; b-value of increasing ratoation degree every tick. 
//c-increase value; time_out - interval of rotation. 

在此示例中,函數返回6秒的總旋轉角度。 那麼,如果我知道「a」和「cnt」,我該如何計算「c」參數?我需要獲得增加值,知道旋轉和時間/滴答的概要程度。如果我的「a」值是2790,則需要每次減少「c」值,最後一個值「a」必須爲零。

回答

0

使它成爲一個適當的遞歸,與指數和所有:

b[n] = b[n-1] + c => b[n] = b[0] + n*c 

a[n] = a[n-1] - b[n] = a[n-1] - b[0] - n*c 

結果

a[n] = a[0] - n*b[0] - n*(n+1)/2 * c 

這說明你如何獲得c如果a[0]=b[0]=0


要獲得a[n]=b[n]=0,你首先需要c=-b[0]/n,然後c=-a[n]/(n*(n-1)/2)。這隻適用於如果在開始2*a[0] == (n-1)*b[0]

+0

謝謝,我會嘗試你的算法)我會在這裏寫功能,如果它的工作) – Alexey

+0

嗯..我試圖意識到它,但它不工作。 'var all_d = calc_degree(0,0,1.5,3 * 1000/50); // 3秒鐘「a」= -2745; b = 90;' 因此,你的算法有一個「c」= 1.8970588235294117。 但我需要將值倒置6秒以獲得值:a = 0; B = 0;並且c值是錯誤的。哪裏有我的錯誤? 檢查我使用過'calc_degree(-2790,90,-1.897,6 * 1000/50);' – Alexey

+0

有一些小錯誤,'b'的新值用於更新'a'這將總和超過0 ... n-1轉換爲1 ... n之和。添加反轉公式,注意你需要'b [0] =(n-1)/ 2 * a [0]',然後'c = -b [0]/n'。 – LutzL

0

我還不能評論,所以我會在這裏添加它。 LutzL的答案是正確的。問題是,如果你爲問題添加了多個約束(在你的情況下需要a和b都爲0),你正在減少問題的自由度。在你的情況下,如果沒有LutzL在開始時提到的關係,你就不能平穩地進行歸零(既有a又有b 0)。你可以通過添加另一種平滑度來解決它(例如:c [n] = c [n-1] + d)。但是,那麼你將無法使a,b和c傾向於0而沒有額外的約束。

+0

好的,謝謝。我會繼續處理這個問題=) – Alexey