Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.06.2011, 00:07
hatabi4 hatabi4 вне форума
Прохожий
 
Регистрация: 22.06.2011
Сообщения: 3
Репутация: 10
По умолчанию Интерполяционный полином

Добрый вечер всем.
Прошу помощи у знающих людей. По предмету вычислительная математика дали задание, которое никак не получается. Конец сессии нужно срочно сдать. суть вот в чем:
Нужно провести интерполяцию функции 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  
Старый 23.06.2011, 03:05
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

На вскидку, можно указать два замечания:
1. Проверить правильность всех применяемых переменных (имееются ошибки).
2. Присмотреться к предупреждениям в которые тыкает носом компилятор, устранить причины и постараться в будущем не игнорировать такие предупреждения.
Ответить с цитированием
  #3  
Старый 23.06.2011, 11:05
hatabi4 hatabi4 вне форума
Прохожий
 
Регистрация: 22.06.2011
Сообщения: 3
Репутация: 10
По умолчанию

Компилятор никуда не ругается вообще, а если и ругается бывает то на доступ к адресу в памяти.
Код немного немного, но все равно чушь полная получается.
Код:
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  
Старый 23.06.2011, 21:55
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ну, если запретить компилятору выдавать предупреждения, то и более грубые ошибки пропустишь. Для начала вот тебе одна: переменаая y1 типа array of real в функции Newton. Где и каким образом она инициализируется, что ты так смело потом обращаешься к не созданному массиву?
Хм, а ты хитрец. Первоначально выложенный код не совпадает с текущим.

Последний раз редактировалось angvelem, 23.06.2011 в 22:06.
Ответить с цитированием
  #5  
Старый 23.06.2011, 23:39
hatabi4 hatabi4 вне форума
Прохожий
 
Регистрация: 22.06.2011
Сообщения: 3
Репутация: 10
По умолчанию

я там опечатался, я его переделал немного))

сделал вот так, теперь деление на 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  
Старый 23.06.2011, 23:53
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вот твой код, несколько причёсанный:
Код:
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  
Старый 24.06.2011, 01:17
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ну что ты мучаешься, пройдись отладчиком и посмотри где, что не так. У тебя проблемы в выходе за пределы диапазона в массивах.
Код:
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]);
Вот здесь у тебя выход x[i + 2], здесь y2[i]

Последний раз редактировалось angvelem, 24.06.2011 в 01:24.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:30.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter