【问题标题】:Custom Curve Fitting in MatLabMatLab 中的自定义曲线拟合
【发布时间】:2014-10-03 16:10:38
【问题描述】:

我正在尝试在 MatLab 中定义自定义曲线拟合。我试图拟合的曲线如下:

A*exp(B*x)+C

需要这种拟合的原因是因为我的数据呈指数衰减,但该数据并未接近零(在此数据集中,曲线应该衰减并接近零以上的某个数字)。使用 fittype('exp2') 也不是一个选项,因为它会过度拟合数据(当它应该在 0 以上保持平坦时向上弯曲)。我使用以下代码定义拟合类型:

ft = fittype('(A*exp(B*x)) + C','coefficients', {'A', 'B', 'C'});

但是,当我尝试将数据拟合到此曲线时,我收到以下错误消息:

“使用 cfit/subsref 时出错>iDotReference(第 66 行) 名称既不是系数也不是问题参数。

cfit/subsref 中的错误(第 19 行) out = iDotReference(obj, currsubs);"

在这种情况下,我无法弄清楚 MatLab 到底在抱怨什么。有时,由于我不知道的原因,代码会运行,但适配性很差。我在这里做错了吗?这是衰减到 0 以上值的指数的最佳方法吗?

以下代码是我尝试跑步的方式:

[cf, gof] = fit(time', testArray', fittype);

【问题讨论】:

    标签: matlab curve-fitting


    【解决方案1】:

    提供初步猜测对拟合有很大帮助。我发现初始值的正确符号尤为重要。

    无论如何,如果我运行此代码,我不会遇到您遇到的问题:

    ft = fittype('(A*exp(B*x)) + C', 'coefficients', {'A', 'B', 'C'});
    
    time = 0:0.1:20;
    testArray = (4*exp(-.2*time) + 10) + normrnd(0,1,size(time));
    [cf, gof] = fit(time', testArray', ft, 'StartPoint', [17 -.6 100]);
    
    % check:
    figure(1)
    clf
    hold on
    plot(time,testArray,'k.')
    plot(time, cf.A*exp(cf.B*time) + cf.C, 'r');
    

    但我不知道这是否解决了您的问题,因为我无法重现您的错误。

    【讨论】:

    • 这确实有所帮助,但仍然很糟糕。奇怪的部分是,使用内置的 exp1 拟合,拟合非常好,所以我通过尝试合并一个常数来获得如此糟糕的拟合似乎很奇怪。尝试添加 C 术语时,是否有任何原因会如此迅速地变得如此糟糕?
    • 此外,我经常收到此错误:Inf 由模型函数计算,拟合无法继续。我还将发布我试图拟合的数据样本。 x: 0.6325 0.7438 0.5353 0.3303 0.1355 0.0582 0.0317 0.1173 0.0720 0.0718 0.0350 0.0803 0.0293 y:11.3333 27.1667 37.0000 46.7000 56.5000 66.1667 76.0000 90.8333 100.6667 110.3333 120.6667 130.6667 140.6667
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2023-03-26
    相关资源
    最近更新 更多