Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2010, 00:05   #1
Ladyia
 
Регистрация: 01.06.2010
Сообщений: 5
По умолчанию интерполяционный многочлен Лагранжа, Pascal

Здравствуйте!
Прошу помочь с написание программы по приложенной блок-схеме.
То,что есть у меня::confused:
-------------------------------
Код:
Uses crt;
Const nmax = 10;
Type R = array [1..nmax] of real;
Var
n ,x,y,ct,Pt,k,m,I,j : integer;
begin clrscr;
R[i]:=0;
write (‘vvedite n =  ‘);
read(n);
writeln('vvedite element massiva');
for i:=1 to n do
for j:=1 to n do
read(х[i,j]);
writeln('enter massive Y');
for i:=1 to n do
begin
ct:=1; 
Pt[i]:=1;
k:=1;
end;
for  i:=1 to n do
if i <>j then 
begin
ct:=ct*(x[i]-x[j]);
Pt[k+1]:=1;
If k>1 then for m :=k down to 2
Pt[m]:=Pt[m-1] – Pt[m]*x[j] else Pt[1]:=-Pt[1]*x[j];
K:=k+1; End;
 u := y[i]/ct;
for m:=1 to n do
R[m]=R[m] + Pt[m]*n
End; end; end;
For  i:=1 to n do
Write(R[i]:8:2);
End; readkey 
End.
-------------------------------
Я к программированию не буду иметь никакого отношения после того,как сдам наконец эту программу.
Буду благодарна,если подскажите..
Вложения
Тип файла: doc Документ Microsoft Office Word.doc (72.0 Кб, 119 просмотров)

Последний раз редактировалось Stilet; 02.06.2010 в 10:35.
Ladyia вне форума Ответить с цитированием
Старый 02.06.2010, 18:27   #2
Ladyia
 
Регистрация: 01.06.2010
Сообщений: 5
По умолчанию

C программой мне помогли:
Код:
Uses crt;
Const nmax = 100;
Var n,k,m,I,j : integer;
    ct,u:real;
    x,y,r,pt:array[1..nmax] of real;
begin
clrscr;
repeat
write('Число узлов интерполирования от 2 до ',nmax,' n=');
readln(n);
until n in [2..nmax];
writeln('Введите массив узлов интерполирования:');
for i:=1 to n do
 begin
  write('x[',i,']=');
  readln(x[i]);
 end;
writeln('Введите массив значений функции в узлах:');
for i:=1 to n do
 begin
  write('y[',i,']=');
  readln(y[i]);
 end;
clrscr;
writeln('Массив узлов:');
for i:=1 to n do
write(x[i]:0:2,' ');
writeln;
writeln;
writeln('Массив значений:');
for i:=1 to n do
write(y[i]:0:2,' ');
writeln;
writeln;
for i:=1 to n do R[i]:=0;
for i:=1 to n do
 begin
  ct:=1;pt[1]:=1;k:=1;
  for j:=1 to n do
  if i<>j then
   begin
    ct:=ct*(x[i]-x[j]);
    pt[k+1]:=1;
    if k>1 then
    for m:=k downto 2 do
    pt[m]:=pt[m-1]-pt[m]*x[j];
    pt[1]:=-pt[1]*x[j];
    k:=k+1;
   end;
  u:=y[i]/ct;
  for m:=1 to n do
  r[m]:=r[m]+pt[m]*u;
 end;
writeln('Массив коэффициентов:');
for i:=1 to n do
write(r[i]:0:2,' ');
readln
end.
Подскажите, как избавиться от ошибки "деление на ноль"(вылезает,когда вводишь данные)?
Ladyia вне форума Ответить с цитированием
Старый 02.06.2010, 19:31   #3
Fuadik
Пользователь
 
Регистрация: 22.01.2010
Сообщений: 37
По умолчанию Лагранж

Насколько я знаю, задается кол-во узлов интерполяции, массив узлов интерполяции и массив значений в узлах интерполяции. В знаменателях многочлена, как правило, нулей не бывает. Для тестирования проверьте нижеприведённую программу. Она была составлена для Дельфи, но вы сможете переделать её для Паскаля. Проверьте её с вашими данными

var i, j, n: integer;
L, p1, p2, xx: real;
x, y: array[0..9] of real;
begin
{Кол-во узлов интерполяции}
n:=3;
{Заданные точки}
{Узлы интерполяции}
x[0]:=1;
x[1]:=3;
x[2]:=5;
{Значения в узлах интерполяции}
y[0]:=3;
y[1]:=4;
y[2]:=5;
{Искомая точка}
xx:=4;
{Значение полинома Лагранжа}
L:=0;
for i:=0 to n-1 do
begin
p1:=1;
p2:=1;
for j:=0 to n-1 do
begin
if i<>j then
begin
p1:=p1*(xx-x[j]);
p2:=p2*(x[i]-x[j]);
end;
end;
L:=L+y[i]*p1/p2;
end;
Label1.Caption:=FloatToStr(L);
end;
Fuadik вне форума Ответить с цитированием
Старый 05.06.2010, 14:49   #4
Ladyia
 
Регистрация: 01.06.2010
Сообщений: 5
По умолчанию

