Помощь - Поиск - Пользователи - Календарь
Полная версия: Интерполяция многочленом ньютона
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Dark_san
blink.gif
Вот такое вот у меня было лицо smile.gif
Нужен алгоритм для решения програмным путём
Входные данные - 12 X|Y и 4 точки x1 x2 x3 x4.
Lapp
Цитата(Dark_san @ 18.04.2010 18:49) *
Входные данные - 12 X|Y и 4 точки x1 x2 x3 x4.

Гм. А по-русски?.. blink.gif
Dark_san
х у
0,01 0,991824
0,06 0,951935
0,11 0,913650
0,16 0,876905
0,21 0,841638
0,26 0,807789
0,31 0,775301
0,36 0,744120
0,41 0,714193
0,46 0,685470
0,51 0,657902
0,56 0,631442


x1 x2 x3 x4
0,1243 0,492 0,0094 0,66
Воть... wink.gif
Lapp
Цитата(Dark_san @ 20.04.2010 22:17) *
Воть...
То есть тебе нужно построить полином по этой таблице, а потом вывести значения в этих четырех точках. Так?
Ньютон - это вроде как частный случай Лагранжа.. )) Лагранжа ты вроде как сделала. В чем затруднение?

Dark_san
В том, что я обсалютно не понимаю этот метод.
И нужна конечная общая формула, чему равно значение в этих точках smile.gif
Хотя бы, что бы пока забить через мат кад , а уж потом программку
Dark_san
Нужна помощь, скрипя зубами, пытаюсь написать процедуру для Ньютона, но нужен хелп вот в ожном кусочке кода.
 var
s, s1, p, p1, xx, H, J1, a: real;
k, i, n, j, ii, e1, f1, n1: integer;
x, y, z, z1: array [1..50] of real;


begin
repeat
clrscr;
write('Vvedite kolichestvo tochek: ');
readln(n);
if n<=0 then
begin
writeln;
write('Vvodit nado polozhitelnoe chislo! Nazhmite Enter');
readln;
end;
until n>0;
writeln;
for i:=1 to n do
begin
Write('vvedite x',i,': '); Readln(x[i]);
Write('vvedite y',i,': '); Readln(y[i]);
writeln;
end;
write(' Vvedite x*:'); Readln(xx);
s:=y[1];
for i:=2 to n do
begin
p:=1; s1:=0;
for j:=1 to i do
begin
if j=i then
goto l;
p:=p*(xx-x[j]);
l:
p1:=1;
for k:=1 to i do
begin
if j<>k then
p1:=p1*(x[j]-x[k]);
end;
p1:=y[j]/p1; s1:=s1+p1;
end;
p:=p*s1; s:=s+p;

____________________________________________
if j=i then
goto l;
p:=p*(xx-x[j]);
l:

Вот кусочек когда, можно как то это оформить без goto? Меня препод съест sad.gif
Lapp
Цитата(Dark_san @ 21.04.2010 2:45) *
if j=i then
goto l;
p:=p*(xx-x[j]);
l:

Вот кусочек когда, можно как то это оформить без goto?
Гм?.. blink.gif
if j<>i then p:=p*(xx-x[j]);


Цитата
Меня препод съест sad.gif
И правильно сделает, приятного ему аппетита.. yes2.gif
Гость
Цитата(Lapp @ 21.04.2010 3:05) *

Гм?.. blink.gif
if j<>i then p:=p*(xx-x[j]);


И правильно сделает, приятного ему аппетита.. yes2.gif

Ну... не честно ))
Dark_san
Цитата(Lapp @ 21.04.2010 4:05) *

Гм?.. blink.gif
if j<>i then p:=p*(xx-x[j]);


И правильно сделает, приятного ему аппетита.. yes2.gif

Т.е
if j=i then
goto l;
p:=p*(xx-x[j]);
l:
p1:=1;

