![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый вечер всем.
Прошу помощи у знающих людей. По предмету вычислительная математика дали задание, которое никак не получается. Конец сессии нужно срочно сдать. суть вот в чем: Нужно провести интерполяцию функции F=x*x+4*x+3, используя интерполяционную формулу Ньютона(метод разделенных разностей) на интервале [-10..10] взяв количество узлов интерполяции равных 3. Построить графики исходной функции и интерполирующей функции, а так же график погрешности интерполяции. Сделать нужно, используя вот эти формулы: ![]() В моем случае уравнение получается вида: Pn(x)=f(x[0])+f(x[i],x[i+1])*(x-x[0])+f(x[i],x[i+1],x[i+2])*(x-x[0])*(x-x[1]). Написал функцию, но работать она не хочет: Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, Math;
type
TForm1 = class(TForm)
Chart1: TChart;
Chart2: TChart;
Series1: TLineSeries;
Series2: TLineSeries;
Series3: TLineSeries;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
xmin=-10;
xmax=10;
n=3;
var
Form1: TForm1;
i,j: integer;
x1,x2,x3,h: real;
x,fx: array [1..3] of real;
implementation
{$R *.dfm}
function yf(x:real):real;
begin
yf:=x*x+4*x+3;
end;
Function Newton(n: integer; d:real; x,y :array of real):real;
var
l:real;
j,i,k:integer;
p,p2: real;
y1,y2: array of real;
begin
L:=fx[1];
P:=1;
p2:=1;
for j:=1 to n do
begin
P:=P*(D-X[j-1]);
for i:=0 to (n-j) do // <- ПЕРВАЯ РАЗНОСТЬ
begin
Y[i]:=(y[i+1]-y[i])/(x[i+j]-x[i]);
end;
p2:=p2*(d-x[j-1])*(d-x[j]);
for k := 1 to (n-j) do // <- ВТОРАЯ РАЗНОСТЬ, ЗДЕСЬ ВСЯ "СОЛЬ"
begin
y[k]:=(((y[k+2]-y[k+1])/(x[k+j]-x[k]))-y1[k])/(x[k+2]-x[k]);
end;
L:=L+P*y[i]+p2*y[k];
end;
Newton:=-l;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
x1:=xmin;
while x1<=xmax do
begin
Series1.AddXY(x1,yf(x1));
x1:=x1+1;
end;
x2:=-1;
for i:=1 to n do
begin
x[i]:=x2;
fx[i]:=yf(x[i]);
x2:=x2+1;
end;
x3:=xmin;
while x3<=xmax do
begin
for i:=1 to 10 do
begin
Series2.AddXY(x3,Newton(n,x3,x,fx));
Series3.AddXY(x3, abs (yf(x3)-Newton(n,x3,x,fx)) );
x3:=x3+0.01;
end;
end;
end;
end.Математический я все понимаю как делать и на листике оно то получается, а программно никак. Помогите пожалуйста с кодом функции. Последний раз редактировалось hatabi4, 23.06.2011 в 00:09. |
|
#2
|
||||
|
||||
|
На вскидку, можно указать два замечания:
1. Проверить правильность всех применяемых переменных (имееются ошибки). 2. Присмотреться к предупреждениям в которые тыкает носом компилятор, устранить причины и постараться в будущем не игнорировать такие предупреждения. |
|
#3
|
|||
|
|||
|
Компилятор никуда не ругается вообще, а если и ругается бывает то на доступ к адресу в памяти.
Код немного немного, но все равно чушь полная получается. Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, Math;
type
TForm1 = class(TForm)
Chart1: TChart;
Chart2: TChart;
Series1: TLineSeries;
Series2: TLineSeries;
Series3: TLineSeries;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
xmin=-10;
xmax=10;
n=3;
var
Form1: TForm1;
i,j: integer;
x1,x2,x3,h: real;
x,fx: array [1..3] of real;
implementation
{$R *.dfm}
function yf(x:real):real;
begin
yf:=x*x+4*x+3;
end;
Function Newton(n: integer; d:real; x,y :array of real):real;
var
l,l2:real;
j,i,k,u:integer;
p,p2: real;
y1,y2: array of real;
begin
L:=fx[1];
P:=1;
p2:=1;
for j:=1 to n do
begin
p:=p*(D-X[j-1]);
for i:=0 to (n-j) do
begin
Y[i]:=(y[i+1]-y[i])/(x[i+j]-x[i]);
end;
L:=L+P*y[i];
end;
for u:=1 to n do
begin
p2:=p2*(d-x[u-1])*(d-x[u]);
for k := 0 to (n-u) do
begin
y[k]:=(((y[k+2]-y[k+1])/(x[k+u]-x[k]))-y[i])/(x[u+2]-x[u]);
end;
L2:=L2+p2*y[k];
end;
Newton:=-l-l2;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
x1:=xmin;
while x1<=xmax do
begin
Series1.AddXY(x1,yf(x1));
x1:=x1+1;
end;
x2:=-1;
for i:=1 to n do
begin
x[i]:=x2;
fx[i]:=yf(x[i]);
x2:=x2+1;
end;
x3:=xmin;
while x3<=xmax do
begin
for i:=1 to 10 do
begin
Series2.AddXY(x3,Newton(n,x3,x,fx));
Series3.AddXY(x3, abs (yf(x3)-Newton(n,x3,x,fx)) );
x3:=x3+0.01;
end;
end;
end;
end.Вот что строит прога: ![]() Точки это исходный график, прямая - искомый полином |
|
#4
|
||||
|
||||
|
Ну, если запретить компилятору выдавать предупреждения, то и более грубые ошибки пропустишь. Для начала вот тебе одна: переменаая y1 типа array of real в функции Newton. Где и каким образом она инициализируется, что ты так смело потом обращаешься к не созданному массиву?
Хм, а ты хитрец. Первоначально выложенный код не совпадает с текущим. Последний раз редактировалось angvelem, 23.06.2011 в 22:06. |
|
#5
|
|||
|
|||
|
я там опечатался, я его переделал немного))
сделал вот так, теперь деление на 0 во втором цикле по I, причем сразу. что я делаю не так с ним?? Код:
Function Newton(n: integer; d:real; x,y :array of real):real;
var
l,l2:real;
j,i,k,u:integer;
p,p2: real;
y1,y2: array [0..2] of real;
begin
L:=fx[1];
P:=1;
p2:=1;
for j:=1 to n do
begin
p:=p*(D-X[j-1]);
p2:=p2*(D-x[j-1])*(D-x[j]);
for i:=0 to (n-j) do
begin
Y1[i]:=(y[i+1]-y[i])/(x[i+j]-x[i]);
end;
for I := 1 to (n-j) do
begin
y2[i]:=(((y[i+2]-y[i+1])/(x[i+j]-x[i]))-(y[i+1]-y[i])/(x[i+j]-x[i]))/(x[i+2]-x[i]);
end;
l:=l+p*y1[i]+p2*y2[i];
end;
Newton:=l;
end; |
|
#6
|
||||
|
||||
|
Вот твой код, несколько причёсанный:
Код:
function Newton(n : Integer; d : Single; x, y : array of Single) : Single;
var
l : Single;
j, i : Integer;
p, p2 : Single;
y1, y2: array [0..2] of Single;
begin
L := fx[1];
P := 1;
p2 := 1;
for j := 1 to n do
begin
p := p * (D - X[j - 1]);
p2 := p2 * (D - x[j - 1]) * (D - x[j]);
for i := 0 to (n - j) do
Y1[i] := (y[i + 1] - y[i]) / (x[i + j] - x[i]);
for I := 1 to (n-j) do
y2[i] := (((y[i + 2] - y[i + 1]) / (x[i + j] - x[i])) - (y[i + 1] - y[i]) / (x[i + j] - x[i])) / (x[i + 2] - x[i]);
l := l + p * y1[i] + p2 * y2[i];
end;
Result := l;
end;1. Про предупреждения от компилятора я тебе говорил, но ты не внял моим словам, а жаль. 2. Опять используешь не иницилизированные переменные и ждёшь нормальной работы программы. 3. использование переменных после for. |
|
#7
|
||||
|
||||
|
Ну что ты мучаешься, пройдись отладчиком и посмотри где, что не так. У тебя проблемы в выходе за пределы диапазона в массивах.
Код:
for I := 1 to (n-j) do y2[i] := (((y[i + 2] - y[i + 1]) / (x[i + j] - x[i])) - (y[i + 1] - y[i]) / (x[i + j] - x[i])) / (x[i + 2] - x[i]); Последний раз редактировалось angvelem, 24.06.2011 в 01:24. |