Интерполяция полиномом Лагранжа и Ньютона
исходник и исполняемый файл здесь
Кривые построенные полиномами смещены от действительных
значений; Лагранжа в верх Ньютона в низ
=
=
=
=
=
#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
=
|