【问题标题】:Nonlinear fitting function using matlab使用matlab的非线性拟合函数
【发布时间】:2014-03-28 05:59:04
【问题描述】:

我需要拟合您在图像中看到的曲线,该曲线来自大量蒙特卡洛模拟。我还上传了适合txt file 的数据。

我已经尝试用以下类型的函数来拟合曲线:

axexp(b(x^k))

k<1。 结果与实验点相似,但距离我需要的拟合函数还很远。

我曾想过将整个范围分成不同的方程式,但我还没有找到解决方案。 IE。第一部分为直线,第三部分为指数。但是高峰呢?

有什么想法吗?

【问题讨论】:

  • 你有Curve Fitting Toolbox吗?您还可以使用更复杂的方法,例如正弦和余弦之和。
  • 我使用 EzyFit 因为它是免费的
  • 对不起...要绘制的数据只是第一 (x) 列和第二 (y) 列。然后是方差、PRSD % 和 MC 运行次数,以获得所需的误差。此 txt 文件来自 Fortran90 脚本。

标签: matlab curve-fitting montecarlo least-squares


【解决方案1】:

我猜你的问题不仅仅是平滑你的曲线......如果是这样,没有什么比@divanov 指出的精心挑选的多项式更好的了。所以,我对此无话可说。

但是,据我了解,您的数据描述了一个经验分布(您告诉我们它来自蒙特卡罗模拟),如果您真的想找到一个描述您的数据的函数,您可以考虑估计一个众所周知的分布尾巴很重。

其中一些已经在 matlab 工具箱中煮熟。我建议您尝试例如Weibull distribution,但您最终可能会尝试其他类型。

【讨论】:

    【解决方案2】:

    8 次多项式拟合:

    close all; clear all;
    
    fid = fopen('output_red.txt','r');
    Z = textscan(fid, '%f %f %f %f %f');
    fclose(fid);
    
    X = log(Z{1});
    Y = log(Z{2});
    
    p = polyfit(X, Y, 8);
    Y2 = polyval(p, X);
    
    plot(exp(X), exp(Y));
    hold on
    plot(exp(X), exp(Y2), 'r')
    legend('Original data','Fitted curve')
    
    print('-dpng','fitted.png')
    

    p 包含多项式系数1.2737e-05 -9.1262e-04 2.7838e-02 -4.7160e-01 4.8482e+00 -3.0958e+01 1.1990e+02 -2.5649e+02 2.3480e+02。使用更高次数的多项式将导致更好的精度。

    【讨论】:

    • 非常感谢您的帮助!但是拟合函数方程呢?如何获得多项式的系数?
    • 您应该自己运行脚本来计算最小二乘误差并确定度数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多