Подгонка данных мультимножества в GNUplot - PullRequest
1 голос
/ 05 августа 2020

У меня 5 матриц по 4 ячейки в каждой. Мне нужно подогнать каждую ячейку с помощью функции в GNUplot. Так, например, Данные y, соответствующие первой ячейке, будут значением первой ячейки в 5 матрицах. Как мне организовать эти данные в файле так, чтобы GNUplot автоматически определял данные x и y и подходил для каждой ячейки, давая подогнанные параметры в виде матрицы в том же порядке, что и ячейки? Кроме того, как можно было бы написать сценарий для такой подгонки?

Пример выглядит следующим образом:

Matrix 1: 2 4
          3 6
Matrix 2: 5 7
          9 1

Как это существует 5 матриц Теперь первый набор данных y будет 2, 5, ...; второй набор будет 4,7, ...; третий набор будет 3,9, ...; и четвертый набор 6,1, ... Предположим, мои значения x равны 0,1,2,4,8. Теперь я подгоняю первый набор значений y вместе с этими значениями x к некоторой функции f (x) и получаю значение параметра 4. Аналогично для других трех наборов я получаю 7,9 и 6 в качестве значения параметра. Поэтому я бы хотел, чтобы результат выглядел так:

Result: 4 7
        9 6

1 Ответ

2 голосов
/ 05 августа 2020

Ну это еще сложно понять. Но тем не менее, позвольте мне попробовать и будем надеяться, что мы приближаемся к тому, что вы хотите.

В целях иллюстрации и для облегчения понимания значения в приведенных ниже примерах матриц выбраны следующим образом: <MatrixNo><RowNo><ColNo> . После ваших комментариев теперь это матрицы 3x2.

Данные:

# Matrix1
111  112
121  122
131  132

# Matrix2
211  212
221  222
231  232

# Matrix3
311  312
321  322
331  332

# Matrix4
411  412
421  422
431  432

# Matrix5
511  512
521  522
531  532

Я думаю, что приведенные выше данные, вероятно, были бы лучше организованы так, как в примере код ниже. Конечно, вы можете переформатировать данные с помощью внешнего инструмента или даже с помощью gnuplot. Затем вы делаете подгонки в пределах al oop. Чтобы запомнить значения подходящих параметров, я использовал массивы (мне кажется, требуется gnuplot 5.0 или 5.2). В консоли gnuplot, например, введите help fit или любое другое ключевое слово, чтобы получить дополнительную информацию.

Код: (Отредактировано для матриц I x J)

### fits in a loop
reset session

$Data <<EOD
0  111  112  121  122  131  132
1  211  212  221  222  231  232
2  311  312  321  322  331  332
4  411  412  421  422  431  432
8  511  512  521  522  531  532
EOD

M = 5    # number of matrices
I = 3    # number of rows of each matrix
J = 2    # number of columns of each matrix
N = I*J  # number of y values

array aList[N]
array bList[N]

# fitting in a loop
f(x,a,b) = a*sqrt(x) + b
set fit nolog quiet
do for [i=1:N] {
    fit f(x,a,b) $Data u 1:(column(i+1)) via a,b
    aList[i] = a
    bList[i] = b
}

# prepare the matrix output 
do for [i=1:I] {
    line = ''
    do for [j=1:J] {
        line = line.sprintf("%g ",bList[(i-1)*J+j])
    }
    print line
}

set key bottom right
plot for [i=1:N] $Data u 1:(column(i+1)) w p ti sprintf("Values %d",i), \
     for [i=1:N] f(x,aList[i],bList[i]) w l ti sprintf("Fit %d",i)

### end of code

Результат:

97.1388 98.1388 
107.139 108.139 
117.139 118.139 

Участок:

введите описание изображения здесь

...