- •Лабораторная работа №3 «Регрессионный анализ и аппроксимация функций. Интерполяция и экстраполяция»
- •Содержание
- •6. Рекомендуемая литература 27
- •1. Цель работы: научиться определять параметры регрессии и аппроксимировать экспериментальные данные функциональными зависимостями путем написания специализированных программ на языке высокого уровня.
- •2.Краткие теоретические сведения.
- •3.Примеры программной реализации рассмотренных методов (на языке бейсик).
- •4.Задания для выполнения.
- •5.Контрольные вопросы.
- •6. Рекомендуемая литература
3.Примеры программной реализации рассмотренных методов (на языке бейсик).
Интерполяционный многочлен Лагранжа
01 cls
05 defdbl a-z
10 print "Интерполяция по Лагранжу"
15 input "Введите число узлов n=",n:dim a(n),b(n)
20 for i=0 to n-1
23 locate 3,1
25 print "Введите x(";i;")=";:input ,a(i)
30 print "Введите y(";i;")=";:input ,b(i)
31 locate 3,1
32 print " "
33 print " "
35 next i
40 input "Введите точку интерполяции x=",x
45 for j=1 to n-1
50 c=1
55 for i=1 to n-1
60 d=a(j)-a(i):if i=j then d=x-a(j)
65 if d=0 then print "y(x)=";b(i): goto 95
70 c=c*(x-a(i))/d
75 next i
80 s=s+c*b(j)
85 next j
90 print " Значение функции y(x)=";s
95 input " Необходимы ещё вычисления ? (1/0)",es
100 if es=1 then goto 40
105 print « Работа завершена»
110 end
Сплайн-аппроксимация
01 cls
05 defdbl a-z
10 print "Сплайн-аппроксимация, интерполяция и экстраполяция"
15 input "Введите число узлов N=",n
20 dim x(n),l(n),m(n),r(n),s(n)
25 for i=1 to n
30 locate 3,1:print " Номер узла ";i
31 print " "
32 print " "
33 locate 4,1
35 input "Введите x=",x(i)
40 input "Введите y=",y(i)
45 next i
50 d=x(2)-x(1):e=(y(2)-y(1))/d
60 for k=2 to n-1
65 h=d:d=x(k+1)-x(k)
70 f=e:e=(y(k+1)-y(k))/d:l(k)=d/(d+h)
75 r(k)=1-l(k):s(k)=6*(e-f)/(h+d)
80 next k
85 for k=2 to n-1
90 p=1/(r(k)*l(k-1)+2):l(k)=-l(k)*p:s(k)=(s(k)-r(k)*s(k-1))*p
95 next k
100 m(n)=0:l(n-1)=s(n-1):m(n-1)=l(n-1)
105 for k=n-2 to 1 step -1
110 l(k)=l(k)*l(k+1)+s(k):m(k)=l(k)
115 next k
120 for k=1 to n
125 print "Коэффициенты сплайна M(";k;")=";m(k)
130 next k
135 print "Провести интерполяцию-экстраполяцию ? (1/0)";
140 input ,t
145 if t=0 then goto 260
150 input "Введите аргумент x=",x:i=0:if x>x(n) then goto 190
155 if x<=x(1) then goto 200
160 i=i+1
165 if x>x(i) then goto 160
170 j=i-1:d=x(i)-x(j):h=x-x(j):r=x(i)-x
175 p=d*d/6:y=(m(j)*r^3+m(i)*h^3)/6/d
180 y=y+((y(j)-m(j)*p)*r+(y(i)-m(i)*p)*h)/d
185 print "Значение функции y(x)=";y:input " Вычислить ещё ? (1/0)",t1
187 if t1=1 then goto 150 else goto 260
190 d=x(n)-x(n-1):y=d*m(n-1)/6+(y(n)-y(n-1))/d
195 y=y*(x-x(n))+y(n): goto 185
200 d=x(2)-x(1):y=-d*m(2)/6+(y(2)-y(1))/2
205 y=y*(x-x(1))+y(1):goto 185
260 print "Работа завершена"
Линейная регрессия
01 cls
03 defdbl a-z
05 print "Линейная регрессия"
10 input " Введите количество пар точек n=",n
15 a=0:b=0:c=0:d=0
20 print " Введите попарно x(i),y(i)"
25 for i=1 to n
27 locate 4,1:print "Текущий номер точки i=";i
28 locate 5,1
30 input "x(i)=",x:input "y(i)=",y
33 locate 5,1:print " "
34 locate 6,1:print " "
35 a=a+x:b=b+y:c=c+x^2:d=d+x*y
40 next i
45 b1=(a*b-n*d)/(a^2-n*c)
50 b0=(b-b1*a)/n
100 print "y(x)=";b0;"+";b1;"*x";
110 end
Гиперболическая регрессия
01 cls
03 defdbl a-z
05 print "Гиперболическая регрессия"
10 input " введите количество пар точек n=",n
15 a=0:b=0:c=0:d=0
20 print "введите попарно x(i),y(i)"
25 for i=1 to n
27 locate 4,1:print "Номер точки i=";i
28 locate 5,1
30 input "x(i)=",x:input "y(i)=",y
33 locate 5,1:print " "
34 locate 6,1:print " "
35 a=a+1/x:b=b+1/(x^2):c=c+y:d=d+y/x
40 next i
43 e=n*b-a^2:f=c*b-d*a
45 k=n*d-a*c:f=f/e:k=k/e
100 print "y(x)=";f;"+";k;"/x";
110 end
Степенная регрессия
01 cls
03 defdbl a-z
05 print " Степенная регрессия"
10 input " Введите количество точек n=",n
15 a=0:b=0:c=0:d=0
20 print " Введите попарно x(i),y(i)"
25 for i=1 to n
27 locate 4,1:print "i=";i
28 locate 5,1
30 input "x(i)=",x:input "y(i)=",y
33 locate 5,1:print " "
34 locate 6,1:print " "
35 a=a+log(x):b=b+log(y):c=c+log(x)*log(y):d=d+(log(x))^2
40 next i
43 e=(a*b-n*c)/(a^2-n*d):f=exp((b-e*a)/n)
100 print "y(x)=";f;"*x^";e;
110 end
Показательная регрессия
01 cls
03 defdbl a-z
05 print " Показательная регрессия"
10 input " Введите количество точек n=",n
15 a=0:b=0:c=0:d=0
20 print " Введите попарно x(i),y(i)"
25 for i=1 to n
27 locate 4,1:print "i=";i
28 locate 5,1
30 input "x(i)=",x:input "y(i)=",y
33 locate 5,1:print " "
34 locate 6,1:print " "
35 a=a+x:b=b+x^2:c=c+log(y)/log(10):d=d+x*log(y)/log(10)
40 next i
43 e=(n*b-a^2):f=c*b-d*a
45 k=n*d-a*c:f=10^(f/e):k=10^(k/e)
100 print "y(x)=";f;"*";k;"^x";
110 end
Экспоненциальная регрессия
01 cls
03 defdbl a-z
05 print " Экспоненциальная регрессия"
10 input " Введите количество точек n=",n
15 a=0:b=0:c=0:d=0
20 print " Введите попарно x(i),y(i)"
25 for i=1 to n
27 locate 4,1:print "i=";i
28 locate 5,1
30 input "x(i)=",x:input "y(i)=",y
33 locate 5,1:print " "
34 locate 6,1:print " "
35 a=a+x:b=b+log(y):c=c++x^2:d=d+x*log(y)
40 next i
43 b1=(a*b-n*d)/(a^2-n*c):b0=exp((b-b1*a)/n)
100 print "y(x)=";b0;"*exp(";b1;"*x)";
110 end
Логарифмическая регрессия.
01 cls
03 defdbl a-z
05 print " Логарифмическая регрессия"
10 input " введите количество точек n=",n
15 a=0:b=0:c=0:d=0
20 print " Введите попарно x(i),y(i)"
25 for i=1 to n
27 locate 4,1:print "i=";i
28 locate 5,1
30 input "x(i)=",x:input "y(i)=",y
33 locate 5,1:print " "
34 locate 6,1:print " "
35 a=a+log(x)/log(10):b=b+(log(x)/log(10))^2
37 c=c+y:d=d+y*log(x)/log(10)
40 next i
43 e=n*b-a^2:f=c*b-d*a
45 k=n*d-a*c:f=f/e:k=k/e
100 print "y(x)=";f;"+";k;"lg(x)";
110 end
Параболическая регрессия
01 cls
03 defdbl a-z
05 print " Параболическая регрессия"
10 input " введите число точек n=",n
15 print " Введите попарно x(i),y(i)"
20 data 0,0,0,0,0,0,0
23 read b,c,f,m,p,r,s
24 a=n
25 for i=1 to n
27 locate 4,1:print "i=";i
28 locate 5,1
30 input "x(i)=",x:input "y(i)=",y
33 locate 5,1:print " "
34 locate 6,1:print " "
35 b=b+x:c=c+x^2:f=f+x^3:m=m+x^4:p=p+y:r=r+x*y:s=s+y*x^2
40 next i
45 d=b:e=c:k=c:l=f:q=d/a:e=e-q*b:f=f-q*c:r=r-q*p:q=k/a:l=l-q*b
50 m=m-q*c:s=s-q*p:q=l/e
55 b2=(s-r*q)/(m-f*q):b1=(r-f*b2)/e
60 b0=(p-b*b1-c*b2)/a
100 print "y(x)=";b0;"+";b1;"*x+";b2;"*x^2";
110 end
