Показать сообщение отдельно
  #1  
Старый 02.03.2013, 20:10
ugicedeath ugicedeath вне форума
Прохожий
 
Регистрация: 14.02.2013
Сообщения: 17
Репутация: 10
По умолчанию Интерполяция, метод лагранжа, переменная степень

Всем привет! Решил заняться интерполяцией, да не получается. Суть задачи состоит в том, чтобы полученные точки (у меня они задаются вручную) интерполировать функцией с переменной степенью. Т.е. чтобы можно было задавать степень функции. Я попробовал реализовать метод лагранжа, но не получается. Программа запускается, но при расчетах выдает ошибку:
Invalid floating point evaluation и показывает на строчку расчета произведений. Помогите пожалуйста, мне не обязательно интерполировать методом лагранжа, если есть другие варианты не скупитесь плз. Вот код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Series, TeEngine, ExtCtrls, TeeProcs, Chart;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Chart1: TChart;
    Series1: TLineSeries;
    Series2: TPointSeries;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

x: array [1..100] of real;
y: array [1..100] of real;
L: array [1..100] of real;
n,j,i:integer;
t,q:real;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const t='Введите значение';
begin
n:=strtoint(edit1.text);

for i:=1 to n do  //Ввод точек через окошко
begin
x[i]:=StrToFloat(InputBox('Ввод Х'+IntToStr(i),t,'0'));
y[i]:=StrToFloat(InputBox('Ввод Y'+IntToStr(i),t,'0'));
 series2.AddXY(x[i],y[i]);
end;

end;

procedure TForm1.Button2Click(Sender: TObject);   // Сами расчеты
begin

for i:=1 to n do begin
L[i]:=1;
end;

FOR j:=1 TO n DO begin


         IF i<>j THEN
         begin
         L[i]:=L[i]*(t-x[i])/(x[j]-x[i]);  //Произведения, формула лагранжа
         end;

end;

for i:=1 to n do begin
q:=0;
q:=q+L[i]*y[i];  // Суммирование произведений
end;



t:=-4; while t<4+0.1 do    // График

begin

series1.AddXY(t,q);
t:=t+0.1;

end;



end;

end.