Программа нормально заработала, выводит эти коэффициенты.
пошла сдавать программу - препод не принял Сказал, что программа должна выводить коэффициенты в порядке возрастания, у меня просто вразброс выводит..
Что нужно исправить или дописать?Подскажите,пожалуйста
Ladyia вне форума Ответить с цитированием
Старый 05.06.2010, 18:57   #5
Fuadik
Пользователь
 
Регистрация: 22.01.2010
Сообщений: 37
По умолчанию полином Лагранжа

Добавьте переменную Kf: real;
#
L:=0;
for i:=0 to n-1 do
begin
p1:=1;
p2:=1;
for j:=0 to n-1 do
begin
if i<>j then
begin
p1:=p1*(xx-x[j]);
p2:=p2*(x[i]-x[j]);
end;
// Это добавьте
Kf:=y[i]*p1/p2;
writeln(Kf:6:4);
end;
L:=L+Kf;
end;
writeln(L:6:4);
#

Последний раз редактировалось Fuadik; 05.06.2010 в 19:30. Причина: моя ошибка
Fuadik вне форума Ответить с цитированием
Старый 06.06.2010, 11:21   #6
Ladyia
 
Регистрация: 01.06.2010
Сообщений: 5
По умолчанию

Fuadik,
Большое Спасибо!)
А скажите, в каком виде должна мне ответ выводить программа, если в таблице ответов есть вот что:...
В таблице t1,t2,t3,t4 – это числитель коэффициентов, а с1,с2,с3,с4 – это yi/знаменатель коэффициентов. эта таблица как раз для моих значений(х1=-1, х2=0, х3=1, х4=2 y1=-2, y2=1, y3=2, y4=1)
под блок-схемой написано, что массив должен выводиться в порядке возрастания степени (n-1 )-я так понимаю, это ж степень при х?
значит моя программа должна выдавать массив: 1 2 -1 0 ??
или я что-то не так понимаю?
Изображения
Тип файла: jpg ОТВЕТЫ.jpg (43.6 Кб, 476 просмотров)
Ladyia вне форума Ответить с цитированием
Старый 06.06.2010, 20:21   #7
Fuadik
Пользователь
 
Регистрация: 22.01.2010
Сообщений: 37
По умолчанию Лагранж

Программа, с которой вам помогли, нормально работает. Проверьте вашу программу. У вас в выводе данных под целую часть было указано 0, а под дробную часть 2. Я поменял на 6:4.

Код:
Uses crt;
Const nmax = 100;
Var n,k,m,I,j : integer;
    ct,u:real;
    x,y,r,pt:array[1..nmax] of real;
begin
clrscr;
repeat
write('Число узлов интерполирования от 2 до ',nmax,' n=');
readln(n);
until n in [2..nmax];
writeln('Введите массив узлов интерполирования:');
for i:=1 to n do
 begin
  write('x[',i,']=');
  readln(x[i]);
 end;
writeln('Введите массив значений функции в узлах:');
for i:=1 to n do
 begin
  write('y[',i,']=');
  readln(y[i]);
 end;
clrscr;
writeln('Массив узлов:');
for i:=1 to n do
write(x[i]:6:4,' ');
writeln;
writeln;
writeln('Массив значений:');
for i:=1 to n do
write(y[i]:6:4,' ');
writeln;
writeln;
for i:=1 to n do R[i]:=0;
for i:=1 to n do
 begin
  ct:=1;pt[1]:=1;k:=1;
  for j:=1 to n do
  if i<>j then
   begin
    ct:=ct*(x[i]-x[j]);
    pt[k+1]:=1;
    if k>1 then
    for m:=k downto 2 do
    pt[m]:=pt[m-1]-pt[m]*x[j];
    pt[1]:=-pt[1]*x[j];
    k:=k+1;
   end;
  u:=y[i]/ct;
  for m:=1 to n do
  r[m]:=r[m]+pt[m]*u;
 end;
writeln('Массив коэффициентов:');
for i:=1 to n do
write('R[', i, ']=', r[i]:6:4,' ');
readln
end.


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 15.10.2013 в 15:31.
Fuadik вне форума Ответить с цитированием
Старый 06.06.2010, 21:43   #8
Ladyia
 
Регистрация: 01.06.2010
Сообщений: 5
По умолчанию

Fuadik,
Спасибо за помощь!)
программа и у меня нормально работает, просто преподаватель что-то видимо недопонял,а я,т.к. ничего не знаю,не смогла ему ничего доказать))
попробую завтра еще раз=))
Ladyia вне форума Ответить с цитированием
Старый 15.10.2013, 15:24   #9
Лиана1994
Новичок
Джуниор
 
Регистрация: 14.10.2013
Сообщений: 1
Восклицание

{Искомая точка}
xx:=4;

Что такое xx и откуда его брать, если в задании дано: построить интерполяционный полином Лагранжа по заданным точкам:
x: 1, 2, 3
y: 1, 0, 1
?
Лиана1994 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть у кого код??(интерпритационный многочлен Лагранжа) ins1der Общие вопросы Delphi 2 21.05.2010 01:20
Интерполяционный полином Ньютона - Visual Basic gred Помощь студентам 1 26.02.2009 20:12
Интерполяционный многочлен лагранжа 3.14oner Паскаль, Turbo Pascal, PascalABC.NET 2 10.11.2008 17:30
Интерполяционный полином Ньютона Skay Общие вопросы Delphi 2 19.10.2007 22:18