Условие:
---
Пусть функция y(x) задана таблицей:
Xi X1 X2 X3 ... Xm
Yi Y1 Y2 Y3 ... Ym
Составить программу для вычисления значения этой функции в произвольной точке X1<=X<=Xm по формуле линейной интерполяции:
Вообще-то, насколько я помню, интерполяция производится так:
а возможно ли...
- произвести не линейную, а сплайн-интерполяцию
- вычислить полином Лагранжа (например, при заданных значениях X0=0.5, X1=0, X2=1, Y0=-0.21, Y1=-1.5, Y2=0.53, вывести результат: 3.07*x*x - 1.04*x -1.5)
- графически отобразить начальную интерполяцию и полином
...или я расфантазировалась? ручками все просчитала и нарисовала, а вот Pascal...
Jill,
http://forum.sources.ru/index.php?showtopic=83232&view=findpost&p=611246 не подойдет (по-моему, даже с отрисовкой ) ? Или тебе именно полиномом Лагранжа
подойдет, конечно
пошла разбираться...
а полином Лагранжа (и еще Ньютона вдобавок) мне надо обязательно - просчитать и нарисовать...
ЗЫ: не обижаю - мне еще далеко до волшебника - я только учусь компьютер меня не всегда понимает, а с паскалем я на подобные темы - "на вы и шепотом"
Вот это посмотри: http://bib.com.ua/info863.html
ого! проектик...
попробуй, разберись...
1. не поняла, как вносятся заданные координаты в INTERPOL.DAT - в описаловке - попарно - это XYXY или XXYY?
2. сам INTERPOL.PAS рисовать не хочет / то есть ошибок не выдает, но и не рисует ничего... хотя GRAPHICS.PAS (я так поняла, для примера) рисует очень даже крассссиво не могу найти причину... вроде аналогично все...
3. и совсем не поняла назначение BPTRAP.PAS и MAKEDATA.PAS.........
InitGraph(grDriver, grMode, '');
InitGraph(grDriver, grMode, 'EGAVGA.BGI');? эт я уточняю
Нет, графика инициализируется именно с пустой строкой...
DrawPlace(@Standart, GetMin(Data), GetMax(Data), 0.1);и ты увидишь, что "зеленый" Newton закрывает "желтого" Lagrange
SetColor(Yellow);
SetLineStyle(DottedLn, 0, ThickWidth);
DrawGraph(@Lagrange, GetMin(Data), GetMax(Data), 0.1);
readln;
SetColor(Green);
SetLineStyle(DottedLn, 0, ThickWidth);
DrawGraph(@Newton, GetMin(Data), GetMax(Data), 0.1);
readln;
SetColor(Red);
SetLineStyle(SolidLn, 0, ThickWidth);
DrawGraph(@Standart, GetMin(Data), GetMax(Data), 0.1);
Ну, а координаты-то свои привести можешь? А то телепаты в отпуске у нас...
вот они :-)
-1E+0000
1.0090E+0000
-0.9E+0000
0.4743E+0000
-0.8E+0000
0.2475E+0000
-0.7E+0000
0.4091E+0000
-0.6E+0000
0.6512E+0000
-0.5E+0000
0.6007E+0000
-0.4E+0000
0.0361E+0000
-0.3E+0000
-0.7662E+0000
-0.2E+0000
-1.3814E+0000
-0.1E+0000
-1.4429E+0000
...маткад прорисовывает сплайном...
DrawGraph(@Lagrange, GetMin(Data), GetMax(Data), 0.01); { шаг уменьшай до 0.01 }
...
DrawGraph(@Newton, GetMin(Data), GetMax(Data), 0.01); { здесь тоже }
супер!
вот где собака порылась...
повторю вопрос насчет выделения узлов - это возможно?
procedure DrawGraph(D: PData; f: Pointer; MinX, MaxX, Step: Real);
type
TFunction = function(x: Real): Real;
var
p: PData;
x, y, Inf, Sup: Real;
xl, yt, xr, yb, i: Integer;
Error, Define: Boolean;
begin
if Step = 0 then Exit;
x := MinX; Define := False;
while x < MaxX do begin
if not Trap then begin
y := TFunction(f)(x);
if not Define then begin
Inf := y; Sup := y; Define := True; end
else begin
if Inf > y then Inf := y;
if Sup < y then Sup := y;
end;
end;
UnTrap;
x := x + Step;
end;
if not Define then Exit;
xl := 60; yt := 20; xr := GetMaxX - 30; yb := GetMaxY - 20;
x := MinX;
Error := True;
while x < MaxX do begin
if not Trap then begin
y := TFunction(f)(x);
if Error then begin
MoveTo(xl + Round((x - MinX) * (xr - xl) / (MaxX - MinX)),
GetMaxY - Round((y - Inf) * (yb - yt) / (Sup - Inf)) - yt);
Error := False; end
else
LineTo(xl + Round((x - MinX) * (xr - xl) / (MaxX - MinX)),
GetMaxY - Round((y - Inf) * (yb - yt) / (Sup - Inf)) - yt); end
else
Error := True;
UnTrap;
x := x + Step;
end;
SetColor(LightRed);
p := D;
while p <> nil do begin
x := p^.x; y := p^.y;
Circle(xl + Round((x - MinX) * (xr - xl) / (MaxX - MinX)),
GetMaxY - Round((y - Inf) * (yb - yt) / (Sup - Inf)) - yt, 3);
p := p^.next;
end;
end;
SetColor(Yellow);
SetLineStyle(DottedLn, 0, ThickWidth);
DrawGraph(Data, @Lagrange, GetMin(Data), GetMax(Data), 0.01);
SetColor(Green);
SetLineStyle(DottedLn, 0, ThickWidth);
DrawGraph(Data, @Newton, GetMin(Data), GetMax(Data), 0.01);
SetColor(Red);
SetLineStyle(SolidLn, 0, ThickWidth);
DrawGraph(nil, @Standart, GetMin(Data), GetMax(Data), 0.1); { NIL если не нужны узлы }
Супер! Узлы - то, что надо
volvo, я так и не поняла для чего BPTRAP.PAS и MAKEDATA.PAS.... первый - отлавливает и прорабатывает ошибки? а второй....?
Jill, насколько я вижу, если MAKEDATA.PAS переименовать, например, в __MAKE.PAS, то основная программа продолжает компилироваться, то есть, этот файл вообще-то не нужен для нормальной работы программы... Я его даже перенес в другую директорию, и тогда тоже все работает... Можно удалять
А первый... Если при выполнении функции возникает Run-Time Error, то программа "откатывается" назад, ДО вызова этой сбойной функции, и возвращается True (чтоб ошибочную функцию больше не вызывать, или поменять параметр, возможно дело именно в параметре)...
пасиба за объяснения
volvo, у меня тут еще вопрос возник - все бьюсь и бьюсь - по тому же поводу, но отдельной программкой - как сделать так, чтобы с клавиатуры ввести количество точек, их координаты - и вывелись коэффициенты? сама функция LAGRANGE небольшая, но не получается у меня ее прицепить к вектору значений координат
по той ссылке, что ты давал (супер библиотека!!! за нее отдельное спасибо), нашла готовую прогу вычисления - но она слишком большая, сложная и с "наворотами" (типа - ввод с клавиатуры или из файла + визуальное оформление - не это не нужно, а грамотно "обрезать" не получается...)
volvo, посмотри, пожалуйста
почему-то процедура Lagrange на гора результаты выдавать не хочет - как ввели координаты, так и выводим... :-(
в чем загвозка? подскажи, плз!
ВОПРОС СНЯТ - У МЕНЯ ВСЕ ПОЛУЧИЛОСЬ!!!!!!!!!
Прикрепленные файлы
LAG.PAS ( 4.27 килобайт )
Кол-во скачиваний: 500
Что значит "не хочет"?
спасибо, volvo, уже разобралась что-то у меня проглючило (...или это меня проглючило? )
СПАСИБО!!!
настал черед коеффициентов полинома Ньютона... вычисляются они по формуле, из которой я никак не могу просчитать дельту...
http://www.eva.ru/pictures/album_photos/793296.gif?1136569231119 - тут изображение формул
остальное нацарапала вроде:
Program Polyn;
const
TNArraySize = 50; { Size of vectors }
h = 0.1;
N = 3;
type
TNvector = array[0..TNArraySize] of Real;
var
NumPoints : integer; { Number of data points }
YData : TNvector; { Data points (Y) }
Poly : TNvector; { The constructed polynomial }
k : Integer;
Function Delta(Y:TNvector):Real; {ВОТ ЗДЕСЬ ПРОБЛЕМА}
var k:integer;
begin
for k:=0 to N-1 do begin
Delta:=Y[k+1]-Y[k];
end;
end;
Function Factorial(k:Integer):Integer;
Var m,l:Integer;
Begin;
If k<>0 then Begin
m:=k;
For l:=(k-1) downto 2 do m:=m*l;
Factorial:=m;
End
Else Factorial:=1;
End; {Factorial}
Function Step(k:Integer):real;
Begin
Step:=exp(k*ln(h));
End;
Begin
for k:=0 to n do begin
write('Y[',k,'] = ');
readln(YData[k]);
end;
for k:=0 to n do begin
Poly[k]:=Delta(YData[n-k])/(Factorial(k)*Step(k)); {НУ И ЗДЕСЬ СООТВЕТСТВЕННО...}
end;
end.
Вот тут глянь, по-моему, там более доступно, чем в том архиве, на который я раньше давал ссылку...
Прикрепленные файлы
polinom.zip ( 33.16 килобайт )
Кол-во скачиваний: 318
why is cialis so expensive
Achat Amoxicillin 5mg