[已答复] matlab二元函数拟合怎么设计函数。

[复制链接]
xueyingshuang 发表于 2011-10-12 18:26:50
下面是数据,要求拟合一个二元函数,自变量为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 条回复


lizardno1 发表于 2011-10-12 18:49:51
可以试试cftool,傻瓜式

stats01 发表于 2011-10-17 11:20:08
这个问题的数据点偏少,误差偏大,拟合结果不一定很好。
可能的结果为:
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
tu48.jpg

xyshu 发表于 2013-7-24 11:08:07
谢谢,学习了

xyshu 发表于 2013-7-24 11:12:07
三楼的大侠能不能再具体点啊,能把代码给下吗?实在感谢啊~

stats01 发表于 2016-4-13 17:16:47
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))

yuhailiang 发表于 2016-4-20 10:55:39
stats01 发表于 2016-4-13 17:16
clear,clc
x1=[.35:.05:.75]';
x2=[6.18        7.5        8.7        10.8        12.9];

大侠:),你好,那个for循环是什么意思呀,本人新手,没看懂

stats01 发表于 2016-4-20 12:42:12
当给的初值离开最优值比较远时,用循环的方式能逐渐逼近。

m-t-liyanlong 发表于 2017-3-2 19:48:54
本帖最后由 m-t-liyanlong 于 2017-3-2 20:36 编辑

请问大神,6楼的命令流能拟合出“z=f(x,y)“形式的公式吗,我的数据没有预设的模型。

m-t-liyanlong 发表于 2017-3-2 20:38:51
stats01 发表于 2016-4-20 12:42
当给的初值离开最优值比较远时,用循环的方式能逐渐逼近。

您好,我的是6行5列的数据,而且没有数学模型,请问6楼的命令流通用吗,如果不通用,请问应该怎么稍作调整呢

stats01 发表于 2017-3-2 22:46:33
m-t-liyanlong 发表于 2017-3-2 20:38
您好,我的是6行5列的数据,而且没有数学模型,请问6楼的命令流通用吗,如果不通用,请问应该怎么稍作调 ...

不同的数据应使用不同的模型(函数),这一般应视数据而定。

stats01 发表于 2017-3-3 08:15:56
m-t-liyanlong 发表于 2017-3-2 19:48
请问大神,6楼的命令流能拟合出“z=f(x,y)“形式的公式吗,我的数据没有预设的模型。 ...

对于如此格式的数据可以,但一般需改变拟合方程和提供合适的初值。对于上述程序,尚缺少对估计参数进行测验的内容,一般而言,某个模型是否合适还需进行统计测验,若不显著应将相应的效应项剔除,这一过程通常需逐步进行。

m-t-liyanlong 发表于 2017-3-12 21:33:45
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:04:52
本帖最后由 stats01 于 2017-3-13 19:06 编辑
m-t-liyanlong 发表于 2017-3-12 21:33
y\x        3                5               7                9                11
0      1.0000      1.0000      1.0000       1.0000   ...

若采用相似的模型,可用下列两个比较接近的模型:(数据点太少了,不能作为推荐的结果)
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如图。
nh13071.png
nh13072.png

m-t-liyanlong 发表于 2017-3-13 22:08:55
stats01 发表于 2017-3-13 19:04
若采用相似的模型,可用下列两个比较接近的模型:(数据点太少了,不能作为推荐的结果)
Q1
SSy = 1.4954

好棒啊,谢谢大神,这图很漂亮:handshake

fuzzylanguage 发表于 2017-3-24 10:29:11
本帖最后由 fuzzylanguage 于 2017-3-24 11:51 编辑
stats01 发表于 2017-3-13 19:04
若采用相似的模型,可用下列两个比较接近的模型:(数据点太少了,不能作为推荐的结果)
Q1
SSy = 1.4954

大神,您好,方便帮我拟合一组二元函数吗,对于您之前提出的代码初学不知道怎么修改预设的函数类型,跪谢

stats01 发表于 2017-3-24 11:48:48
fuzzylanguage 发表于 2017-3-24 10:29
大神,您好,方便帮我拟合一组二元函数吗,对于您之前提出的代码初学不知道怎么修改预设的函数类型,跪谢 ...

请提供数据。

fuzzylanguage 发表于 2017-3-24 11:51:24
本帖最后由 fuzzylanguage 于 2017-3-24 11:57 编辑

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:53:24
fuzzylanguage 发表于 2017-3-24 11:51
y\x          150        151         152       153      154        155      156       157       158 ...

是13行13列的数据,非常感谢

卡西拉拉 发表于 2017-4-12 17:06:47

大神,您好,方便帮我拟合一组二元函数吗,对于您之前提出的代码初学不知道怎么修改预设的函数类型,跪谢 ...或者怎么拟合一组三元函数,我现在想法是先确定二元函数,然后再把另外一个元考虑进去。

stats01 发表于 2017-4-12 17:17:02
卡西拉拉 发表于 2017-4-12 17:06
大神,您好,方便帮我拟合一组二元函数吗,对于您之前提出的代码初学不知道怎么修改预设的函数类型,跪谢  ...

若给出数据,我可以试试。

卡西拉拉 发表于 2017-4-12 17:28:42
stats01 发表于 2017-4-12 17:17
若给出数据,我可以试试。

https://www.ilovematlab.cn/thread-501109-1-1.html在这个帖子里面

卡西拉拉 发表于 2017-4-12 17:29:08
卡西拉拉 发表于 2017-4-12 17:28
https://www.ilovematlab.cn/thread-501109-1-1.html在这个帖子里面

谢谢你:loveliness:

TI2O3 发表于 2018-5-5 17:28:06

大神您好,如果您方便,劳烦您拟合一下这组二元函数
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];
非常感谢

stats01 发表于 2018-5-6 19:24:35
TI2O3 发表于 2018-5-5 17:28
大神您好,如果您方便,劳烦您拟合一下这组二元函数
x1=[0.005:0.005:0.02];
x2=[10:10:100];

为使图形显示美观,按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
nh1471.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

热门教程
站长推荐
快速回复 返回顶部 返回列表