Gnuplot适合嵌套函数

时间:2014-08-06 23:41:29

标签: gnuplot model-fitting

gnuplot适合具有下一个表单的函数f(x)的正确方法是什么?

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

我尝试使用以下任何其他功能:

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

输出只是一句话:" stack overflow"

我甚至不知道如何寻找这个主题,所以任何帮助都会非常感激。

这种功能是如何调用的?拼图?递归?隐式?

由于

3 个答案:

答案 0 :(得分:4)

这样做只会失败,也适合绘图。您必须记下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变量设置递归限制。在任何情况下,它应保持有限数字。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

感谢您的回复

与朋友讨论这个问题,我找到了解决办法。

首先,这种函数称为“超越函数”,这意味着函数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可以进行拟合

通过A,B

使用($ 2):( $ 1)拟合g(x)“data.txt”

希望这会有助于其他人