Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++Builder] Регулятор


Автор: Bondleha 24.10.2011, 20:15
Суть проблемы такая!! Делаю курсовой!! Расчитываю регулятор!! Нужно получить оптимальные настройки!! НЕ пойму выскакивает ошибка"OverFlow"не могу ввести точно и начальные настройки подскажите в чем дело за ранее благодарен!!
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <math.h>
#define N 850

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int ch=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Series1->Clear();
       double q_0=StrToFloat(Edit6->Text),
              q_1=StrToFloat(Edit7->Text),
              q_2=StrToFloat(Edit8->Text);

    double a_1=StrToFloat(Edit1->Text),
              a_2=StrToFloat(Edit2->Text),
              b1=StrToFloat(Edit4->Text),
              b2=StrToFloat(Edit4->Text),
              eps=StrToFloat(Edit9->Text);
        long int n=N,i,j;
        int mc=4;
double e[N],u[N],h0,h1,h2,yq_0[N],yq_1[N],yq_2[N],uq_0[N],uq_1[N],
           uq_2[N],z=5,yz[N];
   double s1=0,s2=0,s3=0,s4=0,s5=0,s6=0,y[N];
 double dj;
  //начальные условия
        for(i=1;i<=mc;i++)
        {
                y[i]=0;
            yq_0[i]=0;
            yq_1[i]=0;
            yq_2[i]=0;
                e[i]=0;

         }
         for(i=1;i<=mc-1;i++)
      {
            yz[i]=0;
            u[i]=0;
            uq_0[i]=0;
            uq_1[i]=0;
            uq_2[i]=0;
      }
           for(i=mc;i<=n;i++) yz[i]=z;
        h0=0.003;
        h1=0.003;
        h2=0.003;
        j=1;
        label:
        s1=s2=s3=0;
        ch++;
        for(i=mc;i<n;i++)
        {
                e[i]=yz[i]-y[i];
                u[i]=u[i-1]+q_0*e[i]+q_1*e[i-1]+q_2*e[i-2];
                y[i]=a_1*y[i-1]+a_2*y[i-2]+b1*u[i]+b2*u[i-1];

                uq_0[i]=uq_0[i-1]+ e[i] +q_0*(-yq_0[i])+q_1*(-yq_0[i-1])+q_2*(-yq_0[i-2]);
                uq_1[i]=uq_1[i-1]+e[i-1]+q_0*(-yq_1[i])+q_1*(-yq_1[i-1])+q_2*(-yq_1[i-2]);
                uq_2[i]=uq_2[i-1]+e[i-2]+q_0*(-yq_2[i])+q_1*(-yq_2[i-1])+q_2*(-yq_2[i-2]);

                yq_0[i+1]=a_1*yq_0[i-1]+a_2*yq_0[i-2]+b1*uq_0[i]+b2*uq_0[i-1];
                yq_1[i+1]=a_1*yq_1[i-1]+a_2*yq_1[i-2]+b1*uq_1[i]+b2*uq_1[i-1];
                yq_2[i+1]=a_1*yq_2[i-1]+a_2*yq_2[i-2]+b1*uq_2[i]+b2*uq_2[i-1];

                s1+=(yz[i]-y[i])*(-yq_0[i]);
                s2+=(yz[i]-y[i])*(-yq_1[i]);
                s3+=(yz[i]-y[i])*(-yq_2[i]);
                }
        dj=sqrt(pow(s1,2)+pow(s2,2)+pow(s3,2));
        Memo1->Lines->Add(dj);
         if(dj>eps)
    {
                if(j != 1)
            {
                        if((s1*s4) > 0)h0=h0*1.9;
                    else h0=h0/3.;
                    if((s2*s5) > 0)h1=h1*1.9;
                    else h1=h1/3.;
                    if((s3*s6) > 0)h2=h2*1.9;
                    else h2=h2/3.;
                }
                else
                {
                        h0=0.0003;
                        h1=0.0003;
                        h2=0.0003;
                }
                q_0=q_0-h0*s1/dj;
                q_1=q_1-h1*s2/dj;
                q_2=q_2-h2*s3/dj;
                j++;
                s4=s1;
                s5=s2;
                s6=s3;
                goto label;
        }
        double q0=floor(q_0*1000000);
       double q1=floor(q_1*1000000);
        double q2=floor(q_2*1000000);
        Edit10->Text=FloatToStr(q0/1000000);
        Edit11->Text=FloatToStr(q1/1000000);
        Edit12->Text=FloatToStr(q2/1000000);
        Edit13->Text=FloatToStr(dj);
        Label3->Caption="Оптимум достигнут!";
        Edit14->Text=IntToStr(ch);
        for(i=mc;i<floor(n/2);i++)
        {
                e[i]=yz[i]-y[i];
                u[i]=u[i-1]+q_0*e[i]+q_1*e[i-1]+q_2*e[i-2];
                y[i]=a_1*y[i-1]+a_2*y[i-2]+b1*u[i]+b2*u[i-1];;

        }
        for(i=1;i<floor(n/2);i++)
        {
                Series1->AddXY(i,y[i],"",clBlack);
        }


}
//---------------------------------------------------------------------------


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)