如何在gnuplot中适当地拟合具有以下形式的函数f(x)
?
f(x) = A*exp(x - B*f(x))
我尝试像任何其他函数一样进行调整,使用:
fit f(x) "data.txt" via A,B
输出只是一句话,说:“stack overflow
”。
我甚至不知道如何寻找这个主题,所以任何帮助都将非常感激。
这种函数被称为什么?嵌套的?递归的?隐式的?
谢谢
如何在gnuplot中适当地拟合具有以下形式的函数f(x)
?
f(x) = A*exp(x - B*f(x))
我尝试像任何其他函数一样进行调整,使用:
fit f(x) "data.txt" via A,B
输出只是一句话,说:“stack overflow
”。
我甚至不知道如何寻找这个主题,所以任何帮助都将非常感激。
这种函数被称为什么?嵌套的?递归的?隐式的?
谢谢
这不仅适用于拟合,也适用于绘图。你需要写下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
变量设置递归限制。无论如何,它都应该保持为有限数字。这是一个递归函数。你需要设置一个停止递归的条件,比如迭代次数的最大值:
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
)。感谢您的回复。
和一个朋友讨论这个问题时,我找到了一种解决方法。
首先,这种类型的函数被称为“超越函数”,这意味着函数f(x)不能明确求解,但变量x可以作为f(x)的函数求解,并且它将具有下列形式
x = B*f(x) + log(f(x)/A)
因此,可以定义一个新函数(不是超越函数)
g(x) = B*x + log(x/A)
从这里,您可以将函数g(x)拟合到x与y的图中。使用gnuplot,可以执行以下配合:
fit g(x) "data.txt" using ($2):($1) via A,B
希望这能对其他人有所帮助。
f(x)
,还是想定义一个递归函数? - Tom Fenech