Что означает сообщение об ошибке w = 0 в Givens(); имеется в виду при попытке подгонки кривой в gnuplot?

Я продолжаю получать сообщение об ошибке w = 0 in Givens();, когда пытаюсь использовать gnuplot встроенную функцию подгонки кривой.

Что я делаю, так это пытаюсь подогнать экспериментальные данные к определенной математической модели в gnuplot. Я определяю функцию модели s(x):

gnuplot> z(x)=(x-mu)/be
gnuplot> s(x)=(k/be)*exp(-z(x)-exp(-z(x)))

Затем я рисую фактические данные и функцию модели, чтобы получить начальное предположение о параметрах модели:

initial

Затем я корректирую первоначальную догадку:

gnuplot> k=2.6; mu=-8.8; 
gnuplot> replot

Чтобы получить довольно хорошее изображение:

с начальной настройкой

Затем я пытаюсь точно подогнать кривую:

gnuplot> fit s(x) '701_707_TRACtdetq.log30.hist1.txt' u 2:6 via k,be,mu

И я получаю единственную итерацию и сообщение об ошибке:

 Iteration 0
 WSSR        : 3.85695           delta(WSSR)/WSSR   : 0
 delta(WSSR) : 0                 limit for stopping : 1e-05
 lambda   : 0.223951

initial set of free parameter values

k               = 2.6
be              = 1
mu              = -8.8
/

 Iteration 1
 WSSR        : 0.0720502         delta(WSSR)/WSSR   : -52.5315
 delta(WSSR) : -3.7849           limit for stopping : 1e-05
 lambda   : 0.0223951

resultant parameter values

k               = 2.03996
be              = 0.777868
mu              = -8.87082
         w = 0 in Givens();  Cjj = 3.37383e-196,  Cij = 2.54469e-192

И кривая довольно подходит:

fit

Что означает эта ошибка и как мне запустить процесс подгонки?


person mbaitoff    schedule 07.05.2013    source источник
comment
Что происходит, когда вы не используете функцию масштабирования z(x) (используя функцию непосредственно в s(x))? Что происходит, когда вы начинаете с be далеко от установленного значения, скажем, 1000? Та же ошибка в этом сообщении блога, но нет информации: dany-nash.blogspot.fr/2013/02/.   -  person Pascail    schedule 07.05.2013
comment
@Pascail: я думаю, что понял проблему: это происходит, когда подгонка достигает оптимальных значений для параметров подгонки, но остатки все еще слишком высоки для остановки итераций. Таким образом, внутренняя матрица C дает нули (или очень маленькие значения) в качестве дельт для следующей итерации. В моем случае есть крошечный выступ примерно на x=-13, который не позволяет норме сходимости достичь предела сходимости.   -  person mbaitoff    schedule 09.05.2013
comment
Великий мир численных нестабильностей... Я думаю, теперь вы сами можете ответить на свой вопрос!   -  person Pascail    schedule 09.05.2013


Ответы (2)


Сообщение об ошибке w = 0 in Givens();, по-видимому, связано с неспособностью fit выполнить следующую итерацию оценки подходящих параметров. Сообщение об ошибке сопровождается значениями некоторой матрицы C[][], которая связана с направлением следующего шага итераций подбора. Эти значения обычно очень малы, как в примере Cjj = 3.37383e-196, Cij = 2.54469e-192. Это означает, что процесс подгонки сошелся к состоянию, в котором любой другой локальный набор параметров подгонки менее оптимален, чем текущий (экстремальное локальное состояние), но текущие невязки выше предела сходимости, в данном случае delta(WSSR) : -3.7849 limit for stopping : 1e-05. Это происходит, когда данные, подлежащие подбору, демонстрируют возмущение (в данном случае примерно x=-13), которое дает значительное значение delta, несмотря на идеальное соответствие.

Короче говоря, ошибка обычно возникает, когда подгонка в порядке, но дельта все еще высока.

person mbaitoff    schedule 13.05.2013

То, что я сейчас скажу, может показаться странным, но это работает!

Когда я сталкиваюсь с ошибкой «w = 0 в Givens()», я использую:

gnuplot> set xrange [a,b]

где «a» и «b» выбраны для отображения «наиболее интересных» частей. Если вы сейчас выполните подходящую команду, которая у вас есть:

gnuplot> fit s(x) '701_707_TRACtdetq.log30.hist1.txt' u 2:6 via k,be,mu

Вы можете обнаружить, что ваша подгонка теперь сходится. Я не уверен, почему «установленный диапазон» влияет на алгоритм подбора, но это так! В вашем примере я мог бы позволить:

a = -12

b = -2

person Calleniah    schedule 21.01.2014
comment
Да, это помогает, потому что процедура подгонки теперь работает в диапазоне значений без скачков и, таким образом, сходится. - person mbaitoff; 23.01.2014