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

И так, у меня курсовая называется "интерполяция полиномами второго порядка графически заданных функции"
Вот что есть в коде
Код:
var
  Form1: TForm1;
  xx: array of integer;
  yy: array of integer;
  ac, bc, cc: array of extended;
  s: integer = 0; //кол-во тыкнутых точек
implementation

uses Unit2;

{$R *.dfm}

Function Check:boolean;//проверка на изменение направления
begin
if ((xx[s-2]<xx[s-1]) and (xx[s-1]>xx[s])) or ((xx[s-2]>xx[s-1]) and (xx[s-1]<xx[s])) then begin
result:=true;
end else begin
result:=false;
end;
end;

Procedure Narisovat;//зарисовываем параболу по уже найденным коэффициентам
var x1, x2, xn, yx: integer;
begin
x1:=xx[s-1]; x2:=xx[s];
Form1.Canvas.MoveTo(xx[s-1],yy[s-1]);
if x2>x1 then begin
  for xn:=x1 to x2 do begin
      yx:=round((ac[s]*xn*xn)+(bc[s]*xn)+cc[s]);
      Form1.Canvas.LineTo(xn,yx);
  end;
end;
if x1>x2 then begin
  for xn:=x1 downto x2 do begin
      yx:=round((ac[s]*xn*xn)+(bc[s]*xn)+cc[s]);
      Form1.Canvas.LineTo(xn,yx);
  end;
end;
end;

Procedure SSolve; //находим коэффициенты уравнения
var
x1, x2, y1, y2: real;
K2: extended;
begin
x1:=xx[s-1];   x2:=xx[s];
y1:=yy[s-1];   y2:=yy[s];
СЛАУ
// x1^2  x1  1 | y1
//  x2^2  x2  1 | y2
//  2*x1  1   0 | K

if s = 2 then K2:=1;
if s > 2 then begin
    if check = true then begin
     K2:=-(2*ac[s-1]*x1+bc[s-1]);      Вот тут
    end else begin
     K2:=2*ac[s-1]*x1+bc[s-1];
    end;
end;
ac[s]:=((K2*(x2-x1)+(y1-y2))/(2*x1*x2-x1*x1-x2*x2));
bc[s]:=(K2-2*ac[s]*x1);
cc[s]:=(y2-ac[s]*x2*x2-x2*(K2-2*ac[s]*x1));
 Narisovat;
end;

procedure TForm1.onclick(Sender: TObject; Button: TMouseButton;//начало проги идет отсюда
  Shift: TShiftState; X, Y: Integer);
begin
inc(s);
Form1.canvas.pen.color:=clBlack;
Form1.Canvas.Ellipse(x-3, y-3, x+3, y+3);
setlength(xx,s+1);
setlength(yy,s+1);
setlength(ac,s+1);
setlength(bc,s+1);
setlength(cc,s+1);
xx[s]:=X;
yy[s]:=Y;
if s >= 2 then begin
  if (xx[s]<>xx[s-1]) or (yy[s]<>yy[s-1]) then begin
    if (abs(xx[s]-xx[s-1])<2) then begin
    Form1.Canvas.MoveTo(xx[s-1],yy[s-1]);
    Form1.Canvas.LineTo(xx[s],yy[s]);
    end else begin
    SSolve;
    end;
  end;
end;
end;

Программа строит параболы через квадратичные уравнения, коэффициенты для уравнения находятся через СЛАУ(но я в программе выразил эти коэффициенты вручную, так проще и в плане кода и программы вообще), в качестве связывающего звена между параболами идут уравнения касательной.

залил картинку "прога.jpg" - в ней видно что сначала программа рисует все нормально, но как только новая точка(x3) стала левее(до этого все новые точки были правее старых), так есть изменила направление - сплайн вышел корявый, не правильный, стрелками показано какой был сплайн без минуса в месте, где в коде написано большими буквами "вот тут", ну и с плюсом. В идеале надо чтобы нарисовалась парабола вроде как фиолетовой на картинке. Но такую фиолетовую параболу невозможно воспроизвести через простые y=a*x^2+b*x+c, так как часть фиолетовой параболы находится правее точки X2(так есть в уравнение по два раза будут подставляться некоторые значения X - а уравнение должно выдавать разные Y).
Преподавателем было намекнуто в таком случае рисовать через систему
X(t)=a*t^2+b*t+c
Y(t)=n*t^2+m*t+h
но формулу для нахождения коэффициентов таких параметрически заданных парабол я нашел только как на картинке, но нам не хватает значении одной касательной.
В общем - как быть?
Изображения
Тип файла: jpg прога.jpg (53.2 Кбайт, 13 просмотров)
Тип файла: jpg Параметрическое уравнение параболы.jpg (60.7 Кбайт, 8 просмотров)
Вложения
Тип файла: rar Сплайны.rar (36.3 Кбайт, 5 просмотров)
Ответить с цитированием