Аппроксимация по методу наименьших квадратов (МНК) доставляет минимум функционалу
е(i)(yi-f(xi))2; i=1...n
где (xi,yi) - исходные данные,
f(x) - аппроксимирующая функция.
Если число определяемых параметров функции равно числу отсчетов n, аппроксимация вырождается в интерполяцию.
Линейная регрессия:
y=ax+b.
Расчетные формулы:
d=е(i)xi;
e=е(i)yi;
f=е(i)xi2;
g=е(i)yi2;
h=е(i)xiyi;
i=1...n
a=(de-nh)/(d2-nf); b=(e-ad)/n;
s=Ц((g-be-ah)/n)
a, b - параметры аппроксимирующей прямой;
s - среднеквадратическая ошибка.
Программа 103. Линейная регрессия
10 VAC
20 PRINT C+1;:INPUT "x",A,"y",B
30 C=C+1:D=D+A:E=E+B:F=F+A*A:G=G+B*B:H=H+A*B:GOTO 20
40A=(D*E-C*H)/(D*D-C*F):B=(E-A*D)/C
50 PRINT "a";A,"b";B,"s";SQR ((G-B*E-A*H)/C):GOTO 20
Размер: 149, H
Пример:
xi |
1 |
2 |
3 |
4 |
5 |
yi |
1 |
2.02 |
3 |
4.1 |
4.96 |
Завершение ввода данных: [AC] RUN 40[EXE].
Ответ: a=1; b=0,016; s=0,0463.
Программа 104. Регрессия, сводимая к линейной. Трансцендентная двухпараметрическая зависимость y=f(a,b,x) путем замены переменных сводится к линейной
fy(x,y)=fa(a,b)fx(x,y)+fb(a,b).
Рассмотрим частный случай y=px/(q+x).
Линеаризация: 1/y=(q/p)(1/x)+1/p;
откуда p=1/b, q=a/b, y=1/y*, x=1/x*.
10 VAC
20 PRINT C+1;:INPUT "x",A,"y",B:A=1/A:B=1/B
30 C=C+1:D=D+A:E=E+B:F=F+A*A:G=G+B*B:H=H+A*B:GOTO 20
40A=(D*E-C*H)/(D*D-C*F):B=(E-A*D)/C
50 PRINT "p";1/B,"q";A/B,"s";SQR ((G-B*E-A*H)/C):GOTO 20
Размер: 165, H
Пример:
xi |
1 |
2 |
3 |
4 |
5 |
yi |
1 |
1.5 |
1.8 |
2 |
2.15 |
Завершение ввода данных: [AC] RUN 40[EXE].
Ответ: p=3,007...; q=2,007...; s=5,4 10-4.
Вычисленная оценка погрешности s относится к линеаризованной зависимости.
Программа 105. Нелинейная регрессия. Представленный здесь упрощенный алгоритм МНК принимает все отсчеты равноточными, кроме того, не оценивает погрешность.
В качестве примера рассмотрим зависимость:
y=ax/(1-bx)+cx+d.
Эквивалентное уравнение, линейное по параметрам:
y=bxy+(-bc)x2+(a+c-db)x+d;
в общем виде: y=a1y+a2x2+a3x+a4;
откуда: b=a1, d=a4, c=-a2/b,
a=a3-c-db.
Уравнения для частных производных функционала МНК по неизвестным параметрам
T/Taj е(i)(y-a1xy-a2x2-a3x-a4)2=0, i=1...4
образуют систему:
Sa=r
Формулы вычисления элементов матриц:
S |
r |
|||
еx2y2 |
еx3y |
еx2y |
еxy |
еxy2 |
еx3y |
еx4 |
еx3 |
еx2 |
еx2y |
еx2y |
еx3 |
еx2 |
еx |
еxy |
еxy |
еx2 |
еx |
n |
еy |
Для решения системы использован компактный алгоритм метода Гаусса для симметричных матриц.
Размещение в памяти:
I J K L E
M N O P F
Q R S T G
U V W X H
В программной области P0:
10 VAC
20 INPUT "x",C,"y",D:A=C*C:B=D*D:E=E+C*B:F=F+A*D:G=G+C*D:H=H+D
30 I=I+A*B:M=M+A*C*D:N=N+A*A:R=R+A*C:S=S+A:W=W+C:X=X+1:GOTO 20
В программной области P1:
10 Q=F:U=G:V=S:A=4
20 FOR D=2 TO A:D(A+D)=E(A*D)/E(A)
30 FOR B=2 TO A:IF D>B;D(A*B+D)=D(A*D+B)/D(A*B+B):GOTO 50
40 FOR C=1 TO D-1:D(A*B+D)=D(A*B+D)-D(A*B+C)*D(A*C+D):NEXT C
50 NEXT B:NEXT D:E=E/E(A):FOR B=2 TO A:FOR C=1 TO B-1
60 D(B)=D(B)-D(A*B+C)*D(C):NEXT C:D(B)=D(B)/D(A*B+B):NEXT B
70 FOR B=A-1 TO 1 STEP -1:FOR C=B+1 TO A
80 D(B)=D(B)-D(A*B+C)*D(C):NEXT C:NEXT B
90 J=E:L=H:K=-F/J:I=G-K+J*L
100 FOR B=1 TO A:PRINT CHR (64+B);H(B):NEXT B
Пример:
xi |
0.5 |
0.8 |
1 |
1.5 |
yi |
14 |
17.2 |
20 |
34 |
Ввод данных: [P0] .5[EXE] 14[EXE] .8[EXE] 17.2[EXE] 1[EXE] 20[EXE] 1.5[EXE] 34[EXE] [AC] [P1]
Ответ: a=3,0027...; b=0,4999...; c=3,9948; d=10,0009;
то есть y=3x/(1-0,5x)+4x+10.
Программа 106. Вычисление коэффициентов Фурье
ak=2/m е(i)yicos(2pik/m),
i=0...m-1, k=0...na;
bk=2/m е(i)yisin(2pik/m),
i=0...m-1, k=0...nb.
Отсчеты yi аппроксимируемой функции делят ее период на m равных интервалов. Порядок аппроксимации n=na+nb.
10 VAC:MODE 5:INPUT "n",A,"m",B
20 FOR D=0 TO B-1:PRINT D;:INPUT E:FOR C=1 TO A
30 E(C)=E(C)+E*SIN (2*p*D/B*INT
(C/2)+p*FRAC
(C/2)):NEXT C
40 NEXT D:FOR C=1 TO A
50 PRINT CHR (66-2*FRAC (C/2));INT (C/2);2/B*E(C):NEXT C
Размер: 138, E(n)
Пример: n=2; m=3; y0=0; y1=0.8660254; y2=-0.8660254.
Ответ: a0=0; b1=1.
Программа 107. Гармоническая интерполяция. В отличие от предыдущей программы предполагается n=m. Интерполяционная формула:
f(j)=a0/2+е(k)bksin jk+е(k)akcos jk; k=1..nb,na
где ak, bk - коэффициенты Фурье (см. описание программы 106);
j=2p(x-x0)/T
- фаза;
T - период;
x0 - левый край интервала-периода;
x - точка, в которой определяется значение функции.
10 VAC:MODE 5:INPUT "m",B
20 FOR D=0 TO B-1:PRINT D;:INPUT E:FOR C=1 TO B
30 F(C)=F(C)+E/B*SIN (2*p*D/B*INT
(C/2)+p*FRAC
(C/2))
40 NEXT C:NEXT D:INPUT "x0",A,"T",E
50 INPUT "x",D:D=(D-A)/E*2*p:F=G:FOR
C=2 TO B
60 F=F+2*F(C)*SIN (D*INT (C/2)+p*FRAC
(C/2))
70 NEXT C:PRINT F:GOTO 50
Размер: 184, F(m)
Пример: m=3; y0=0; y1=0.8660254; y2=-y1; x0=2p; T=2p; x=p/4.
Ответ: f(p/4)=0,7071067812.
Программа 108. Интерполяция спектра кусочно-линейной функции с разрывами. Значения действительной (af) и мнимой (bf) составляющих спектра на указанной частоте f определяются по формулам:
af=1/x/n{е(i)(yi-sin
2xi-y+i-1sin 2x(i-1) )
- sin x /xе(i)(yi--y+i-1sin
x(2i-1) )};
bf=1/x/n{е(i)(y+i-1cos
2x(i-1) - yi-cos 2xi)
- sin x /xе(i)(yi--y+i-1cos
x(2i-1) )};
i=1...n
где x=pfDt, f - частота;
Dt =ti-ti-1
- длина линейного участка аппроксимируемой функции;
yi-=y(ti-0) --значение
функции слева от разрыва или излома;
y+i=y(ti +0) --значение
функции справа от разрыва или излома;
n -число интервалов разбиения периода функции.
10 INPUT "n",A:FOR B=1 TO A:PRINT
B;
20 INPUT "t",J(3*B),"y-",I(3*B),"y+",K(3*B):NEXT B:K=K(3*A)
30 MODE 5:I=0:J=0:INPUT "f",C:C=2*p*C:FOR
B=3 TO 3*A STEP 3
40 D=C*G(B):E=C*J(B):F=(I(B)-H(B))/(E-D):G=SIN D:D=COS D
50 H=SIN E:E=COS E:I=I+F*(E-D)+I(B)*H-H(B)*G
60 J=J+F*(H-G)-I(B)*E+H(B)*D:NEXT B:C=C/2*G(B)
70 PRINT "a";I/C,"b";J/C:GOTO 30
Размер: 262, K(3*n)
При вводе данных y+0 запрашивается в конце, как yn-.
Пример: n=2; t1=1 10-6; y1- =1; y+1=0; t2=4 10-6; y2- =0; y+2=1.
Задание 1: f=0,01. Ответ: af=0,5; bf=0.
Задание 2: f=2,5 105. Ответ: af=0,3183098862; bf=0,3183098862.
Прямое:
zk=е(i)uie-j2pik/n, i=0...n-1, k=0...n-1;
Обратное:
zi=е(k)ukej2pik/n, k=0...n-1, i=0...n-1.
Здесь zi=ui=xi+jyi
- комплексные отсчеты функции времени;
zk=uk=xk+jyk
- комплексные отсчеты функции частоты.
Преобразование справедливо для периодических, либо абсолютно интегрируемых функций. В случае периодических функций отсчеты должны охватывать ровно период, в случае апериодических - всю область ненулевых значений.
Программа 109. Программа допускает разбиение периода функции только на n=2m интервалов, где m - натуральное.
Ограничение размерности: m≤5.
10 INPUT "m",A,"П",B:C=2-A:DEFM
2*C-12:FOR D=1 TO C:PRINT D;
20 INPUT "x",M(D+D),"y",N(D+D):NEXT D:MODE 5
30 FOR D=1 TO A:E=2-(A-D):G=p/E:F=COS
G:G=B*SIN G:H=1:I=0
40 FOR J=1 TO E:FOR K=J+J TO C+C STEP 4*E:L=K+E+E:M=M(K)-M(L)
50 N=N(K)-N(L):M(K)=M(K)+M(L):N(K)=N(K)+N(L)
60 M(L)=M*H-N*I:N(L)=N*H+M*I:NEXT K:K=H*F+I*G:I=I*F-H*G
70 H=K:NEXT J:NEXT D:FOR D=1 TO C-1:IF D≥E THEN 100
80 FOR H=0 TO 1:M(H)=M(E+E+H):M(E+E+H)=M(D+D+H)
90 M(D+D+H)=M(H):NEXT H
100 I=C/2
110 IF I<E;E=E-I:I=I/2:GOTO 110
120 E=E+I:NEXT D:IF B>0;D=1
130 FOR E=1 TO C:PRINT E,"x";M(E+E)/D,"y";N(E+E)/D:NEXT E
Размер: 438, N(2*2-m)
Для прямого преобразования необходимо задать "П"=1, для обратного - "П"=-1.
Пример: m=3; "П"=1;
xi |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
yi |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Проверка по свойству обратимости. Применение обратного преобразования к результатам прямого даст исходную функцию с двойной вычислительной погрешностью. Достаточно подать команды B=-B и RUN 30.
Ниже представлена модификация программы 109, рассчитанная на число отсчетов n=64. Ввод и вывод данных ведется в режиме калькулятора.
10 FOR D=1 TO 6:E=64-2-D:G=p/E:F=COS
G:G=SIN G:H=1:I=0
20 FOR J=1 TO E:FOR K=J+J TO 128 STEP 4*E:A=K+E+E:B=J(K)-J(A)
30 C=K(K)-K(A):J(K)=J(K)+J(A):K(K)=K(K)+K(A)
40 J(A)=B*H-C*I:K(A)=C*H+B*I:NEXT K:K=H*F+I*G:I=I*F-H*G
50 H=K:NEXT J:NEXT D:FOR D=1 TO 63:IF D≥E THEN 80
60 FOR H=0 TO 1:J(H)=J(E+E+H):J(E+E+H)=J(D+D+H)
70 J(D+D+H)=J(H):NEXT H
80 I=C/2
90 IF I<E;E=E-I:I=I/2:GOTO 90
100 E=E+I:NEXT D
Размер: 1212
Ввод/вывод данных
Прямое
40 ... :K=H*F+I*G:I=I*F-H*G
MODE 5
DEFM 113
L=x1
M=y1
N=x2
...
K(128)=y64
RUN
x1- L
y1- M
x2- N
...
y64- K(128)
Обратное
40 ... :K=H*F-I*G:I=I*F+H*G
MODE 5
DEFM 113
L=x1
M=y1
N=x2
...
K(128)=y64
RUN
x1- L/64
y1- M/64
x2- N/64
...
y64- K(128)/64