嵌套函数的 Gnuplot 拟合

use*_*321 5 gnuplot model-fitting

f(x)gnuplot 中适合具有下一种形式的函数的正确方法是什么?

f(x) = A*exp(x - B*f(x))
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下方法将其与任何其他函数一样适合:

fit f(x) "data.txt" via A,B 
Run Code Online (Sandbox Code Playgroud)

输出只是一句话:“ stack overflow

我什至不知道如何寻找这个主题,因此任何帮助将不胜感激。

这种函数是如何调用的呢?嵌套?递归?隐式的?

谢谢

Mig*_*uel 5

这不仅无法拟合,也无法绘图。您必须写下 f(x) 的显式形式,否则 gnuplot 将循环它,直到达到递归限制。一种方法是使用不同的名称:

f(x) = sin(x) # for example
g(x) = A*exp(x - B*f(x))
Run Code Online (Sandbox Code Playgroud)

现在使用 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))
...
Run Code Online (Sandbox Code Playgroud)

这可以自动循环:

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

使用上面的表达式可以设置limit变量的递归限制。无论如何,它应保持有限数量。


Chr*_*oph 5

这是一个递归函数。您需要一个停止递归的条件,例如最大迭代次数:

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
Run Code Online (Sandbox Code Playgroud)

当然你必须检查,当递归停止时应该返回哪个值(这里我使用了0