下面是数据,要求拟合一个二元函数,自变量为a,b。请问在非线性拟合之前怎么设计函数,使其拟合误差最小。很急,请大家帮帮忙。 a\b 6.18 7.5 8.7 10.8 12.9 0.35 0.607 0.5303 0.5481 0.5158 0.581 0.4 0.742 0.5658 0.551 0.6376 0.8415 0.45 0.7534 0.6285 0.7258 0.6968 0.8522 0.5 0.8283 0.7279 0.9758 0.7751 0.836 0.55 0.8671 0.7375 1.0435 0.8035 0.8611 0.6 0.9155 0.884 1.1838 0.8288 1.0792 0.65 0.9325 0.9483 1.2278 1.0317 1.2311 0.7 1.0201 1.0156 1.3606 1.1687 1.6888 0.75 1.0231 1.1606 1.5829 1.2226 1.484问题补充: 我要拟合的是二元函数,也就是说两个变量的,其中x是a,y是b。那么最后得出的就是z=f(x,y)的形式的二元函数,但要拟合之前要先构造一个函数,然后才能通过拟合得到公式的相关参数,从而得到一个比较好的公式。 就是在构造这个参数的时候总构造不好,拟合出来的误差比较大。请教高手这个初始构造的非线性函数怎么构造???数据就是上面的那些数据。急。。。请多帮忙。谢谢 |
36 条回复
可以试试cftool,傻瓜式 |
这个问题的数据点偏少,误差偏大,拟合结果不一定很好。 可能的结果为: fx=@(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)); SSy = 3.488 b =[345.4504841 -191.5307433 41.80404051 -2.679313007 83.31564529 -4.454546205 -156.1311536 0.23330872 -0.008658214975 0.2518037298 81.56546021 -0.004804695651 989421997.1 -146.6074252 4.002995193 95.35213571 -0.2558911619 2.75208959] RSS = 0.0742998938581 MSe = 0.0028577 R^2 = 0.9787 |
三楼的大侠能不能再具体点啊,能把代码给下吗?实在感谢啊~ |
xyshu 发表于 2013-7-24 11:12 clear,clc x1=[.35:.05:.75]'; x2=[6.18 7.5 8.7 10.8 12.9]; y=[0.607 0.5303 0.5481 0.5158 0.581 0.742 0.5658 0.551 0.6376 0.8415 0.7534 0.6285 0.7258 0.6968 0.8522 0.8283 0.7279 0.9758 0.7751 0.836 0.8671 0.7375 1.0435 0.8035 0.8611 0.9155 0.884 1.1838 0.8288 1.0792 0.9325 0.9483 1.2278 1.0317 1.2311 1.0201 1.0156 1.3606 1.1687 1.6888 1.0231 1.1606 1.5829 1.2226 1.484]; n1=length(x1);n2=length(x2); x1=x1*ones(1,n2);x1=x1(:); x2=ones(n1,1)*x2;x2=x2(:); y=y(:); X=[x1,x2]; n=length(y); str=num2str([1:n]'); 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)); 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))); 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]; for l=1:5 b=lsqcurvefit(fx2,b,X,y); b=nlinfit(X,y,fx2,b); end b figure(1),clf plot3(x1,x2,y,'o') stem3(x1,x2,y,'filled') text(x1,x2,y+.01,str) hold on [x11,x22]=meshgrid(min(x1):range(x1)/80:max(x1),min(x2):range(x2)/80:max(x2)); yhat=fx1(b,x11,x22); surf(x11,x22,yhat) shading interp alpha(.8) axis tight xlabel('X1');ylabel('X2'),zlabel('Y') SSy=var(y)*(n-1) y1=fx1(b,x1,x2); RSS=(y-y1)'*(y-y1) rsquare=(SSy-RSS)/SSy MSe=RSS/(n-length(b)) |
stats01 发表于 2016-4-13 17:16 大侠:),你好,那个for循环是什么意思呀,本人新手,没看懂 |
当给的初值离开最优值比较远时,用循环的方式能逐渐逼近。 |
本帖最后由 m-t-liyanlong 于 2017-3-2 20:36 编辑 请问大神,6楼的命令流能拟合出“z=f(x,y)“形式的公式吗,我的数据没有预设的模型。 |
stats01 发表于 2016-4-20 12:42 您好,我的是6行5列的数据,而且没有数学模型,请问6楼的命令流通用吗,如果不通用,请问应该怎么稍作调整呢 |
m-t-liyanlong 发表于 2017-3-2 20:38 不同的数据应使用不同的模型(函数),这一般应视数据而定。 |
m-t-liyanlong 发表于 2017-3-2 19:48 对于如此格式的数据可以,但一般需改变拟合方程和提供合适的初值。对于上述程序,尚缺少对估计参数进行测验的内容,一般而言,某个模型是否合适还需进行统计测验,若不显著应将相应的效应项剔除,这一过程通常需逐步进行。 |
stats01 发表于 2017-3-3 08:15 y\x 3 5 7 9 11 0 1.0000 1.0000 1.0000 1.0000 1.0000 4 0.9390 0.9935 1.0114 1.0088 1.0020 8 0.7032 0.8629 0.9736 1.0212 1.0226 12 0.5423 0.6256 0.7935 0.9335 1.0160 16 0.4628 0.4985 0.5386 0.6601 0.8472 20 0.4248 0.4481 0.4794 0.5138 0.5494 y\x 3 5 7 9 11 0 1.0000 1.0000 1.0000 1.0000 1.0000 4 0.9017 0.9428 0.9727 0.9919 1.0007 8 0.8825 0.9268 0.9476 0.9603 0.9759 12 0.8757 0.9269 0.9433 0.9397 0.9376 16 0.8363 0.8991 0.9295 0.9291 0.9058 20 0.7851 0.8408 0.8742 0.8805 0.8512 您好,能否帮我把上面的两组数据分别拟合出z=f(x,y)的公式吗?非常感谢楼主 |
本帖最后由 stats01 于 2017-3-13 19:06 编辑 m-t-liyanlong 发表于 2017-3-12 21:33 若采用相似的模型,可用下列两个比较接近的模型:(数据点太少了,不能作为推荐的结果) Q1 SSy = 1.4954 fx=@(b,x1,x2)(b(1)+b(2)*x1+b(3)*x2+b(4)*x2.^2+b(5)*x1.*x2.^2+b(6)*x1.^2.*x2+b(7)*x1.^3)./(1+exp(b(8)*x1+b(9)*x2+b(10)*x1.*x2))+b(11); b =[0.655061734 -0.01876909293 0.02153702845 -0.003783488719 0.00042335727 -0.0002104051506 8.170570491e-05 -0.7917752405 0.2530148485 0.02536692276 0.4470367892] RSS = 0.00296321592976 MSe = 0.00016462 R^2 = 0.99802 Q2 SSy =0.095994 fx=@(b,x1,x2)(b(1)+b(2)*x1+b(3)*x2+b(4)*x2.^2+b(5)*x1.*x2.^2+b(6)*x1.^2.*x2+b(7)*x1.^3)./(1+exp(b(8)*x1+b(9)*x2)); b =[1.889543797 0.1983862665 0.03112089684 0.002880832314 0.001576639623 0.002483199764 0.001407144323 0.1446571239 0.07810766774] RSS = 0.00237026705178 MSe = 0.00011851 R^2 = 0.97531如图。 |
stats01 发表于 2017-3-13 19:04 好棒啊,谢谢大神,这图很漂亮:handshake |
本帖最后由 fuzzylanguage 于 2017-3-24 11:51 编辑 stats01 发表于 2017-3-13 19:04 大神,您好,方便帮我拟合一组二元函数吗,对于您之前提出的代码初学不知道怎么修改预设的函数类型,跪谢 |
fuzzylanguage 发表于 2017-3-24 10:29 请提供数据。 |
本帖最后由 fuzzylanguage 于 2017-3-24 11:57 编辑 stats01 发表于 2017-3-24 11:48 y\x 150 151 152 153 154 155 156 157 158 159 160 161 162 5 263 269 268 274 275 276 366 275 276 274 274 276 278 6 289 293 293 296 301 304 307 311 313 314 312 314 309 7 325 328 328 332 332 332 330 323 326 319 316 321 312 8 350 353 354 355 355 356 352 346 346 338 335 343 329 9 361 365 369 374 379 379 383 384 394 399 404 407 414 10 386 385 386 384 384 387 389 393 394 400 405 407 415 11 381 380 383 392 401 402 414 417 418 423 423 424 422 12 381 380 427 419 414 413 410 406 411 415 421 421 428 13 451 451 452 453 457 459 464 470 473 479 484 486 488 14 458 459 459 456 449 451 454 456 461 471 484 486 495 15 497 499 494 513 520 523 528 530 531 529 525 526 525 16 502 502 497 493 495 497 498 508 515 526 535 537 545 17 541 542 546 551 558 563 570 576 580 582 582 584 580 |
fuzzylanguage 发表于 2017-3-24 11:51 是13行13列的数据,非常感谢 |
stats01 发表于 2017-3-24 11:48 大神,您好,方便帮我拟合一组二元函数吗,对于您之前提出的代码初学不知道怎么修改预设的函数类型,跪谢 ...或者怎么拟合一组三元函数,我现在想法是先确定二元函数,然后再把另外一个元考虑进去。 |
卡西拉拉 发表于 2017-4-12 17:06 若给出数据,我可以试试。 |
stats01 发表于 2017-4-12 17:17 https://www.ilovematlab.cn/thread-501109-1-1.html在这个帖子里面 |
卡西拉拉 发表于 2017-4-12 17:28 谢谢你:loveliness: |
stats01 发表于 2017-3-24 11:48 大神您好,如果您方便,劳烦您拟合一下这组二元函数 x1=[0.005:0.005:0.02]; x2=[10:10:100]; y=[2.8839 2.8502 2.8195 2.7937 2.7583 2.7092 2.6815 2.6499 2.6199 2.5755 2.8734 2.8177 2.7434 2.6691 2.5804 2.4782 2.3865 2.2914 2.1932 2.1018 2.8572 2.7574 2.6379 2.4964 2.3390 2.1851 2.0575 1.9361 1.8099 1.6693 2.8395 2.6920 2.5097 2.2993 2.1059 1.9089 1.7377 1.6083 1.4605 1.4085]; 非常感谢 |
TI2O3 发表于 2018-5-5 17:28 为使图形显示美观,按y=y-1的数据拟合: SSy = 7.2095 fx=@(b,x1,x2)(b(1)+b(2)*x1+b(3)*x2)./(1+b(4)*x1+b(5)*x2+b(6)*x1.*x2); b =[1.855737843 -38.9479915 -0.00836117923 -24.61118639 -0.005252834718 0.3546543787] RSS = 0.0173283580537 MSe = 0.0005251 R^2 = 0.9976 |
Powered by Discuz! X3.4
© 2001-2021