Мне нужна помощь в следующем: У меня есть файл данных (столбцы разделенные знаком "\ t" в таблице), как это data.dat
# y1 y2 y3 y4
17.1685 21.6875 20.2393 26.3158
Это значения x 4 точек для линейной аппроксимации. Четыре значения y постоянны: 0, 200, 400, 600
.
Я могу создать линейную аппроксимацию пар точек (x, y)
: (x1, y1) = (17,1685,0), (x2, y2) = (21,6875,200 ), (x3, y3) = (20,2393,400), (x4, y4) = (26,3158,600)
.
Теперь я хотел бы провести линейную аппроксимацию трех из этих точек paris, (x1, y1), (x2, y2), (x3, y3) и (x2, y2), (x3, y3) ), (x4, y4) и (x1, y1), (x3, y3), (x4, y4) и (x1, y1), (x2, y2), (x4, y4).
Если у меня есть эти три точки с линейной аппроксимацией, я хотел бы знать значение значения x экстраполированной точки, взятой из этих трех подобранных точек.
Пока у меня есть этот awk-код:
#!/usr/bin/awk -f
BEGIN{
z[1] = 0;
z[2] = 200;
z[3] = 400;
z[4] = 600;
}
{
split($0,str,"\t");
n = 0.0;
for(i=1; i<=NF; i++)
{
centr[i] = str[i];
n += 1.0;
# printf("%d\t%f\t%.1f\t",i,centr[i],z[i]);
}
# print "";
if (n > 2)
{
lsq(n,z,centr);
}
}
function lsq(n,x,y)
{
sx = 0.0
sy = 0.0
sxx = 0.0
syy = 0.0
sxy = 0.0
eps = 0.0
for (i=1;i<=n;i++)
{
sx += x[i]
sy += y[i]
sxx += x[i]*x[i]
sxy += x[i]*y[i]
syy += y[i]*y[i]
}
if ( (n==0) || ((n*sxx-sx*sx)==0) )
{
next;
}
# print "number of data points = " n;
a = (sxx*sy-sxy*sx)/(n*sxx-sx*sx)
b = (n*sxy-sx*sy)/(n*sxx-sx*sx)
for(i=1;i<=n;i++)
{
ycalc[i] = a+b*x[i]
dy[i] = y[i]-ycalc[i]
eps += dy[i]*dy[i]
}
print "# Intercept =\t"a"
print "# Slope =\t"b"
for (i=1;i<=n;i++)
{
printf("%8g %8g %8g \n",x[i],y[i],ycalc[i])
}
} # function lsq()
Итак,
If we extrapolate to the place of 4th
0 17.1685 <--(x1,y1)
200 21.6875 <--(x2,y2)
400 20.2393 <--(x3,y3)
600 22.7692 <<< (x4 = 600,y1 = 22.7692)
If we extrapolate to the place of 3th
0 17.1685 <--(x1,y1)
200 21.6875 <--(x2,y2)
400 23.6867 <<< (x3 = 400,y3 = 23.6867)
600 26.3158 <--(x4,y4)
0 17.1685
200 19.35266 <<<
400 20.2393
600 26.3158
0 18.1192 <<<
200 21.6875
400 20.2393
600 26.3158
Мой текущий вывод следующий:
$> ./prog.awk data.dat
# Intercept = 17.4537
# Slope = 0.0129968
0 17.1685 17.4537
200 21.6875 20.0531
400 20.2393 22.6525
600 26.3158 25.2518