можно заменить на
if j<>i then p:=p*(xx-x[j]) else
p1:=1;
Lapp
Цитата(Dark_san @ 21.04.2010 21:58) *

Т.е
if j=i then
goto l;
p:=p*(xx-x[j]);
l:
p1:=1;

можно заменить на
if j<>i then p:=p*(xx-x[j]) else
p1:=1;


Ни в коем разе!! Ты не передергивай - я "else" не писал!
В твоем посте был фрагмент с обходом оператора p:=p*(xx-x[j]) в случае, когда i=j. Все. Никаких других условий не было. То, что стоит за меткой l, будет выполняться всегда. Значит, никаких else. Ты уж определись, что именно тебе нужно, дорогая негритяночка.. smile.gif

Я посмотрю попозже твою прогу сегодня. И, может, напишу ченть. Мне нравится, что ты хоть что-то делаешь. Скажи препу - пусть оставит мне кусочек от обеда )). А вообще - ужасные у вас порядки.. smile.gif
Dark_san
smile.gif)) бывает и такое smile.gif
Lapp
Как и обещал, в конце трудового дня и перед положением тела в кресла у ТВ пишу своей далекой африканской (или австралийской?) корреспондентке - темной, но образованной труженице компьютера и всякого прочего интеграла..

Вот тебе предмет твоих ночных мечт, о гордая и независимая дочь прерий (или джунглей?) И после того, как ты покажешь ЭТО своему Высокочтимому шаману.. тьфу, пропасть! преподу - он тебя так возлюбит, что уж ТОЧНО СЪЕСТ!! как это у вас там принято.. (брр.. даже не зови в гости - не приеду!..))

const
n=11;

const
x0: double= 0.01;
h: double= 0.05;
y: array[0..n]of double = (
0.99,
0.95,
0.91,
0.87,
0.84,
0.80,
0.77,
0.74,
0.71,
0.68,
0.65,
0.63
);

function Prod(t: double; k: integer): double; // t(t-1)...(t-k)
begin
if k=0 then Prod:=t else Prod:=t*Prod(t-1,k-1)
end;


function FinDif(k,i: integer): double; // finite difference
begin
if k=0 then FinDif:=y[i] else FinDif:=FinDif(k-1,i+1)-FinDif(k-1,i)
end;


function NewtonPol(x: double): double;
var
k: integer;
p,t,f: double;
begin
p:=y[0];
t:=(x-x0)/h;
f:=1;
for k:=1 to n do begin
f:=f*k;
p:=p+Prod(t,k-1)*FinDif(k,0)/f
end;
NewtonPol:=p
end;

begin
WriteLn(NewtonPol(0.492):8:5)
end.



Цитата(Dark_san @ 22.04.2010 0:31) *
smile.gif)) бывает и такое smile.gif
Это какое же?? весь дрожу и бледнею с лица.. bad.gif
Dark_san
Спасибо но..
Во первых выдает Eror 207 Invalid Floating point operation.
Во вторых или я не выспалась, или я не вижу где используется массив с Y. И чуть чуть не поняла твоих констант...


Добавлено через 10 мин.
 Program Nyuton;
uses crt;
var
str: string;
s, s1, p, p1, xx, a: real;
k, i, n, j, ii, e1, f1, n1: integer;
x, y, z : array [1..50] of real;



begin
repeat
clrscr;
write('Vvedite kolichestvo tochek: ');
readln(n);
if n<=0 then
begin
writeln;
write('Vvodit nado polozhitelnoe chislo! Nazhmite Enter');
readln;
end;
until n>0;
writeln;
for i:=1 to n do
begin
Write('vvedite x',i,': '); Readln(x[i]);
Write('vvedite y',i,': '); Readln(y[i]);
writeln;
end;
write(' Vvedite x*:'); Readln(xx);
s:=y[1];
for i:=2 to n do
begin
p:=1; s1:=0;
for j:=1 to i do
begin
if j<>i then p:=p*(xx-x[j]);

