1

Я хочу сделать следующее:

У меня есть набор данных, следующий за формой гауссовой линии, но есть некоторые данные, которые сильно отклоняются. Для полученного соответствия эти данные не должны быть включены.

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

Я могу легко создать 2 гауссиана и создать эти данные в таблице, используя: (примечание: данные = файл данных)

set table '1.Gauss'                  
plot g(x)+0.1   
unset table  
set table '2.Gauss'  
plot g(x)-0.1  
unset table  
set table 'all'  
plot '1.Gauss', '2.Gauss', 'data'  
unset table  

Но потом: все данные перечислены один за другим. Более того, я не знаю, как это сделать позже, сказав, что просто используйте эти данные, если они находятся между этими двумя гауссианами.

У тебя есть другая идея?

Сложение:

Я не очень увлекаюсь программированием или gnuplot, поэтому мне сложно понять ваши сообщения. Итак, вот все мои программы в gnuplot:

    set xrange [1038.6603:1038.666]
    set yrange [0.8:1.3]
    file="data"   
    g(x) = N0*(A*exp(-(x-(b+d))2/(2*sigma2)))+c  
    N0=0.2; b=1038.66315;d=0.00001; c=1; A=3; sigma=0.0001

    filterData(y,m,M)=((yM)? 1/0 : y)  
    fit h(x) file using 1:(filterData($2,g($1)-0.1,g($1)+0.1)) via N0,d,c,A,sigma 
    plot file using 1:(filterData($2,g($1)-0.1,g($1)+0.1)) g(x)-0.1, g(x)+1, h(x)

От второго до последнего ряда gnuplot говорит: «неопределенная переменная: x»

Я знаю, что что-то, конечно, отсутствует или неправильно, но я действительно не знаю, как решить. Не могли бы вы также прокомментировать ваши строки? Так что может понять непрофессионал как я? Спасибо :)

ЗДЕСЬ 2-Й ДОПОЛНЕНИЕ:

вот весь мой текст:

    set xrange [1038.6598:1038.6663]
    set yrange [0.8:1.3]
    set fit errorvariables
    file= "09_05_16-10.thzpp"        
    g(x) = N0*(A*exp(-(x-(b+d))**2/(2*sigma**2)))+c
    N0=0.2; b=1038.66315;d=0.00001; c=1; A=3; sigma=0.0001
    filterData(y,m,M)=((y<m||x>M)? 1/0 : y)
    fit h(x) file using 1:(filterData($2,g($1)-0.1,g($1)+0.1)) via N0,d,c,A,sigma 
    plot file using 1:(filterData($2,g($1)-0.1,g($1)+0.1)), g(x)-0.1, g(x)+1, h(x)

Это дает мне ошибку «в строке 8: неопределенная переменная: х»

Таким образом, мои данные находятся в диапазоне x между: [1038.6598: 1038.6663]. Когда я удаляю последние 3 строки и просто использую вместо:

   fit [1038.6603:1038.666] [0.95:1.2] g(x) file via N0,d,c,A,sigma
   plot file title 'Messung', g(x) title 'Fit'

это работает, но у меня нет этого приятного ограничения 2 Гаусса.

Так что же не так в моем верхнем тексте?

2 ответа2

1

Вы можете фильтровать данные, создавая что-то вроде:

min_value = 1
max_value = 2
filterData(x)=(x < min_value || x > max_value) ? (1/0) : (x)
plot 'data' u 1:(filterData($2))

Тернарный оператор: (is this true) ? it is true : it is false а 1/0 не определено, который gnuplot будет игнорировать.

(не испытано)

1

Я не понимаю, зачем вам нужно сохранять гауссианов в файлы, вы можете работать напрямую, используя функцию Гаусса g .

Поскольку вы хотите сравнить ваши данные с двумя гауссианами, вашей функции фильтрации нужно дать максимальное и минимальное значение в рассматриваемой позиции:

filterData(y,m,M)=((y<m||y>M)? 1/0 : y)

Затем вы можете построить и / или разместить:

fit h(x) 'data' using 1:(filterData($2,g($1)-0.1,g($1)+0.1)) via ...
plot 'data' using 1:(filterData($2,g($1)-0.1,g($1)+0.1)), \
     g(x)-0.1, \
     g(x)+0.1, \
     h(x)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .