嵌套函数的 Gnuplot 拟合

Posted

技术标签:

【中文标题】嵌套函数的 Gnuplot 拟合【英文标题】:Gnuplot fit of a nested function 【发布时间】:2014-09-30 01:50:53 【问题描述】:

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

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

我尝试将它作为任何其他函数使用:

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

输出只是一句话:“stack overflow

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

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

谢谢

【问题讨论】:

您是要根据先前定义的同名函数重新定义f(x),还是要定义递归函数? 【参考方案1】:

这不仅无法拟合,也无法绘制。你必须写下 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 变量设置递归限制。在任何情况下,它都应该是一个有限的数字。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案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"

希望这对其他人有帮助

【讨论】:

以上是关于嵌套函数的 Gnuplot 拟合的主要内容,如果未能解决你的问题,请参考以下文章

使用 Gnuplot 进行时间序列的线性回归

C语言中函数为啥可以嵌套定义 ?

函数的嵌套

EXCEL函数内部的嵌套函数

怎么在EXCEL一个单元格里嵌套多个函数

嵌套函数的实现