你好, 在GOOGLE PID用法時碰巧看到您的文章, 所以用C#與法試寫了一個: private int counter = 0; private bool flag = true; private Queue FIFO = new Queue(); private float answer; public float add_new(float current_data) { switch (flag) { case true: FIFO.Enqueue(current_data); if (counter == 9) { flag = false; answer = FIFO.Average(); } else { counter++; answer = 0; } break; default: FIFO.Dequeue(); FIFO.Enqueue(current_data); answer = FIFO.Average(); break; } return answer; }
fu-i 你好,PID 確實是本格文章閱覽率最高的,很高興認識你,謝謝提供程式範例。
我想以下的演算法可能效率高些先 count 數值個數, 1. n <10 不計算2. n>=10, 今天的 MV = (X1 + X2...+X10)/10, 往前回推10個值計算平均值 昨天的 MV(1) = MV+(-X1 + X11)/10, 今天的MV值 (減 昨日值 加前11日值)/10好處是效率高些,壞處是後人比較不好 re-use 這個 function.
行天下,你總是會提供令人料想不到的方法,這方式不錯,倒過來算,然後又減少計算量。
你好, 在GOOGLE PID用法時碰巧看到您的文章, 所以用C#與法試寫了一個:
回覆刪除private int counter = 0;
private bool flag = true;
private Queue FIFO = new Queue();
private float answer;
public float add_new(float current_data)
{
switch (flag)
{
case true:
FIFO.Enqueue(current_data);
if (counter == 9)
{
flag = false;
answer = FIFO.Average();
}
else
{
counter++;
answer = 0;
}
break;
default:
FIFO.Dequeue();
FIFO.Enqueue(current_data);
answer = FIFO.Average();
break;
}
return answer;
}
fu-i 你好,
刪除PID 確實是本格文章閱覽率最高的,很高興認識你,謝謝提供程式範例。
我想以下的演算法可能效率高些
回覆刪除先 count 數值個數,
1. n <10 不計算
2. n>=10,
今天的 MV = (X1 + X2...+X10)/10, 往前回推10個值計算平均值
昨天的 MV(1) = MV+(-X1 + X11)/10, 今天的MV值 (減 昨日值 加前11日值)/10
好處是效率高些,壞處是後人比較不好 re-use 這個 function.
行天下,
刪除你總是會提供令人料想不到的方法,這方式不錯,倒過來算,然後又減少計算量。