Создание новых данных в таблице и подгонка
Я хочу сделать следующее:
У меня есть набор данных, следующий за формой гауссовой линии, но есть некоторые данные, которые сильно отклоняются. Для полученного соответствия эти данные не должны быть включены.
Так что моя идея состоит в том, чтобы создать 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: неопределенная переменная: х"
Таким образом, мои данные находятся в диапазоне х между: [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 ответа
Вы можете фильтровать данные, создавая что-то вроде:
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 будет игнорировать.
(не испытано)
Я не понимаю, зачем вам нужно сохранять гауссианов в файлы, вы можете работать напрямую, используя функцию Гаусса 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)