嵌套函数的Gnuplot拟合
gnuplot中适合函数嵌套函数的Gnuplot拟合,gnuplot,model-fitting,Gnuplot,Model Fitting,gnuplot中适合函数f(x)具有下一个表单的正确方法是什么 f(x) = A*exp(x - B*f(x)) 我尝试将其作为任何其他函数使用: fit f(x) "data.txt" via A,B 输出只是一句话:“堆栈溢出” 我甚至不知道如何寻找这个话题,所以任何帮助都将不胜感激 这种函数是如何调用的?嵌套的?递归的?含蓄的 感谢这不仅在拟合方面失败,而且在绘图方面也失败了。您必须写下f(x)的显式形式,否则gnuplot将循环它,直到它达到递归极限。一种方法是使用不同的名称: f
f(x)
具有下一个表单的正确方法是什么
f(x) = A*exp(x - B*f(x))
我尝试将其作为任何其他函数使用:
fit f(x) "data.txt" via A,B
输出只是一句话:“堆栈溢出”
我甚至不知道如何寻找这个话题,所以任何帮助都将不胜感激
这种函数是如何调用的?嵌套的?递归的?含蓄的
感谢这不仅在拟合方面失败,而且在绘图方面也失败了。您必须写下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)+对数(f(x)/A)
因此,有可能定义一个新的函数(不是超越的)
g(x)=B*x+对数(x/A)
从这里可以将函数g(x)拟合到绘图x vs y。使用gnuplot,可以按如下方式进行装配
使用($2):($1)通过A、B拟合g(x)“data.txt”
希望这对其他人有所帮助您是想用以前定义的同名函数重新定义
f(x)
,还是想定义递归函数?