查看: 1351|回复: 34|关注: 0

[已解决] 二元函数拟合怎样效果最好?

[复制链接]

新手

12 麦片

财富积分


050


2

主题

22

帖子

0

最佳答案
本帖最后由 jack350556319 于 2020-9-30 02:58 编辑
  1. clear,clc
  2. x1=[1.2:.1:1.7]';
  3. x2=[1000        5000        7500       10000        15000];
  4. y=[14964       13166        14235      15550        19200
  5.    13479       13479        13090      14235        17014
  6.    13747       13747        12750      13139        14991
  7.    13917       13917        13019      12553        13967
  8.    14065       14065        13386      12821        13188
  9.    14306       14306        13578      13040        12728];
  10. n1=length(x1);n2=length(x2);
  11. x1=x1*ones(1,n2);x1=x1(:);
  12. x2=ones(n1,1)*x2;x2=x2(:);
  13. y=y(:); X=[x1,x2]; n=length(y);
  14. str=num2str([1:n]');
  15. fx1=@(b,x1,x2)(b(1)+b(2)*x2+b(3)*x2.^2+b(4)*x1.*x2+b(5)*x1.^3+b(6)*x2.^3+b(7)*x1.^4+b(8)*x2.^4+b(9)*x1.*x2.^3+b(10)*x1.^2.*x2.^2+b(11)*x1.^5+b(12)*x2.^5)./(1+b(13)*exp(b(14)*x1+b(15)*x2+b(16)*x1.^2+b(17)*x2.^2+b(18)*x1.*x2));
  16. fx2=@(b,X)(b(1)+b(2)*X(:,2)+b(3)*X(:,2).^2+b(4)*X(:,1).*X(:,2)+b(5)*X(:,1).^3+b(6)*X(:,2).^3+b(7)*X(:,1).^4+b(8)*X(:,2).^4+b(9)*X(:,1).*X(:,2).^3+b(10)*X(:,1).^2.*X(:,2).^2+b(11)*X(:,1).^5+b(12)*X(:,2).^5)./(1+b(13)*exp(b(14)*X(:,1)+b(15)*X(:,2)+b(16)*X(:,1).^2+b(17)*X(:,2).^2+b(18)*X(:,1).*X(:,2)));
  17. b=[345.45 -191.53 41.80 -2.6793  83.3156  -4.4545  -156.1311 0.2333  -0.0086582 0.251804  81.565  -0.0048047  989422  -146.607  4.003 95.35213571  -0.25589 2.752];
  18. for l=1:5
  19.     b=lsqcurvefit(fx2,b,X,y);
  20.     b=nlinfit(X,y,fx2,b);
  21. end
  22. b
  23. figure(1),clf
  24. plot3(x1,x2,y,'o')
  25. stem3(x1,x2,y,'filled')
  26. text(x1,x2,y+.01,str)
  27. hold on
  28. [x11,x22]=meshgrid(min(x1):range(x1)/80:max(x1),min(x2):range(x2)/80:max(x2));
  29. yhat=fx1(b,x11,x22);
  30. surf(x11,x22,yhat)
  31. shading interp
  32. alpha(.8)
  33. axis tight
  34. xlabel('α');ylabel('C'),zlabel('V1')
  35. SSy=var(y)*(n-1)
  36. y1=fx1(b,x1,x2);
  37. RSS=(y-y1)'*(y-y1)
  38. rsquare=(SSy-RSS)/SSy
  39. MSe=RSS/(n-length(b))
复制代码
想通过matlab拟合得到二元函数y=f(x1,x2)的表达式,但是这里面18组初始的b值是参考别人的模板,因为是用另外的数据生成的,请问怎么用程序实现我这组数据里面的18组初始b值呢?比如用nlinfit,或者cftool,请大佬多多指教!:handshake 之前用cftool拟合后得到的poly23多项式函数的函数值域与已知数据相差几个数量级,函数表达式明显是错误的。
回复主题 已获打赏: 0 积分

举报

MATLAB 数学、统计与优化
版块优秀回答者

入门

123 麦片

财富积分


50500


0

主题

243

帖子

22

最佳答案
  • 关注者: 6
发表于 2020-9-30 07:20:01 | 显示全部楼层
数据不同,不能用此前的模型和初值。另,只有少量的数据是不能用很复杂(包含很多效应项)的模型的。
回复此楼 已获打赏: 0 积分

举报

MATLAB 数学、统计与优化
版块优秀回答者

入门

123 麦片

财富积分


50500


0

主题

243

帖子

22

最佳答案
  • 关注者: 6
发表于 2020-9-30 08:06:51 | 显示全部楼层 |此回复为最佳答案
若是上述数据,用如下模型即可。
SSz =   5.3453e+07
fx=@(b,x,y)(b(1)+b(2)*x+b(3)*y+b(4)*x.^2+b(5)*y.^2+b(6)*x.*y)./(1+b(7)*x+b(8)*y+b(9)*x.*y);
b =[11812.79219  -8441.276  -1.039884851  -1267.514767  -2.907197783e-06  0.8464220235  -0.8398465696  -6.940586558e-05  5.491374693e-05]
RSS = 1966250.47917
MSe =   98313
R^2 =   0.96322
回复此楼 已获打赏: 2 积分

举报

新手

12 麦片

财富积分


050


2

主题

22

帖子

0

最佳答案
 楼主| 发表于 2020-9-30 21:21:56 | 显示全部楼层
顾世梁 发表于 2020-9-30 07:20
数据不同,不能用此前的模型和初值。另,只有少量的数据是不能用很复杂(包含很多效应项)的模型的。 ...

嗯嗯,所以我这个模型里面的函数需要进行调整,我看您这次只用9组初始的b值了。
回复此楼 已获打赏: 0 积分

举报

新手

12 麦片

财富积分


050


2

主题

22

帖子

0

最佳答案
 楼主| 发表于 2020-10-1 06:09:14 | 显示全部楼层
本帖最后由 jack350556319 于 2020-10-1 06:34 编辑

还有以下的几组数据麻烦大神帮忙处理,感激不尽!:handshakeM1
  1. clear,clc
  2. x1=[.2:.1:.7]';
  3. x2=[2500            5000                7500              10000               15000];
  4. y=[597030.74821     481940.60103        457566.41381      490004.24191        603628.27257
  5.    623054.31652     496418.50171        449502.77292      450235.83118        525740.8322
  6.    642480.36047     508697.2276         449502.77292      437224.04703        478641.83885
  7.    658790.9068      528856.32981        463247.61534      433925.28485        446204.01074
  8.    674185.13031     549931.75485        482673.65929      445287.68791        428427.34788
  9.    691961.79317     574305.94207        502099.70324      458299.47207        428427.3479];
  10. n1=length(x1);n2=length(x2);
  11. x1=x1*ones(1,n2);x1=x1(:);
  12. x2=ones(n1,1)*x2;x2=x2(:);
  13. y=y(:); X=[x1,x2]; n=length(y);
  14. str=num2str([1:n]');
  15. fx1=@(b,x1,x2)(b(1)+b(2)*x1+b(3)*x2+b(4)*x1.^2+b(5)*x2.^2+b(6)*x1.*x2)./(1+b(7)*x1+b(8)*x2+b(9)*x1.*x2);
  16. fx2=@(b,X)(b(1)+b(2)*X(:,1)+b(3)*X(:,2)+b(4)*X(:,1).^2+b(5)*X(:,2).^2+b(6)*X(:,1).*X(:,2))./(1+b(7)*X(:,1)+b(8)*X(:,2)+b(9)*X(:,1).*X(:,2));
  17. b=[3600  -8441.276  -1.039884851  -167.514767  -3.907197783e-06  0.8464220235  -9.8398465696  -7.940586558e-05  5.491374693e-05];
  18. for l=1:5
  19.     b=lsqcurvefit(fx2,b,X,y);
  20.     b=nlinfit(X,y,fx2,b);
  21. end
  22. b
  23. figure(1),clf
  24. plot3(x1,x2,y,'o')
  25. stem3(x1,x2,y,'filled')
  26. text(x1,x2,y+.01,str)
  27. hold on
  28. [x11,x22]=meshgrid(min(x1):range(x1)/1000:max(x1),min(x2):range(x2)/1000:max(x2));
  29. yhat=fx1(b,x11,x22);
  30. surf(x11,x22,yhat)
  31. shading interp
  32. alpha(.8)
  33. axis tight
  34. xlabel('α');ylabel('C'),zlabel('M1')

  35. SSy=var(y)*(n-1)
  36. y1=fx1(b,x1,x2);
  37. RSS=(y-y1)'*(y-y1)
  38. rsquare=(SSy-RSS)/SSy
  39. MSe=RSS/(n-length(b))
复制代码
[/code]
回复此楼 已获打赏: 0 积分

举报

新手

12 麦片

财富积分


050


2

主题

22

帖子

0

最佳答案
 楼主| 发表于 2020-10-1 06:17:49 | 显示全部楼层
本帖最后由 jack350556319 于 2020-10-1 06:42 编辑

D组数据
  1. x1=[.2:.1:.7]';
  2. x2=[5000      7500         10000       15000        20000];
  3. y=[0.105      0.102        0.0958      0.0914       0.103
  4.    0.114      0.101        0.0989      0.0877       0.0849
  5.    0.13       0.106        0.0999      0.0927       0.08531
  6.    0.144      0.114        0.103       0.095        0.0897
  7.    0.159      0.125        0.111       0.0979       0.0916
  8.    0.179      0.136        0.121       0.103        0.0948];
复制代码
回复此楼 已获打赏: 0 积分

举报

新手

12 麦片

财富积分


050


2

主题

22

帖子

0

最佳答案
 楼主| 发表于 2020-10-1 06:28:07 | 显示全部楼层
本帖最后由 jack350556319 于 2020-10-1 06:43 编辑

M2组数据
  1. x1=[.2:.1:.7]';
  2. x2=[5000      7500         10000       15000        20000];
  3. y=[1023840    980010       965990      926830       1013380
  4.    1042300    1002920      983340      943070       926830
  5.    1066330    1026060      1001810     963770       924610
  6.    1089470    1051420      1023840     983340       953310
  7.    1101040    1073450      1050310     100760       982230
  8.    1109050    1094140      1073450     1038740      1013380];
复制代码
回复此楼 已获打赏: 0 积分

举报

新手

12 麦片

财富积分


050


2

主题

22

帖子

0

最佳答案
 楼主| 发表于 2020-10-1 06:32:18 | 显示全部楼层
F组数据
  1. x1=[.2:.1:.7]';
  2. x2=[5000        7500            10000         15000          20000];
  3. y=[8184.77      11502.34        14656.26      22020.36       37894.1
  4.    7708.707     11933.77        14864.53      21068.23       34249.24
  5.    7113.628     11070.9         13748.76      18762.3        29875.41
  6.    6697.072     10431.19        12945.4       16739.03       25337.93
  7.    6161.501     8288.909        10118.78      12350.32       17854.81
  8.    5834.208     7768.215        9464.19       11606.48       16575.39];
复制代码
回复此楼 已获打赏: 0 积分

举报

新手

12 麦片

财富积分


050


2

主题

22

帖子

0

最佳答案
 楼主| 发表于 2020-10-1 06:41:28 | 显示全部楼层
VV22组数据
  1. x1=[.2:.1:.7]';
  2. x2=[5000    7500       10000     15000      20000];
  3. y=[9913     9447       9155      10203      11660
  4.    10300    9874       9602      9476       10621
  5.    10689    10291      10011     9398       9805
  6.    10941    10632      10398     9854       9330
  7.    10923    10864      10718     10272      9854
  8.    10883    11030      10981     10669      10320];
复制代码
回复此楼 已获打赏: 0 积分

举报

新手

12 麦片

财富积分


050


2

主题

22

帖子

0

最佳答案
 楼主| 发表于 2020-10-1 18:41:46 | 显示全部楼层
以上这种数据由于x1,x2,y数量级相差比较大,是否需要先进行数据归一化之后再用cftool拟合函数?
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /5 下一条

快速回复 返回顶部 返回列表