【问题标题】:how to fit a curve in the form of A = (L^x)(D^y) in Matlab?如何在 Matlab 中以 A = (L^x)(D^y) 的形式拟合曲线?
【发布时间】:2016-06-03 16:28:30
【问题描述】:

我有一些响应数据作为向量 A,其中变量是 L 和 D。

我只想找到适合我在标题中提到的形式的数据的 L 和 D 的系数。

我想拟合曲线,而不是曲面。

我觉得应该相当简单,但是阅读一些旧答案也对我的情况没有帮助。

有没有一些简单的方法可以做到这一点?

如果你想查看数据,这里是:

A = [0 0.06 0.12 0.44 0.56 0.94 1 1 0 0.04 0.58 0.74 0.86 1 1]

L = [100 100 100 100 100 100 100 100 43.7 49.7 56 61.5 65 77 93.8]

D = [11.3 10.1 8.9 8.5 8.1 7.7 6.5 5.3 5 5 5 5 5 5 5]

非常感谢。

更多信息:

我把上面的方程写成logA = xlogL + ylogD,并尝试使用

X = [ones(size(logL)) logL logD];

b = regress(logA,X);

但是Matlab没有返回任何系数,它只是给出了b = NaN NaN NaN

【问题讨论】:

  • 你有A=0log(0)=-inf 有点问题...
  • 是的,我可以使用接近零的非常小的数字代替 0,或者完全忽略该特定数据点。在 cftool 中,matlab 只是忽略了该 log(0)。
  • 您可能想用realmin 替换所有零:realmin 是您的机器能够生成的最小的正双精度浮点数 (2.2251e-308)。在A 中,只需执行A(A==0)=realmin 之类的操作,然后检查问题是否仍然存在。
  • 您即将拟合定义为A=f(x,y) 的函数,它是一个曲面。如果要拟合曲线,则需要定义一些将x 绑定到y 的函数以获得(x,y,z)=f(t) 形式。

标签: matlab regression curve-fitting


【解决方案1】:

来自 mathworks 论坛的 Jos 给了我正确的答案。这里是:

nlm = fitnlm([L(:) D(:)], A, 'y~(x1^b1)*(x2^b2)', [0 0])

如果您没有 fitnlm,NonLinearModel.fit 也可以。其实我用的是后者。

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    相关资源
    最近更新 更多