Matlab 无工具箱曲线拟合

Matlab 无工具箱曲线拟合,matlab,Matlab,如果没有曲线拟合工具箱,如何将函数拟合到MATLAB中的数据 特别是,如何拟合非多项式函数,例如,如果我想拟合y=x^(1/3)+5这样的非整数函数?在没有工具箱的情况下实现曲线拟合有两种方法,它们是 如果采样间隔均匀,然后希望使用移位核的某些线性组合(例如B样条曲线)进行曲线拟合,则以下工具将帮助您: 2.使用polyfit从头开始创建自己的配件工具箱。。。借助于此,您可以将函数拟合到MATLAB中的数据 波利菲特医生 例如 % 有关polyfit的更多信息,请参阅此如果您知道要安装的函数的

如果没有曲线拟合工具箱,如何将函数拟合到MATLAB中的数据


特别是,如何拟合非多项式函数,例如,如果我想拟合y=x^(1/3)+5这样的非整数函数?

在没有工具箱的情况下实现曲线拟合有两种方法,它们是

  • 如果采样间隔均匀,然后希望使用移位核的某些线性组合(例如B样条曲线)进行曲线拟合,则以下工具将帮助您:
  • 2.使用polyfit从头开始创建自己的配件工具箱。。。借助于此,您可以将函数拟合到MATLAB中的数据

    波利菲特医生

    例如

    %


    有关polyfit的更多信息,请参阅此

    如果您知道要安装的函数的形式,但不知道其参数,则可以使用
    fminsearch
    查找适合数据的参数。如果您有数据(可能有噪音),您希望适合
    y=x^a+b
    ,其中
    a
    b
    是未知的(这里我将假设真实值是
    a=1/3
    b=5
    ),这就是我得到快速答案的方式:

    在这里,我生成数据(在现实生活中,您不必这样做)

    然后,我定义了我想要最小化的函数,它与
    a
    b
    有关,并使用
    fminsearch
    将其最小化。在这种情况下,我最小化了数据和拟合函数之间差平方的积分。下面我定义了两个函数,一个是有噪声的数据,另一个是无噪声的。您可以看到,在没有噪声的情况下,您可以准确地恢复
    a
    b
    的值

    注意:
    fminsearch
    wotks与参数向量(
    v
    在我的例子中)。我选了
    a=v(1)
    b=v(2)
    。您还必须为
    v
    (此处
    [1]
    )提供一些初始猜测

    最后一条注释,如果您对
    a
    b
    的值有限制,则有时可以对变量进行一些更改。例如,如果您知道
    a>0
    ,则可能需要标识
    log(a)
    ,然后将标识的值转换为
    a

    希望这有帮助

    A.

    是一个用于优化和数据拟合的免费工具箱。采用与@Adrien
    y=x^a+b
    相同的样本函数,
    a
    b
    使用
    marquardt
    的最小二乘拟合确定

    解决该任务需要两个文件。sofit返回剩余的
    r
    以及雅可比
    j

    function [r, j] = sofit(x, fitData)
    t = fitData(:,1);
    y = fitData(:,2);
    r = y - (t.^x(1) + x(2));
    j = -[t.^x(1).*log(t), ones(length(t),1)];
    end
    
    以下运行程序脚本用于为示例函数生成数据点,并调用
    marquardt
    进行数据拟合

    %% function template
    f = @(t, p1, p2) t.^p1 + p2;
    
    %% sample function
    a = 1/3;
    b = 5;
    t= linspace(1,100)';
    y = f(t, a, b);
    
    %% packaging fit data for @sofit
    fitData(:,1) = t;
    fitData(:,2) = y;
    
    %% marquardt
    [xfit, info, perf] = marquardt(@sofit, [1, 1], [], fitData);
    
    %% presentation
    figure;
    plot(y);
    hold all
    plot(f(t, xfit(1,end), xfit(2,end)), 'ro');
    grid;
    legend('sample function', 'fitted function', 'Location','East')
    
    下图中生成的数据点(蓝色)与估计的数据点(红色)

    >> err_noisy  = @(v) trapz(x,(y_noisy - x.^v(1)-v(2)).^2);
    >> err = @(v) trapz(x,(y - x.^v(1)-v(2)).^2); 
    >> v_noisy = fminsearch(err_noisy,[1 1])
    
    v_noisy =
    
        0.3345    5.0594
    
    >> v = fminsearch(err,[1 1])
    
    v =
    
        0.3333    5.0000
    
    function [r, j] = sofit(x, fitData)
    t = fitData(:,1);
    y = fitData(:,2);
    r = y - (t.^x(1) + x(2));
    j = -[t.^x(1).*log(t), ones(length(t),1)];
    end
    
    %% function template
    f = @(t, p1, p2) t.^p1 + p2;
    
    %% sample function
    a = 1/3;
    b = 5;
    t= linspace(1,100)';
    y = f(t, a, b);
    
    %% packaging fit data for @sofit
    fitData(:,1) = t;
    fitData(:,2) = y;
    
    %% marquardt
    [xfit, info, perf] = marquardt(@sofit, [1, 1], [], fitData);
    
    %% presentation
    figure;
    plot(y);
    hold all
    plot(f(t, xfit(1,end), xfit(2,end)), 'ro');
    grid;
    legend('sample function', 'fitted function', 'Location','East')