Подгонка Gnuplot вложенной функции

Как правильно в gnuplot подобрать функцию f(x), имеющую следующую форму?

f(x) = A*exp(x - B*f(x))

Я попытался подогнать его под любую другую функцию, используя:

fit f(x) "data.txt" via A,B 

и на выходе просто предложение: "stack overflow"

Я даже не знаю, как искать эту тему, поэтому любая помощь будет очень признательна.

Как называются такие функции? Вложенный? Рекурсивный? Скрытый?

Спасибо


person user3916321    schedule 06.08.2014    source источник
comment
Вы пытаетесь переопределить f(x) в терминах ранее определенной функции с тем же именем или пытаетесь определить рекурсивную функцию?   -  person Tom Fenech    schedule 07.08.2014


Ответы (3)


Это не только не подходит для установки, но и для построения графика. Вам придется записать явную форму f(x), иначе gnuplot будет зацикливать ее, пока не достигнет предела рекурсии. Один из способов сделать это - использовать другое имя:

f(x) = sin(x) # for example
g(x) = A*exp(x - B*f(x))

А теперь используйте для подгонки g(x), а не f(x). Если вы никогда не объявляли f(x), то у gnuplot нет выражения для работы. В любом случае, если вы хотите рекурсивно определить функцию, вам нужно как минимум установить предел рекурсии. Может быть, что-то вроде этого:

f0(x) = x
f1(x) = A*exp(x - B*f0(x))
f2(x) = A*exp(x - B*f1(x))
f3(x) = A*exp(x - B*f2(x))
...

Это может быть автоматически зациклено:

limit=10
f0(x) = x
do for [i=1:limit] {
j=i-1
eval "f".i."(x) = A*exp(x - B*f".j."(x))"
}

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

person Miguel    schedule 07.08.2014

Это рекурсивная функция. Вам нужно условие для остановки рекурсии, например, максимальное количество итераций:

maxiter = 10
f(x, n) = (n > maxiter ? 0 : A*exp(x - B*f(x, n+1)))

fit f(x, 0) "data.txt" via A,B

Конечно, вы должны проверить, какое значение должно быть возвращено, когда рекурсия остановлена ​​(здесь я использовал 0)

person Christoph    schedule 07.08.2014

Спасибо за ваши ответы

Обсуждая с другом эту проблему, я нашел обходной путь.

Во-первых, такие функции называются «трансцендентными функциями», это означает, что функция f(x) не разрешима явно, но переменная x может быть решена как функция f(x) и она будет иметь следующий вид

х = B*f(x) + log(f(x)/A)

Следовательно, можно определить новую функцию (не трансцендентную)

г (х) = В * х + журнал (х / А)

Отсюда вы можете подогнать функцию g(x) к графику x vs y. Используя gnuplot, можно выполнить подгонку как

подогнать g(x) "data.txt", используя ($2):($1) через A,B

Надеюсь, это поможет кому-то еще

person user3916321    schedule 07.08.2014