Воскресенье, 05.05.2024, 00:28
Главная Регистрация RSS
Приветствую Вас, Гость
Меню сайта
Категории раздела
Форма входа
ДРУЗЬЯ САЙТА

Вызвать мастера в Красноярске

8 983 207 5474

8 902 918 9334

8 933 332 3164

---------------------------------

Запчасти бытткхники

  • Велес т.2935600
  • СЦ Близнецов т.2296595
  • Вираж
  • Красраб 110 т.2589503
  • Комплекстур Щорса30 т.2606797
  • Радиодетали

  • Якорный 9 т.2688317
  • Воронова 16 т.2202990
  • Красраб 125а т.2456544
  • Профи т.2702737
  • Дайте две т.+79237713323
  • Электрика

  • Электро +
  • Планета электрика
  • ЗАКЛАДКИ
    Поиск
    Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Главная » Статьи » C++ Builder » Простые примеры

    Интерполяция полиномом Лагранжа и Ньютона

    Интерполяция полиномом Лагранжа и Ньютона

    исходник и исполняемый файл здесь

    Кривые построенные полиномами смещены от действительных

    значений; Лагранжа в верх Ньютона в низ 

    =

    =

    =

    =

    =

    #include <vcl.h>
    #pragma hdrstop

    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //----------------------------------------------------------------------------

      int const static count=100;
    //-------------------------------------------------------------------
        struct point //Структура точки
            {
                public:
                float X, Y; //Машинные координаты
                float x, y; //Реальные координаты
            };
    //---------------------------------------------------------------------------
       //Координаты исходных точек. Значение x и y должны быть по модулю не больше 30.
             float Pts[count][2] = { { -2.36, 2.06 },
                                     { -1.35, -0.54 },
                                     { 0.84, 1.28 },
                                     { 3.12, -0.58 },
                                  /*   { 8.6, -4.0 },
                                     { 0.0, -4.5},
                                      { -4.0, -4.5},
                                     {4.0, 2.8},
                                     {14.2, 12.6},
                                     {17.0, 24.5},
                                     {21.0, 26.0} */
                                   };
    //---------------------------------------------------------------------------
      point Points[count];  //Массив точек
      int xc=300, yc=300; //Координаты центра координатных осей

    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
       ::SetPriorityClass(::GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
       r = 4;//UpDown1->Position;
       pX=0;pY=0;   pI=0; numFunk=1;  sizeMashtab=50;
       clearPlain();

    }
    //---------------------------------------------------------------------------
    void __fastcall  TForm1::clearPlain()
    {
            ListBox1->Items->Clear();  pI=0;
            Image1->Canvas->Brush->Color = clWhite;
            Image1->Canvas->Pen->Color = clBlack;
           Image1->Picture->Bitmap->Width= 600;
           Image1->Picture->Bitmap->Height=600;
            Image1->Canvas->FillRect(Image1->Canvas->ClipRect );

            Image1->Canvas->MoveTo(0, 300);
            Image1->Canvas->LineTo(600, 300); //горизонтал

            Image1->Canvas->MoveTo(300, 0);
            Image1->Canvas->LineTo(300, 600); //вертикал


                for (register int i = 0; i <= 600; i += sizeMashtab)
                {

                 Image1->Canvas->MoveTo(i, 298); //засечки на гориз
                 Image1->Canvas->LineTo(i, 302);
                 Image1->Canvas->MoveTo(298, i); // засечки на вертикал
                 Image1->Canvas->LineTo(302, i);

                }
    }
    //===============================================================================
     //Отрисовка точек и их координат на плоскости
            void __fastcall TForm1::DrawPoints()
            {
                for (register int i = 0; i < r; i++)
                {
        Image1->Canvas->Brush->Color = clRed;
        Image1->Canvas->Pen->Color = clRed;
        Image1->Canvas->Ellipse(Points[i].X-4, Points[i].Y-4, Points[i].X+4, Points[i].Y+4 );
        Image1->Canvas->Brush->Color = clWhite;
        //Image1->Canvas->Pen->Color=clRed;

        Image1->Canvas->Font->Color = clBlack;
        Image1->Canvas->Font->Size =  8 ;
        Image1->Canvas->Font->Style = Image1->Canvas->Font->Style << fsBold;
        AnsiString str= FloatToStr( i);               //FloatToStrF(Points[i].x,ffFixed, 6, 2)+"   "+
                                        //FloatToStrF(Points[i].y,ffFixed, 6, 2);
        Image1->Canvas->TextOutA(Points[i].X+4, Points[i].Y+4, str );

                }
            }
    //---------------------------------------------------------------------------
     //Отрисовка плоскости, с точками и координатными осями
             void __fastcall TForm1::drawPlain()
            {
            Image1->Canvas->Brush->Color = clWhite;
            Image1->Canvas->Pen->Color = clBlack;
            Image1->Canvas->FillRect(Image1->Canvas->ClipRect );

            Image1->Canvas->MoveTo(0, 300);
            Image1->Canvas->LineTo(600, 300); //горизонтал

            Image1->Canvas->MoveTo(300, 0);
            Image1->Canvas->LineTo(300, 600); //вертикал


                for (register int i = 0; i <= 600; i += sizeMashtab)
                {

                 Image1->Canvas->MoveTo(i, 298); //засечки на гориз
                 Image1->Canvas->LineTo(i, 302);
                 Image1->Canvas->MoveTo(298, i); // засечки на вертикал
                 Image1->Canvas->LineTo(302, i);

                }

                for (register int i = 0; i < r; i++)
                {
                    Points[i].x = Pts[i][ 0]; //Реальные координаты
                    Points[i].y = Pts[i][ 1];
                    Points[i].X = xc + Points[i].x * sizeMashtab; //Экранные координаты
                    Points[i].Y = yc - Points[i].y * sizeMashtab;
                }

                DrawPoints();//Отрисовка точек
            }
    //---------------------------------------------------------------------------
         //Перевод координат из реальных в экранные
        int __fastcall TForm1::ChangeCoordinates(float a, int isY)
            {
                if (isY == 1) return (int)(yc - a * sizeMashtab);
                return (int)(xc + a * sizeMashtab);
            }
    //---------------------------------------------------------------------------------
      //Высчитывание полинома Лагранжа в заданном отрезка, с заданными точками.
             float __fastcall TForm1:: Lagrange(float x)
            {
                float res = 0, s = 0, s1 = 1, s2 = 1;
     
                for (register int i = 0; i < r; i++)
                {
                    s1 = 1; s2 = 1;
                    for (register int j = 0; j < r; j++)
                    {
                        if (i != j)
                        {
                            s1 = s1 * (x - Points[j].x);
                            s2 = s2 * (Points[i].x - Points[j].x);
                        }
                    }
                    s = Points[i].y * (s1 / s2);
                    res = res + s;
     
                }
     
                return res;
            }
    //---------------------------------------------------------------------------------
      //Высчитывание полинома Ньютона в заданном отрезка, с заданными точками.
             double __fastcall TForm1::Newton(double x)
            {
                double res = Points[0].y, F = 0, den = 1, n = r;
               register int i, j, k;
                for ( i = 1; i < n; i++)
                {
                    F = 0;
                    for ( j = 0; j <= i; j++)
                    {
                        den = 1;
                        for (k = 0; k <= i; k++)
                        {
                            if (k != j) den *= (Points[j].x - Points[k].x);
                        }
                        F += Points[j].y / den;
                    }
                    for (k = 0; k < i; k++) F *= (x - Points[k].x);
                    res += F;
                }
                return res;
            }
    //---------------------------------------------------------------------------------
    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
       if( RadioButton2->Checked==true ){ pointFunkc(); }
        drawPlain();
    //   Image1->Canvas->Brush->Color = clBlue; //clBlack;
    //   Image1->Canvas->Pen->Color = clBlue; //clBlack;
                      float k=1.2;
       for (register float i = -30.0; i <= 30.0; i += 0.005)   // 0.0005)
                {
                  int x= ChangeCoordinates(i, 0);
       Image1->Canvas->Brush->Color = clBlue; //clBlack;
       Image1->Canvas->Pen->Color = clBlue; //clBlack;
                  int y= ChangeCoordinates(Lagrange(i), 1);
                  Image1->Canvas->Rectangle(x-4, y-4, x-6, y-6);

       Image1->Canvas->Brush->Color = clGreen;// clBlack;
       Image1->Canvas->Pen->Color = clGreen;// clBlack;
                  int y1= ChangeCoordinates(Newton(i), 1);
                  Image1->Canvas->Rectangle(x+4, y1+4, x+6, y1+6);
        if( RadioButton2->Checked==true ){
       Image1->Canvas->Brush->Color = clRed; //clBlack;
       Image1->Canvas->Pen->Color = clRed; //clBlack;
                  int y2= ChangeCoordinates( testF( i ), 1);
                  Image1->Canvas->Rectangle(x, y2, x+2, y2+2);
                                          }
                }

    }
    //---------------------------------------------------------------------------
    double __fastcall TForm1::testF(double x)
    {
        if(numFunk==1)  return sin(x);
        if(numFunk==2)  return  x*x*x + 3*x*x - 6*x - 8; // for example
        if(numFunk==3)  return  x*x*x;
        if(numFunk==4)  return  exp(x);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::pointFunkc()
    {
         ListBox1->Items->Clear();
          r= UpDown1->Position;
          pI=0;
           float a=-(r/2);
         for (register int i = 0; i < r; i++)
        {

                 Pts[i][ 0] = (float)a ;                  //Реальные координаты
                 Pts[i][ 1] = testF((float)a) ;
              ListBox1->Items->Add(FloatToStrF((float)a,ffFixed, 6, 2)+" " +
              FloatToStrF(  testF(  (float)a ),ffFixed, 6, 2   )+" "+FloatToStr(i)   );
            a=a+1;
        }
       a=-5;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
    {
       Label1->Caption = UpDown1->Position;
       r= UpDown1->Position;  pI=0;
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
        pX=(float)X; pY=(float)Y;
       Label5->Caption=  FloatToStrF((float)(pX-300)/sizeMashtab,ffFixed, 6, 2 )+" "+FloatToStrF((float)(-pY+300)/sizeMashtab,ffFixed, 6, 2 );
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Image1DblClick(TObject *Sender)
    {
       if( pI > 98 ){ ShowMessage("Массив точек заполнен "); return; }
       if( RadioButton1->Checked==true ){
       Pts[pI][ 0] = (float)(pX-300)/sizeMashtab ; //Реальные координаты
       Pts[pI][ 1] = (float)(-pY+300)/sizeMashtab ;
       ListBox1->Items->Add(FloatToStrF(Pts[pI][ 0],ffFixed, 6, 2 )+" "+FloatToStrF(Pts[pI][ 1],ffFixed, 6, 2 )+" "+IntToStr(pI));


                    Points[pI].x = Pts[pI][ 0]; //Реальные координаты
                    Points[pI].y = Pts[pI][ 1];
                    Points[pI].X = xc + Points[pI].x * sizeMashtab; //Экранные координаты
                    Points[pI].Y = yc - Points[pI].y * sizeMashtab;

        Image1->Canvas->Brush->Color = clRed;
        Image1->Canvas->Pen->Color = clRed;
        Image1->Canvas->Ellipse(Points[pI].X-4, Points[pI].Y-4, Points[pI].X+4, Points[pI].Y+4 );
        Image1->Canvas->Brush->Color = clWhite;
        //Image1->Canvas->Pen->Color=clRed;

        Image1->Canvas->Font->Color = clBlack;
        Image1->Canvas->Font->Size =  8 ;
        Image1->Canvas->Font->Style = Image1->Canvas->Font->Style << fsBold;
        AnsiString str= IntToStr(pI);       //FloatToStrF(Points[pI].x,ffFixed, 6, 2)+"   "+
                                            //FloatToStrF(Points[pI].y,ffFixed, 6, 2);
        Image1->Canvas->TextOutA(Points[pI].X+4, Points[pI].Y+4, str );

       pI++;
       r=pI;
       }
    }
    //------------------------------------------------------------------------


    void __fastcall TForm1::BitBtn3Click(TObject *Sender)
    {
         clearPlain();
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::ComboBox1KeyPress(TObject *Sender, char &Key)
    {
       Key=0;
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::ComboBox1Change(TObject *Sender)
    {
         numFunk = StrToInt( ComboBox1->Text.SubString(1,1));
         clearPlain();
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::RadioButton1Click(TObject *Sender)
    {
      ComboBox1->Enabled=false;
       UpDown1->Enabled=false;
       clearPlain();     
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::RadioButton2Click(TObject *Sender)
    {
       ComboBox1->Enabled=true;
       UpDown1->Enabled=true;
       clearPlain();     
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::BitBtn2Click(TObject *Sender)
    {
        sizeMashtab=50;
        BitBtn1Click(Sender);
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::BitBtn4Click(TObject *Sender)
    {
        sizeMashtab=10;
        BitBtn1Click(Sender);
    }
    //---------------------------------------------------------------------------

     

    =

    =

    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <Buttons.hpp>
    #include <ExtCtrls.hpp>
    #include <ComCtrls.hpp>
    #include <math.h>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:    // IDE-managed Components
            TPanel *Panel1;
            TPanel *Panel2;
            TImage *Image1;
            TBitBtn *BitBtn1;
            TListBox *ListBox1;
            TUpDown *UpDown1;
            TLabel *Label1;
            TRadioGroup *RadioGroup1;
            TRadioButton *RadioButton1;
            TRadioButton *RadioButton2;
            TComboBox *ComboBox1;
            TBitBtn *BitBtn3;
            TLabel *Label2;
            TLabel *Label3;
            TLabel *Label4;
            TBitBtn *BitBtn2;
            TBitBtn *BitBtn4;
            TLabel *Label5;
            void __fastcall BitBtn1Click(TObject *Sender);
            void __fastcall UpDown1Click(TObject *Sender, TUDBtnType Button);
            void __fastcall Image1MouseMove(TObject *Sender, TShiftState Shift,
              int X, int Y);
            void __fastcall Image1DblClick(TObject *Sender);
            void __fastcall BitBtn3Click(TObject *Sender);
            void __fastcall ComboBox1KeyPress(TObject *Sender, char &Key);
            void __fastcall ComboBox1Change(TObject *Sender);
            void __fastcall RadioButton1Click(TObject *Sender);
            void __fastcall RadioButton2Click(TObject *Sender);
            void __fastcall BitBtn2Click(TObject *Sender);
            void __fastcall BitBtn4Click(TObject *Sender);
    private:    // User declarations
    public:        // User declarations
        int r;   float pX,pY;  int pI;  int numFunk;  int sizeMashtab;
        void __fastcall clearPlain();
        void __fastcall pointFunkc();
        void __fastcall TForm1::DrawPoints();
        void __fastcall drawPlain();
        int __fastcall TForm1::ChangeCoordinates(float a, int isY);
        float __fastcall TForm1:: Lagrange(float x);
        double __fastcall TForm1::Newton(double x);
        double __fastcall TForm1::testF(double x);
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif

    =

    Категория: Простые примеры | Добавил: doka (29.10.2020)
    Просмотров: 1358 | Рейтинг: 0.0/0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]