p1:=1;
for k:=1 to i do
begin
if j<>k then
p1:=p1*(x[j]-x[k]);
end;
p1:=y[j]/p1; s1:=s1+p1;
end;
p:=p*s1; s:=s+p;
end;
writeln;
for i:=1 to n do
begin
writeln('X[',i,']',x[i]3.gif4,' Y[',i,']',y[i]3.gif4);
end;
write(' Otvet f(x*)=');
textcolor(18);
writeln(s:5:3);
writeln;
textcolor(15);
write(' Nazhmite Enter');

readln;
end

Воооооооо ^_^ все оки теперь.
Спасиб ))) скоро прийду с схемой ейткина)))
Lapp
Цитата(Dark_san @ 22.04.2010 13:40) *
Во первых выдает Eror 207 Invalid Floating point operation.
Во вторых или я не выспалась, или я не вижу где используется массив с Y. И чуть чуть не поняла твоих констант...
Используется? В конечных разностях, ессно, по формуле. То бишь в функции FinDif. А задается он константой (я не стал вводить точно, только два знака). Это для простоты, поскольку не имеет отношения к главному. Если тебе нужно вводить вручную или из файла - сделай, как надо.

Теперь скажи: в какой строке ошибка? У меня нет Турбо, я использую только FreePascal. В нем все проходит, вроде.. Сейчас еще раз проверю.. Да, все идет и на этом компе. Вот ответ (с приведенными данными):
0.65459

Откомпилируй с информацией о строках и скажи, в какой строке сбой.

Добавлено через 6 мин.
Цитата(Dark_san @ 22.04.2010 13:40) *
Воооооооо ^_^ все оки теперь.
Фиии! "Nyuton"... кашмар..

Цитата
Спасиб ))) скоро прийду с схемой ейткина)))
ну, это уже не ко мне.. мою прекрасную программу забраковала - успехов тебе..
Dark_san
Цитата(Lapp @ 22.04.2010 13:59) *


0.65459

Откомпилируй с информацией о строках и скажи, в какой строке сбой.

Натупил..кхм... это как ? smile.gif rolleyes.gif точнее где)

Добавлено через 2 мин.
Вобщем вот тут, на n-ой итерации p:=p+Prod(t,k-1)*FinDif(k,0)/f выбивает, Eror 207 Invalid Floating point operation. т.е переполнение... вот)
Dark_san
Не забраковала, а потерялась smile.gif)
Где там игрики?
куда икс вводить нашла smile.gif
а вот с игриками- проблема sad.gif
Lapp
Цитата(Dark_san @ 22.04.2010 21:06) *
Не забраковала, а потерялась smile.gif)
Гм..

Цитата
Где там игрики?
куда икс вводить нашла smile.gif
а вот с игриками- проблема sad.gif
Странно. Ты видишь вот это:
  y: array[0..n]of double = (
0.99,
0.95,
0.91,
0.87,
0.84,
0.80,
0.77,
0.74,
0.71,
0.68,
0.65,
0.63
);
- ? Это твои "игрики". Я при наборе отрезал два знака в конце. Понимаешь? Добавь. Вот и все. В чем проблема? Ты меня начинаешь разочаровывать, бушмэночка..

Проверил на Турбо - да, есть проблема. Решается небольшой коррекцией функции FinDif. В ней нужно ввести дополнительные переменные, чтобы разбить вычисление выражения. Вот так:
function FinDif(k,i: integer): double;
var
a,b: double;
begin
if k=0 then FinDif:=y[i] else begin
a:=FinDif(k-1,i+1);
b:=FinDif(k-1,i);
FinDif:=a-b
end
end;
Как ты понимаешь (надеюсь), в математику или алгоритм это не вносит никаких изменений. Но Турбо, видимо, плохо работает со стеком сопроцессора и переполняет его. Этот workaround спасает ситуацию (не знаю, насколько). Но лучше все-таки взять пергаментный свиток побольше, аккуратно переписать на него весь пакет ТурбоПаскаль, отнести его к самому большому баобабу в округе, дождаться новолуния и закопать его со всеми почестями, станцевав потом на этом месте sarabanda с бубном (или что там у вас полагается по погребальному обряду), а потом скачать FreePascal с http://FreePascal.org и зажить счастливо. Кстати, извиняюсь, Турбо, кажется, не умеет определять строку сбоя, FP умеет, забыл я уже все..

