Необходимо сделать программу для нахождения значения функции в точке Х при помощи интерполяционного многочлена Лагранжа. Точка Х задается пользователем Суть интерполирования в том, что задается пользователем таблица х|у типа: x|x1|x2|...|xn| --------------- y|y1|y2|...|yn| и соответственно точка Х, в которой ищется значение функции. Сам подсчет производится в следующей табличке:
X |x0 |x1 |...|xn |yi |pi||yi/pi | --|--------------------------------- x0|X-x0|x0-x1|...|x0-xn|y0|p0|y0/p0| --|--------------------------------- x1|x1-x0|X-x1|...|x1-xn|y1|p1|y1/p1| --|-------------------------------- ...|...............................................| --|---------------------------------- xn|xn-x0|xn-x1|...|X-xn|yn|pn|yn/pn| ------------------------------------- --|---------------------Пn+1|--|Сумма (yi/pi)| Ln(x)=Пn+1*Сумма (yi/pi) где p0= (X-x0)*(x0-x1)*...*(x0-xn), или проще говоря произведение по строке Пn+1=(X-x0)*(X-x1)*...*(X-xn), или произведение по диагонали
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;
type Tlagr = class(TForm) sgx: TStringGrid; lx: TLabel; size: TEdit; Button1: TButton; Label2: TLabel; ly: TLabel; sgy: TStringGrid; tx: TLabel; znachx: TEdit; Button2: TButton; sg1: TStringGrid; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var lagr: Tlagr;
implementation
{$R *.dfm}
procedure Tlagr.Button1Click(Sender: TObject); var n,i,j,i1,j1:integer; begin n:=StrToInt(size.Text); // ввод рамера х|у if n>0 then begin // построение двух StringGrid'ов для ввода значений х и у sgx.ColCount:=n+1; sgx.RowCount:=0; for i:=1 to sgx.ColCount do for j:=1 to sgx.RowCount do begin sgx.Cells[i,j]:=''; end; sgy.ColCount:=n+1; sgy.RowCount:=0; for i1:=1 to sgy.ColCount do for j1:=1 to sgy.RowCount do begin sgy.Cells[i1,j1]:=''; end; sgx.Visible:=true; sgy.Visible:=true; lx.Visible:=true; ly.Visible:=true; tx.Visible:=true; znachx.Visible:=true; Button2.Visible:=true; end else ShowMessage ('Количество значений не может быть нулевым или отрицаельным') end;
procedure Tlagr.Button2Click(Sender: TObject); var lx,ly: array of array of real; //должна быть такого типа потому что значения х не будут целыми bx: array of real; pi,pn,sum1,ln,x: real; i,j,i1,j1,n: integer; begin n:=StrToint(size.Text); SetLength(lx,n,1); for i:=1 to n do // попытка (не знаю на сколько удачная и правильная) считать значение первой таблицы с данными об xn и засовывания их в матрицу for j:=1 to n do begin lx[i,j]:=StrToFloat(sgx.Cells[i-1,j-1]); end; bx[i,j]:=lx[i,j]; // первая проблема в том, что он не позволяет даже для проверки данные матрицы lx //вывести в другую произвольную StringGrid и плются: "is not a valid floating point value", т.е. неверный //тип for i:=1 to n do for j:=1 to n do begin sg1.Cells[i-1,j-1]:=FloatToStr(bx[i,j]); end; end; end.
|
Вторая проблема в том, что я не знаю как дальше все это реализовать: в конечном счете он должен вывести значение Ln(x), можно целиком со всей таблицей, можно просто отдельно Заранее Спасибо! |