addResponsesメソッド

この例の目的は、変位、速度、および加速度のRMS値が最小になる設計を見出すことです。このRMS信号は次の式で求めることができます。(1)
R 1 = 0 T x 2 d t R 2 = 0 T x ˙ 2 d t R 3 = 0 T x ¨ 2 d t MathType@MTEF@5@5@+= feaagKart1ev2aqatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLn hiov2DGi1BTfMBaeXatLxBI9gBaerbd9wDYLwzYbItLDharqqtubsr 4rNCHbGeaGqiVu0Je9sqqrpepC0xbbL8F4rqqrFfpeea0xe9Lq=Jc9 vqaqpepm0xbba9pwe9Q8fs0=yqaqpepae9pg0FirpepeKkFr0xfr=x fr=xb9adbaqaaeGaciGaaiaabeqaamaabaabaaGceaqabeaaqqaaaa aaOpGqSvxza8qacaWGsbGaaGymaiabg2da9maapehabaGaamiEamaa CaaaleqabaGaaGOmaaaakiaadsgacaWG0baaleaacaaIWaaabaGaam ivaaqdcqGHRiI8aaGcbaGaamOuaiaaikdacqGH9aqpdaWdXbqaaiqa dIhagaGaamaaCaaaleqabaGaaGOmaaaakiaadsgacaWG0baaleaaca aIWaaabaGaamivaaqdcqGHRiI8aaGcpaqaa8qacaWGsbGaaG4maiab g2da9maapehabaGabmiEayaadaWaaWbaaSqabeaacaaIYaaaaOGaam izaiaadshaaSqaaiaaicdaaeaacaWGubaaniabgUIiYdaaaaa@5811@

これらの値を定義するために、RMS2タイプの3つの応答が作成されます。目的は、これら3つの応答の合計(R1 + R2 + R3)を最小にすることです。

また、応答タイプResponseExpressionに基づく制約条件を作成して、PIDコントローラの利得が無限に高くならないようにします。この制約条件の形式は次のとおりです。(2)
φ 1 k P : 2 k I 2 k D 2 < 0 MathType@MTEF@5@5@+= feaagKart1ev2aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbdfwBIj xAHbstHrhAaerbuLwBLnhiov2DGi1BTfMBaeXafv3ySLgzGmvETj2B Sbqefm0B1jxALjhiov2Daebbfv3ySLgzGueE0jxyaibaieYlf9irVe eu0dXdh9vqqj=hEeeu0xXdHaf9frFj0=OqFfea0dXdd9vqaq=JfrVk FHe9pgea0dXdar=Jb9hs0dXdbPYxe9vr0=vr0=vqpWqaciaacaWadm aadaGaciaaeeGabuaaaOaeeaaaaaa6dieB1vgapeqaaeXatLxBI9gB aGGbciab=z8aQjablYLiajaabgdacqGHsislcaqGRbWaa0baaSqaai aabcfacaGG6aaabaGaaeOmaaaakiabgkHiTiaabUgadaqhaaWcbaGa aeysaaqaaiaabkdaaaGccqGHsislcaqGRbWaa0baaSqaaiaabseaae aacaqGYaaaaOGaeyipaWJaaGimaaaa@54F1@

このモデルのaddResponsesメソッドを以下に示します。

  def addResponse(self, time):
    """
    We minimize the influence of disturbance on the block
    R1: Integral(acceleration**2,time)
    R2: Integral(velocity**2,time)
    R3: Integral(Displacement**2,time)
    R4: Constraint (1 - kp**2 - ki**2 - kd**2 < 0)
    """
    # Define the desired profile
    zero_vector = [0.0 for i in time]
    targetValue = zip(time,zero_vector)

    # Measure the RMS acceleration deviation from desired
    expr = 'ACCZ({I},{J})'.format(I=self.block.cm.id, J=self.rm.id)
    self.R1 = RMS2 (
      label         ='acceleration',
      targetValue   = targetValue, 
      measuredValue = expr,
      )

    # Measure the RMS velocity deviation from desired
    expr = 'VZ({I},{J})'.format(I=self.block.cm.id,J=self.rm.id)
    self.R2 = RMS2 (
      label         = 'velocity',
      targetValue   = targetValue,
      measuredValue = expr,
      )

    # Measure the RMS displacement deviation from desired
    expr = 'DZ({I},{J})'.format(I=self.block.cm.id,J=self.rm.id)
    self.R3 = RMS2 (
      label         = 'displacement',
      targetValue   = targetValue, 
      measuredValue = expr,
      )

    # The constraint
    self.R4 = ResponseExpression(
      label='sum of squares',
      function = '1 - kp**2 - kd**2 - ki**2',
      symbols = ["kp", "kd", "ki"],
      variables = [self.dv_kp, self.dv_kd, self.dv_ki]
      )