Создание новых данных в таблице и подгонка

1254
Mattes

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

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

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

enter image description here

Я могу легко создать 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 Гаусса.

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

1
В вашей формуле для `g` есть хотя бы одна опечатка, после скобок -` 2`. Пожалуйста, скопируйте и вставьте именно ваш код. Кроме того, ваш x-диапазон не имеет особого смысла, если ваши данные действительно находятся между x = 1038.6603 и x = 1038.666 и были получены вычислением с плавающей запятой с арифметикой двойной точности, я боюсь, что относительная ошибка на x будет огромной. И это также может быть проблемой для подгонки. Вы должны сбросить источник данных этой частоты с. Joce 8 лет назад 0
Здесь это скорее дает «неопределенную функцию h (x)». Вы должны определить это. Причина, по которой я представил это в своем ответе ниже, состоит в том, что вы не можете отрегулировать g (x), подгоняя, в то же время используя для фильтрации ... Joce 8 лет назад 0
да, но это не помогает. Может кто-нибудь, пожалуйста, помогите мне? Mattes 8 лет назад 0
Только что отметили, что есть `x` в` filterData (y, m, M) = ((yM)? 1/0: y) `который должен быть` y`, `filterData (y, m, M) = ((yM)? 1/0: у) `. Joce 8 лет назад 0
Я нашел эту ошибку вчера :) теперь она работает: D !!! отлично, спасибо! НО ... следующее действительно серьезно: если я использую подгонку с двумя гауссианами, моя ошибка будет больше, чем без гауссиан. Но должно быть наоборот. Ты знаешь почему? Mattes 8 лет назад 0
Я считаю, что фильтрация данных перед установкой не подходит. Как выбираются параметры `g`? Во всяком случае, это не вопрос для superuser.SE! (Кстати, подумайте о голосовании / принятии полезных ответов) Joce 8 лет назад 0
@ Джо ... это незарегистрированный пользователь ... Я сомневаюсь, что Мэттс скоро вернется. Возьми мой голос (ы) вместо этого. Hastur 8 лет назад 0

2 ответа на вопрос

1
Yorik

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

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
Joce

I don't understand why you would need to save the Gaussians into files, you can work directly using your Gauss function g.

As you want to compare your data with the two Gaussians, your filtering function needs to be given max and min value at the position considered:

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

Then you can plot and/or fit:

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) 

Похожие вопросы