當前位置:編程學習大全網 - 源碼破解 - matlab曲面擬合

matlab曲面擬合

註:百度知道的換行存在問題,改了很多次始終不行,請從參考資料的鏈接到我的空間去看。

% 1、擬合和很多因素有關,比如初值、擬合函數的選擇、算法設置等。% 2、從結果看,不算很理想,這可能是因為原始數據與擬合函數的形式不很匹配。

% 3、考慮到初值對擬合結果的影響,這裏嘗試隨機生成多組初值,比較擬合結果(根據誤差範數)。

% 多數情況下都收斂到相同的結果。您可以自己試壹試增加次數或修改隨機數的範圍。

% 4、需要特別說明:為保證根號下的值為正,需要對待擬合參數q的範圍進行限制。

% 5、目前得到的結果是:m = 0.7257, n = -0.0332, p = 5.4417, q = -1.6。

x= [-2.9, -4.2, -7.2, -7.7, -2.8, -2.7, -1.6, -4.9, -4.4, -5.6, -7.2, -6.8, -6.9, -7, -6.3, -7.4, -6.4, -5.4, -5.5, -6.6, -11.3, -8.6, -11.1, -9.3, -8.9, -7, -4.6, -7.4, -8.8, -6.5, -5.1, -10.2, -8.6, -11.1, -11, -14.3, -11.5, -6.2, -7.3, -7.7, -5, -5.6, -9.6, -9.8, -9.2, -10.3, -12.1, -11.4, -13.7];y= [0.05477, 0.06325, 0.07746, 0.07071, 0.07071, 0.07071, 0.03162, 0.04472, 0.07071, 0.06325, 0.05477, 0.07746, 0.05477, 0.07071, 0.03162, 0.10488, 0.07071, 0.06325, 0.06325, 0.07071, 0.07071, 0.1, 0.08944, 0.04472, 0.05477, 0.06325, 0.06325, 0.05477, 0.04472, 0.04472, 0.06325, 0.07746, 0.08367, 0.1, 0.07071, 0.06325, 0.08367, 0.07071, 0.07071, 0.07071, 0.07071, 0.07071, 0.08944, 0.1, 0.07746, 0.07071, 0.07071, 0.06325, 0.06325];

z= [0.88, 1.17, 0.89, 0.91, 1.25, 0.84, 0.61, 1.23, 1, 1.11, 1, 0.83, 0.97, 1.6, 0.98, 1, 1.14, 1.52, 1.48, 1.54, 1.55, 1.51, 0.91, 1.02, 1.13, 1.56, 0.9, 1, 0.97, 0.98, 0.85, 1.11, 1.91, 2.75, 2.02, 1.72, 1.61, 2.62, 1.99, 1.8, 1.76, 1.73, 0.8, 1.74, 1.73, 1.97, 1.51, 1.72, 1.78];

% 擬合函數

f = inline('(c(1)+c(2)*x(1,:)).*exp(c(3)*x(2,:).*sqrt(1-c(4)./x(1,:)))','c','x');

% 優化設置:不顯示優化的過程及結果(直接利用返回的參數)

opt = optimset('TolFun',1e-15,'Display','none');

% 限制根號下為正:1-q/x>=0,即q/x<=1,又x<0,所以q>=x

qmin = max(x);

% 通過循環,隨機生成多組初值,比較各次擬合的結果,選擇其中效果最佳者resnorm = inf;

for i=1:50

% 隨機生成初值(註意對參數q的限制)

c0 = rand(1,4)*200-100;

c0(4) = max(qmin, c0(4));

% 最小二乘擬合(註意參數範圍)

[c, resn] = lsqcurvefit(f, c0, [x;y], z,[-inf -inf -inf qmin],[inf inf inf inf],opt);

% 保留最佳擬合結果 if resn < resnorm

resnorm = resn;

copt = c;

end

% 提示信息,包括循環次數、誤差範數、擬合參數的值 fprintf('\n%i\t%.3g\t%s', i, resn, mat2str(c));

end

% 提取並顯示最佳擬合結果c = copt;

fprintf('\n\nm = %g, n = %g, p = %g, q = %g\n', c);

% 把擬合結果與原始數據對照n=length(z);

plot(1:n, z, '-o', 1:n, f(c, [x;y]), 'r:x');

legend('原始數據', '擬合函數',0)

  • 上一篇:我想要尹恩惠最最詳細的資料,包括哪壹年演過哪部戲
  • 下一篇:誰知道《連城訣》中主演狄雲扮演者吳樾演過哪些電影?
  • copyright 2024編程學習大全網