【问题标题】:How to find coefficients for a possible exponential approximation如何找到可能的指数近似的系数
【发布时间】:2015-07-26 03:26:06
【问题描述】:

我有这样的数据:

y = [0.001
     0.0042222222
     0.0074444444
     0.0106666667
     0.0138888889
     0.0171111111
     0.0203333333
     0.0235555556
     0.0267777778
     0.03]

x = [3.52E-06
     9.72E-05
     0.0002822918
     0.0004929136
     0.0006759156
     0.0008199029
     0.0009092797
     0.0009458332
     0.0009749509
     0.0009892005]

我希望 yx 的函数,其中 y = a(0.01 − b*n^−cx)。

找到适合数据的系数abc 的最佳组合的最佳和最简单的计算方法是什么?

我可以使用八度吗?

【问题讨论】:

  • (1) n 是常量吗?您可以进行 OLS 曲线拟合。
  • 是的! n 是一个常数。实际上,忽略 b。如何找到 a 和 c?
  • 普通最小二乘。在您的情况下,您必须首先获取日志以使您的函数线性化(即在系数中线性化)。然后就可以使用这个函数了:octave.sourceforge.net/octave/function/ols.html
  • 用matlab怎么做呢?
  • 那个0.01 术语会很讨厌......也许你只需要不记录日志

标签: matlab octave curve-fitting data-fitting


【解决方案1】:

你的功能

y = a(0.01 - b*n-cx)

是一种非常特殊的形式,有 4 个未知数。为了从您的观察列表中估计您的参数,我建议您简化它

y = β1 + β2β3x

这成为我们的目标函数,我们可以使用普通最小二乘法来求解一组好的 beta。

在默认的 Matlab 中,您可以使用 fminsearch 找到这些 β 参数(我们称之为参数向量,β),然后您可以使用简单代数回到你的abcn(假设你知道bn前面)。在 Octave 中,我相信你可以找到一个等效的函数,我会从这里开始:http://octave.sourceforge.net/optim/index.html

我们将调用fminsearch,但我们需要以某种方式传递您的观察结果(即xy),我们将使用匿名函数来执行此操作,例如文档中的示例2:

beta = fminsearch(@(x,y) objfun(x,y,beta), beta0) %// beta0 are your initial guesses for beta, e.g. [0,0,0] or [1,1,1]. You need to pick these to be somewhat close to the correct values.

我们这样定义我们的目标函数:

function sse = objfun(x, y, beta)
    f = beta(1) + beta(2).^(beta(3).*x);
    err = sum((y-f).^2); %// this is the sum of square errors, often called SSE and it is what we are trying to minimise!
end

所以把它们放在一起:

y= [0.001; 0.0042222222; 0.0074444444; 0.0106666667; 0.0138888889; 0.0171111111; 0.0203333333; 0.0235555556; 0.0267777778; 0.03];
x= [3.52E-06; 9.72E-05; 0.0002822918; 0.0004929136; 0.0006759156; 0.0008199029; 0.0009092797; 0.0009458332; 0.0009749509; 0.0009892005];
beta0 = [0,0,0];

beta = fminsearch(@(x,y) objfun(x,y,beta), beta0)

现在你的工作是解决abcbeta(1)beta(2)beta(2)beta(3),您可以在纸上完成。

【讨论】:

  • 我发现一个可能的近似值是 y= 0.001 -ae^-bx。我可以应用相同的方法吗?
  • 当然只改一行:f = 0.001 - beta(1).*exp(-beta(2).*x)); 就个人而言,除非你的ab 是一个有意义的物理SCALAR 量,否则我宁愿使用f = 0.001 + beta(1).*exp(beta(2).*x)); 并且只有负的beta s
  • 感谢您的回答。我无法计算你的代码。但我发现我可以使用 cftool。
  • cftool 将有一个代码生成选项,它将为您创建 matlab 脚本代码,然后您可以与我的比较。此外,cftool 不在默认的 Matlab 中,而是在曲线拟合工具箱中。知道您有权访问此工具箱来回答此问题会很有帮助...
  • 感谢您的帮助@Dan!这些信息真的很有帮助! ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
相关资源
最近更新 更多