Здравствуйте,помогите пожалуйста, есть программа - интерполяция по формуле лагранжа, все работает, только формула нужна иная для интерполяции - интерполяция по эрмиту, вот формула
, где Wn(x)=(x-x1)(x-x2).....(x-xn). Кусок который нужно изменить выделен жирным шрифтом
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
| //---------------------------------------------------------------------------
#include <vcl.h>
#include <fstream>
#include <vector>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
using namespace std;
vector<double> X,Y; // Векторы для исходных данных
[B]double Lagrange(double arg) // Интерполирование по Лагранжу
{
double P,Res=0;
for(int i=0;i<X.size();i++)
{
P=1;
for(int j=0;j<X.size();j++)
if(i!=j) P*=(arg-X[j])/(X[i]-X[j]);
Res+=P*Y[i];
}
return Res;
}[/B]
void __fastcall TForm1::Button1Click(TObject *Sender) // Обработка
{
if(!OpenDialog1->Execute()) return; // Файл не выбран - завершить
Chart1->Series[0]->Clear(); // Инициализация всех параметров
Chart1->Series[1]->Clear();
Edit2->Clear();
Edit3->Clear();
Button2->Enabled=true;
Edit1->Text=OpenDialog1->FileName;
double x,y;
ifstream F(OpenDialog1->FileName.c_str()); // Открытие файла
while(!F.eof()) // Чтение файла до конца
{
F>>x>>y;
if(F.fail()) // Если Некорректные данные
{
Chart1->Series[1]->Clear(); // то очистить график
Beep();
ShowMessage("Ошибка файла данных!"); // вывести сообщение
F.close(); // закрыть файл
return; // и выйти
}
X.push_back(x); // Сохранение данных в векторы
Y.push_back(y);
Chart1->Series[1]->AddXY(x,y); // Вывод точки на график
}
F.close(); // закрытие файла
Button2->Enabled=true;
Application->ProcessMessages(); // Немедленное отображение точек
x=Chart1->BottomAxis->Minimum; // Построение графика интерполяции
y=(Chart1->BottomAxis->Maximum-x)/Screen->Width; // Число точек графика - ширина экрана (максимально возможное)
for(int i=0;i<Screen->Width;i++)
{
Chart1->Series[0]->AddXY(x,Lagrange(x)); // Вычисление и добавление очередной точки
x+=y;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender) // Интерполяция в произвольной точке
{
double x;
Edit3->Clear();
try
{x=StrToFloat(Edit2->Text);} // Ввод аргумента
catch(...) // Ошибка - вывод сообщение
{
Beep();
ShowMessage("Некорректный аргумент!");
Edit2->SetFocus();
return;
}
Edit3->Text=FloatToStr(Lagrange(x)); // Расчёт и вывод результата
}
//-------------- |
|