Да, и еще - на всякий случай - измени внутренность цикла в функции NewtonPol, вот так:
    f:=f/k;
p:=p+f*Prod(t,k-1)*FinDif(k,0)
Это тоже не влияет на математику, но к компьютерным вычислениям относится более щадяще..

Пиши, что получается. Задавай вопросы, что есть что и зачем. Не стесняйся. Мне гораздо больше нравится, когда спрашивают, а не когда спишут, сдадут и забудут..
Dark_san
Поняла.
А где же массив с моими иксами ?)

Добавлено через 1 мин.
п.с онли BP sad.gif или Вижуал си для этого предмета >< да и с паскалем почти не общалась, очень теряюсь в коде smile.gif
Lapp
Цитата(Dark_san @ 23.04.2010 4:53) *
А где же массив с моими иксами ?)
Ну, на зачема он нужен, скажи плз? По определению, полином сэра Исаака работает исключительно с равноотстоящими точками по x. Ты приглядись (очки надень)) - все иксы идут ровно через 0.05. Ну, и зачем тогда массив?? Достаточно начала (x0=0.01) и промежутка (h=0.05). Все. Ясно?

Цитата
онли BP sad.gif или Вижуал си для этого предмета
НЕ ВЕРЮ.
Спроси препа. Конкретно, про Free Pascal (FPC).

Добавлено через 7 мин.
Цитата(Dark_san @ 23.04.2010 4:53) *
очень теряюсь в коде smile.gif
Ты не в коде теряешься, а в чем-то еще (не знаю, в чем). Дай себе труд посмотреть внимательно (больше 5 мин) - и уж "игрики" ты бы разглядела - они занимают треть кода!..

Смотри, разленишься - не буду тебе помогать. И даже есть тебя не стану... dry.gif
Dark_san
Цитата(Lapp @ 23.04.2010 6:27) *

Ну, на зачема он нужен, скажи плз? По определению, полином сэра Исаака работает исключительно с равноотстоящими точками по x. Ты приглядись (очки надень)) - все иксы идут ровно через 0.05. Ну, и зачем тогда массив?? Достаточно начала (x0=0.01) и промежутка (h=0.05). Все. Ясно?

НЕ ВЕРЮ.
Спроси препа. Конкретно, про Free Pascal (FPC).

Добавлено через 7 мин.
Ты не в коде теряешься, а в чем-то еще (не знаю, в чем). Дай себе труд посмотреть внимательно (больше 5 мин) - и уж "игрики" ты бы разглядела - они занимают треть кода!..

Смотри, разленишься - не буду тебе помогать. И даже есть тебя не стану... dry.gif

Теперь поняла , с иксами ( п.с игрики видела, но почему то подумала, что то иксы ) xD
Lapp
Цитата(Dark_san @ 23.04.2010 12:52) *
Теперь поняла , с иксами ( п.с игрики видела, но почему то подумала, что то иксы ) xD

Так что - тебе теперь все-все понятно? smile.gif
where is thw cheepesr place to b
Teilbar Levitra 20mg
best place to buy furosemide onl
cialis levitra viagra compare
order lasix online next day deli
Viagra Generico Santiago
Andry
Цитата(Dark_san @ 22.04.2010 3:31) *

smile.gif)) бывает и такое smile.gif

Самомнение свое засунь, знаешь куда
how long does it take for gabape
Gnc Substitute For Viagra
buy zithromax z-pak without pres
viagra kamagra cialis aneros
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.