Подгонка данных журнала-журнала с помощью gnuplot

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

Мой код:

    clear
reset


set terminal pngcairo size 1000,600 enhanced font 'Verdana,10'
set output 'LocalEnergyStepZoom.png'
set ylabel '{/Symbol D}H/H_0'
set xlabel 'n_{step}'
set format y '%.2e'

set xrange [*:*]
set yrange [1e-16:*]

f(x) = a*x**b
fit f(x) "revErrEnergyGfortCaotic.txt" via a,b


set logscale

plot 'revErrEnergyGfortCaotic.txt' w p,\
 'revErrEnergyGfortRegular.txt' w p,\
f(x) w l lc rgb "black" lw 3 

exit

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

Большое спасибо

Наконец, я могу решить проблему, используя предложение в ответе Кристопа, и немного изменить его.

Я нашел приблизительный наклон функции (что-то близкое к -4), затем, приняв это исправление параметра, я просто подогнал кривую только с a, нашел ее, исправил и изменил только b. После этого, используя вывод в качестве начального решения для подгонки, я нашел наилучшее соответствие. введите здесь описание изображения


person Panichi Pattumeros PapaCastoro    schedule 13.05.2014    source источник
comment
Лучше всего подобрать линейную функцию f(x) = a*x + b, а затем подобрать, используя log(y) по сравнению с log(x). Для этого используйте опцию using: fit f(x) "data" using (log($1)):(log($2)) via a,b.   -  person Miguel    schedule 13.05.2014
comment
@Miguel: Это должен быть ответ - ответ!!   -  person Raman Shah    schedule 14.05.2014
comment
@RamanShah Вопрос был (строго говоря) о том, как соответствовать экспоненциальному показателю с использованием gnuplot, для которого ответ Кристофа является правильным. Теперь, если вы спросите о правильном способе решения этой проблемы с точки зрения анализа данных... Я просто оставлю комментарий как полезный обходной путь для людей с похожими проблемами.   -  person Miguel    schedule 14.05.2014
comment
Ха-ха, достаточно честно, @Miguel.   -  person Raman Shah    schedule 14.05.2014


Ответы (4)


Вы должны найти подходящие начальные значения, чтобы получить правильную подгонку, потому что такая подгонка не имеет единого глобального решения. Если вы не определите a и b, оба будут установлены на 1, что может быть слишком далеко. Попробуйте использовать

a = 100
b = -3

для лучшего старта. Возможно, вам нужно немного изменить эти значения, я не мог, потому что у меня нет файла данных.

Кроме того, вы можете ограничить область фитинга частью выше 10:

fit [10:] f(x) "revErrEnergyGfortCaotic.txt" via a,b

Конечно, только если это уместно.

person Christoph    schedule 13.05.2014

Это распространенная проблема при анализе данных, и я не уверен, есть ли хороший способ Gnuplot для ее решения.

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

Недавно я читал курс для студентов, где им нужно было подогнать такие данные. Многие из них превзошли свои (matlab) подгоночные процедуры, выбрав очень строгие критерии сходимости, но даже это не слишком помогло.

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

person Raman Shah    schedule 13.05.2014

Основная проблема здесь заключается в том, что остаточные ошибки значений функции при более высоких значениях x очень малы по сравнению с остатками при более низких значениях x. В конце концов, вы охватываете почти 20 порядков по оси Y.

Просто взвесьте значения y с помощью 1/y**2 или даже лучше: если у вас есть стандартные отклонения ваших точек данных, взвесьте значения с помощью 1/std**2. Тогда подгонка должна сходиться намного лучше.

В gnuplot взвешивание выполняется с использованием третьего столбца данных:

fit f(x) 'data' using 1:2:(1/$2**2") via ... 

Или вы можете воспользоваться советом Раман Шаха и линеаризовать ось Y и выполнить линейную регрессию.

person mrossi    schedule 11.11.2014

вам нужно использовать веса для вашей подгонки (в настоящее время низкие значения не считаются важными) и иметь лучшее начальное предположение (через pars_file.pars)

person user15083428    schedule 26.01.2021