12.10.2014, 18:41 | #1 (permalink) |
Новичок
Регистрация: 24.02.2014
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Интерполяция функций
Интерполировать заданную таблично функцию полиномами 1-го порядка (локальная линейная интерполяция) и полиномом n-го порядка (глобальная интерполяция). Вычислить значение функции в точке x: xi= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 yi=-1.06, -0.83, -0.68, -0.31, 0.11, 0.00, 0.12, 0.53, 0.18, 0.25, 0.38, 0.21, 0.44, 0.63, 0.86, 1.05, 1.32, 1.55, 1.82, 1.71 в точке х=11.24. (Аппроксимация функций) Аппроксимировать табличную функцию из предыдущей задачи полиномом 1 и 2 степени. Используя полученную аппроксимацию, вычислить значение функции в точке, указанной в предыдущей задаче. На одной координатной плоскости построить график исходной табличной функции и графики аппроксимирующих полиномов. |
12.10.2014, 18:41 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Рекомендую вам прочитать эти темки, тут наверняка есть содержательные ответы С++ Использование inline функций 20 новых функций iOS 7 Паскаль, подпрограммы функций Си, вопросы насчет функций Непрерывность элементарных функций Табулирование функций |
12.10.2014, 18:44 | #2 (permalink) | |
Новичок
Регистрация: 24.02.2014
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
вот что мне удалось написать по поводу интерполяции, но не факт что правильно.....а как быть с аппроксимацией? кто-нибудь может помочь?
Цитата:
|
|
12.10.2014, 19:11 | #3 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Вот это что за ахинея?
Вероятно, имеется в виду if (x[i-1]<=xp) and (xp<=x[i+1])? Повнимательнее, пожалуйста. Далее - при вычислении коэффициентов a, b и c в квадратичной интерполяции у Вас дроби (числитель и знаменатель) перевернуты. Могу привести формализм, которым сам пользуюсь (отлаженный и проверенный). Если парабола проходит через точки с координатами (X1,Y1), (X2,Y2), (X3,Y3) и требуется определить значение Y в точке X, лежащей между X1 и X3, то Код:
det:=(X1-X2)*(X2-X3)*(X1-X3); A:=(Y1*(X2-X3)+Y2*(X3-X1)+Y3*(X1-X2))/det; B:=(Y1*(X3*X3-X2*X2)+Y2*(X1*X1-X3*X3)+Y3*(X2*X2-X1*X1))/det; C:=(Y1*X2*X3*(X2-X3)+Y2*X1*X3*(X3-X1)+Y3*X1*X2*(X1-X2))/det; Y:=A*X*X+B*X+C; Теперь насчет аппроксимаций, линейной и квадратичной. Формализм достаточно подробно изложен, например, здесь: http://edu.dvgups.ru/METDOC/ENF/VMAT...GZ/frame/2.htm Надеюсь, запрограммировать все эти суммы Вы сумеете. |
13.10.2014, 17:52 | #4 (permalink) |
Новичок
Регистрация: 24.02.2014
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
правильно делаю?
Код:
program Approks; uses crt; label 1,2; var m,i,j,n,k:integer; q,x,y,b,kof: array [0..30] of real; a: array [0..30,0..30] of real; s,r,c,v,e,func:real; BEGIN n:=19; x[0]:=1; x[1]:=2; x[2]:=3; x[3]:=4; x[4]:=5; x[5]:=6; x[6]:=7; x[7]:=8; x[8]:=9; x[9]:=10; x[10]:=11; x[11]:=12; x[12]:=13; x[13]:=14; x[14]:=15; x[15]:=16; x[16]:=17; x[17]:=18; x[18]:=19; x[19]:=20; y[0]:=-1.06; y[1]:=-0.83; y[2]:=-0.68; y[3]:=-0.31; y[4]:=0.11; y[5]:=0.00; y[6]:=0.12; y[7]:=0.53; y[8]:=0.18; y[9]:=0.25; y[10]:=0.38; y[11]:=0.21; y[12]:=0.44; y[13]:=0.63; y[14]:=0.86; y[15]:=1.05; y[16]:=1.32; y[17]:=1.55; y[18]:=1.82; y[19]:=1.71; write('введите степень полинома N:'); readln(m); for i:=0 to n do q[i]:=1; i:=0; repeat s:=0; r:=0; j:=0; 1: if j>n then begin a[0,i]:=s; b[i]:=r; end else begin s:=s+q[j]; r:=r+q[j]*y[j]; {Программа формирует матрицу} q[j]:=q[j]*x[j]; j:=j+1; goto 1; end; i:=i+1; until i>m; i:=1; repeat s:=0; j:=0; 2: if j>n then begin a[i,m]:=s; i:=i+1; end else if j<m then begin a[i,j]:=a[i-1,j+1]; s:=s+q[j]; q[j]:=q[j]*x[j]; j:=j+1; goto 2; end else begin s:=s+q[j]; q[j]:=q[j]*x[j]; j:=j+1; goto 2; end; until i>m; {решение СЛАУ методом Гаусса} for k:=0 to m do begin for i:=k+1 to m do begin c:= (a[i,k])/(a[k,k]); a[i,k]:=0; for j:=k+1 to m do begin a[i,j]:=a[i,j]-a[k,j]*c; end; b[i]:=b[i]-b[k]*c; end; end; x[m]:=b[m]/a[m,m]; for i:=m-1 downto 0 do begin v:=0; for j:=i+1 to m do begin v:=v+(a[i,j]*x[j]); end; x[i]:=(b[i]-v)/a[i,i]; end; for i:=m downto 0 do kof[i]:=x[i]; for i:=m downto 0 do writeln('a',i,'= ',kof[i]:0:5); x[0]:=1; x[1]:=2; x[2]:=3; x[3]:=4; x[4]:=5; x[5]:=6; x[6]:=7; x[7]:=8; x[8]:=9; x[9]:=10; x[10]:=11; x[11]:=12; x[12]:=13; x[13]:=14; x[14]:=15; x[15]:=16; x[16]:=17; x[17]:=18; x[18]:=19; x[19]:=20; func:=0; e:=0; for j:= 0 to n do func:=0; begin for i:=m downto 0 do func:=func+(power(x[j],i)*kof[i]); e:=e+(y[j]-func)*(y[j]-func); end; writeln('Погрешность= ', e:1:5); end. |
13.10.2014, 20:29 | #5 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Наверное. Уж извините, но делать за вас черновую работу по тестированию и отладке программы я лично не буду. Замечу только, что, во-первых, все эти goto и label - дурной тон, лучше обходиться без них, а во-вторых, я бы вместо
Код:
x[0]:= 1; x[1]:= 2; x[2]:= 3; x[3]:= 4; x[4]:= 5; x[5]:= 6; x[6]:= 7; x[7]:= 8; x[8]:= 9; x[9]:=10; x[10]:=11; x[11]:=12; x[12]:=13; x[13]:=14; x[14]:=15; x[15]:=16; x[16]:=17; x[17]:=18; x[18]:=19; x[19]:=20; Код:
for i:=0 to 19 do x[i]:=i+1; |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Опции темы | |
Опции просмотра | |
|
|