2015-11-16 3 views
6

これが適切な場所であるかどうかは完全にはわかりません。さて、それは私が推測するプログラミングの問題です。なぜ低デルタが私のPIDコントローラの精度を低く調整しますか?


Javaで簡単なPIDコントローラシミュレーションを作成しようとしています。

要するに、目標値と現在の値があります。現在の値は数値で変更されます。 PIDコントローラに現在の値を指定し、現在の値が目標値に近づくように数値を返そうとします。残業時間が長いほど、PIDコントローラーを使用するほど、積分と微分を使用して「学習」され、最終的にはより正確な値が返されます。これは、例えば、車輪の動きを制御することによってボートの平衡を維持するために有用である。


PIDコントローラで使用される公式はかなり一般的で非常に簡単です。以下の例では、PIDコントローラから返される値は現在の値に単純に加算されます。私はそれがより複雑なアプリケーション(乗算や除算などを含む)で動作すると仮定します。これは私のプログラムです:

public class PID { 

    private static double Kp = 0.1; 
    private static double Kd = 0.01; 
    private static double Ki = 0.005; 

    private static double targetValue = 100.0; 
    private static double currentValue = 1.0; 

    private static double integral = 0.0; 
    private static double previousError = 0.0; 

    private static double dt = 0.5; 

    private static double max = 5; 
    private static double min = -5; 

    public static void main(String[] args) throws Exception { 
     while (true) { 
      Thread.sleep((long) (1000.0 * dt)); 
      double error  = targetValue - currentValue; 
      double derivative = 0.0; 
      double output  = 0.0; 
      integral = integral + error * dt; 
      derivative   = (error - previousError)/dt; 
      output    = Kp * error + Ki * integral + Kd * derivative; 
      previousError   = error; 
      if (output > max) output = max; 
      if (output < min) output = min; 

      // Apply the output to the current value: 
      System.out.println(currentValue + " + " + output + " = " + (currentValue + output)); 
      currentValue += output; 
     } 
    } 

} 

これを実行すると、あなたはPIDコントローラは、最終的に現在値が目標値に非常に非常に近いことが原因と管理していることがわかります。

これはかなりクールです。さて、私は結果を少し速くしたいと思っていました。私は何らかのインタラクティブなグラフを作ろうとしていますから、デルタdt0.1に変更することにしました。

悲しいことに、結果の値はもはや100に近くなりません!今は105に達しているように見えますが、非常にがゆっくりとに減少して100になります。

ここで、dt0.01に設定したとします。今は102に達するのが非常に遅いですが、今は100に戻っていません。今では増加し続けています!

私の質問は次のとおりです。これはなぜデルタが低いのですか?

私のコードはthis PDF documentに基づいており、それは0.01を使用してください。

+0

あなたの質問はこの[サイト](http://math.stackexchange.com/search?q= [control-theory] ​​+ PID +コントローラ)に適していると思います。 – user3707125

答えて

1

非常に簡単ですが、あなたは完全なワインドアップを得ています。

を参照してください、「積分」が成長に限定されるものではなく、しかし、あなたは

多くのソリューションがありますが、私のダンプの修正が間の整数制限することがある[5、-5]の範囲にあることが出力の影響を制限最小および最大。誘導体を制限0.5、0.1と0.01のループ時間と桁より大きくオーバーシュート(だけでなく、誘導体制限)何がないことを修正して

「誘導体防止するために使用したのと同じトリックを使用することによって修正することができますキック ":エラーの違いではなく、先行と実際の値の差を使用します。

しかし、任意の値のdtをできるだけ早くシミュレートする必要がある場合は、ただ単に睡眠にコメントするだけです。

+0

-5から5の間の整数値を制限すると、コントローラーは '5.0'を出力し続けてから' -4.9999 ... 'を出力し、 '100'と' 95'の間で値を振動させます。 – Voldemort

+1

linkコードにどうぞ!あなたは何を使っていますか? – Lesto

+0

'dt = 0.01'とし、積分を設定した後、if(integral> max)integral = max;およびif(integral Voldemort

0

デルタ(dt)を変更すると、システムのサンプリングだけが変更されます。遅いシステムの場合、バーチャルをあまりにも変えるべきではありませんが、システム回答シミュレーションは非常に速いものです(実際には遅延がありますが、出力は即時に入力されます)。したがって、サンプリング周波数(またはデルタ時間)はPIDの動作に影響を与えます。

はまた、式は

currentValue +=output 

の振る舞い例えば、ボートコントロールホイールの動作ではありません統合1、としてあなたのシステムを作ることに注意を払います。これがオーバーシュートを回復するのに長い時間を要する理由です。

実生活のPIDには、アンチワインドアップ、微分フィルタなど、いくつかの重要な処理があります。私は、このシリーズの方程式が理解しやすく、手動で調整することも考えています。シリーズ方程式は、ISA標準でもあり、商用機器で最も使用される方程式です。

関連する問題