回覆列表
  • 1 # 使用者834195712159

    程式碼示例:

    fit_nonlinear_data.m

    function [beta, r]=fit_nonlinear_data(X, Y, choose)

    % Input: X 自變數資料(N, D), Y 因變數(N, 1),choose 1-regress, 2-nlinfit 3-lsqcurvefit

    if choose==1

    X1=[ones(length(X(:, 1)), 1), X];

    [beta, bint, r, rint, states]=regress(Y, X1)

    % 多元線性迴歸

    % y=beta(1)+beta(2)*x1+beta(3)*x2+beta(4)*x3+...

    % beta—係數估計

    % bint—係數估計的上下置信界

    % r—殘差

    % rint—診斷異常值的區間

    % states—模型統計資訊

    rcoplot(r, rint)

    saveas(gcf,sprintf("線性曲線擬合_殘差圖.jpg"),"bmp");

    elseif choose==2

    beta0=ones(7, 1);

    % 初始值的選取可能會導致結果具有較大的誤差。

    [beta, r, J]=nlinfit(X, Y, @myfun, beta0)

    % 非線性迴歸

    % beta—係數估計

    % r—殘差

    % J—雅可比矩陣

    [Ypred,delta]=nlpredci(@myfun, X, beta, r, "Jacobian", J)

    % 非線性迴歸預測置信區間

    % Ypred—預測響應

    % delta—置信區間半形

    plot(X(:, 1), Y, "k.", X(:, 1), Ypred, "r");

    saveas(gcf,sprintf("非線性曲線擬合_1.jpg"),"bmp");

    elseif choose==3

    beta0=ones(7, 1);

    % 初始值的選取可能會導致結果具有較大的誤差。

    [beta,resnorm,r, ~, ~, ~, J]=lsqcurvefit(@myfun,beta0,X,Y)

    % 在最小二乘意義上解決非線性曲線擬合(資料擬合)問題

    % beta—係數估計

    % resnorm—殘差的平方範數 sum((fun(x,xdata)-ydata).^2)

    % r—殘差 r=fun(x,xdata)-ydata

    % J—雅可比矩陣

    [Ypred,delta]=nlpredci(@myfun, X, beta, r, "Jacobian", J)

    plot(X(:, 1), Y, "k.", X(:, 1), Ypred, "r");

    saveas(gcf,sprintf("非線性曲線擬合_2.jpg"),"bmp");

    end

    end

    function yy=myfun(beta,x) %自定義擬合函式

    yy=beta(1)+beta(2)*x(:, 1)+beta(3)*x(:, 2)+beta(4)*x(:, 3)+beta(5)*(x(:, 1).^2)+beta(6)*(x(:, 2).^2)+beta(7)*(x(:, 3).^2);

    end

    demo.m

    clear

    clc

    X=[1 13 1.5; 1.4 19 3; 1.8 25 1; 2.2 10 2.5;2.6 16 0.5; 3 22 2; 3.4 28 3.5; 3.5 30 3.7];

    Y=[0.330; 0.336; 0.294; 0.476; 0.209; 0.451; 0.482; 0.5];

    choose=1;

    fit_nonlinear_data(X, Y, choose)

  • 中秋節和大豐收的關聯?
  • 卡羅拉和威朗哪個家用好?