Matlab中拟合函数的系数错误

时间:2017-10-07 10:22:54

标签: matlab curve-fitting coefficients

我的桌子看起来像这样:

x                 Line Name                                 
        -40 -30 -20 -10 0   10  20  30  40  50
-1500   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
-1000   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
0       NaN NaN NaN NaN NaN NaN NaN NaN NaN 700
1000    NaN NaN NaN NaN NaN NaN NaN NaN NaN 673
2000    NaN NaN NaN NaN NaN NaN NaN NaN 689 646
3000    NaN NaN NaN NaN NaN NaN NaN 694 662 NaN
4000    NaN NaN NaN NaN NaN NaN 696 668 636 NaN
5000    NaN NaN NaN NaN NaN 695 669 642 611 NaN
6000    NaN NaN NaN NaN 693 669 644 617 587 NaN
7000    NaN NaN NaN 691 666 643 619 593 563 NaN
8000    NaN NaN 691 665 641 619 595 569 NaN NaN
9000    NaN 691 664 639 616 595 572 547 NaN NaN
10000   691 664 639 615 592 571 550 525 NaN NaN
11000   664 638 614 591 569 549 528 503 NaN NaN
12000   638 613 590 567 546 527 507 483 NaN NaN
13000   612 589 566 545 525 506 486 NaN NaN NaN
14000   587 564 543 522 503 485 466 NaN NaN NaN
15000   562 541 520 500 482 465 446 NaN NaN NaN
16000   539 518 498 479 462 446 428 NaN NaN NaN
17000   516 496 477 459 442 427 409 NaN NaN NaN
18000   494 475 457 439 423 409 NaN NaN NaN NaN
19000   473 455 437 420 405 392 NaN NaN NaN NaN
20000   452 435 418 402 388 375 NaN NaN NaN NaN

我可以绘制一个如下图:

enter image description here

从左到右,蓝线代表“线名”-40到50。

以下是您可以复制的确切代码:

%% Load data
Array6 =[NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
   NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
   NaN NaN NaN NaN NaN NaN NaN NaN NaN 700
   NaN NaN NaN NaN NaN NaN NaN NaN NaN 673
   NaN NaN NaN NaN NaN NaN NaN NaN 689 646
   NaN NaN NaN NaN NaN NaN NaN 694 662 NaN
   NaN NaN NaN NaN NaN NaN 696 668 636 NaN
   NaN NaN NaN NaN NaN 695 669 642 611 NaN
   NaN NaN NaN NaN 693 669 644 617 587 NaN
   NaN NaN NaN 691 666 643 619 593 563 NaN
   NaN NaN 691 665 641 619 595 569 NaN NaN
   NaN 691 664 639 616 595 572 547 NaN NaN
   691 664 639 615 592 571 550 525 NaN NaN
   664 638 614 591 569 549 528 503 NaN NaN
   638 613 590 567 546 527 507 483 NaN NaN
   612 589 566 545 525 506 486 NaN NaN NaN
   587 564 543 522 503 485 466 NaN NaN NaN
   562 541 520 500 482 465 446 NaN NaN NaN
   539 518 498 479 462 446 428 NaN NaN NaN
   516 496 477 459 442 427 409 NaN NaN NaN
   494 475 457 439 423 409 NaN NaN NaN NaN
   473 455 437 420 405 392 NaN NaN NaN NaN
   452 435 418 402 388 375 NaN NaN NaN NaN];

MakeMatrix = [-1500,-1000:1000:20000];
x = transpose([MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix]);        %transpose switches rows and columns=to match array dimentions

%% Plot
hold on
A=plot(x,Array6,'b*')     
grid on
grid minor

这是一个很大的问题,请相信我,我一直试图解决这个问题一个星期,并且还没有结束。我想将“线名”-50,-40和-20的数据分成矢量,如下所示:

x1 = transpose([-1500,-1000:1000:20000]);     y1  = Array6(:,1);  %LineName-40
x2 = transpose([-1500,-1000:1000:20000]);     y2  = Array6(:,2);  %LineName-30
x3 = transpose([-1500,-1000:1000:20000]);     y3  = Array6(:,4);  %LineName-10

问题在于我的NaNs无法正常工作,但这已经解决了,如下所示:

f = fittype('poly2');
DatumLine1Fit = fit(x1,y1,f, 'Exclude', isnan(y1));
DatumLine2Fit = fit(x2,y2,f, 'Exclude', isnan(y2));
DatumLine3Fit = fit(x3,y3,f, 'Exclude', isnan(y3));

现在我取出系数并将它们放在矩阵中:

DatumLine1Coeff = coeffvalues(DatumLine1Fit);
DatumLine2Coeff = coeffvalues(DatumLine2Fit);
DatumLine3Coeff = coeffvalues(DatumLine3Fit);

CoeffMatrix3x3 = transpose([DatumLine1Coeff;DatumLine2Coeff;DatumLine3Coeff]);

这将CoeffMatrix3x3值赋予:

3.64801864801874e-07    3.46403596403601e-07    3.13873626373624e-07
-0.0348622377622380    -0.0333289210789212     -0.0307339285714285
1003.38694638695        962.893356643357        890.746978021977

然而,这就是问题,这是库仑(10,9和7)的系数,它是矩阵的反面,而不是我的代码中所示的库仑(1,2和4)? / p>

库仑(1,2和4)的正确CoeffMatrix3x3应为:

4.5e-07        3.393e-07                 3.25e-07                
-0.02775      -0.02815                  -0.02881                           
 700.6         744.1                     805.8

这里有一些代码可以直观地验证是否获得了错误的系数(注意拟合线位于第20,40和50行......它们应该在-40,-30,-10行上):

DatumLineSet        = [-40 -30 -10];    % Left Original lines used for coefficient determination(Not need to be eavenly spaced)
AdditionalLineSet   = [-40: 10:-10];    % Left Additional lines to be plotted from the DatumLineSet
FitLine_XRange     = -5000:100:20000;   %X-Axis points created for the fit line to follow

 for i = 1:length(AdditionalLineSet),                                               %length= For vectors, the length is simply the number of elements

        % straight line coefficients 
        c02 = interp1(DatumLineSet,CoeffMatrix3x3(1,:),AdditionalLineSet(i));            %a from y=ax^2+bx+c
        c01 = interp1(DatumLineSet,CoeffMatrix3x3(2,:),AdditionalLineSet(i));            %b        
        c00 = interp1(DatumLineSet,CoeffMatrix3x3(3,:),AdditionalLineSet(i));            %c               

        % generate the line

       FitLine_YRange   = polyval([c02 c01 c00],FitLine_XRange);                     
       plot(FitLine_XRange,FitLine_YRange,'b');
    end

enter image description here

请帮忙。非常感谢!您可以使用matlab曲线拟合应用程序找到正确的系数,如我的评论中所述。

1 个答案:

答案 0 :(得分:1)

我相信您的代码没有问题。问题出在你最后的比较中。

如果我手动构建并填充数据的第一列:

format shortg
x1=[10000:1000:20000]';
y1=[691;664;638;612;587;562;539;516;494;473;452];

coeffvalues(fit(x1,y1,'poly2'))'

ans =
3.648e-07
-0.034862
   1003.4

这与您的代码提供的内容相同,表明您的“正确”字样。你最后要回答的是那个是错误的。

作为效率/可读性问题,您还应该更改以下行:

x = transpose([MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix]);        %transpose switches rows and columns=to match array dimentions

x = transpose(repmat(MakeMatrix,10,1));

甚至

x = repmat(MakeMatrix,10,1)';

%%编辑

在审核了下面的新评论后,我相信我发现了这个问题:

在顶部的情节之后,你发表声明:

  

从左到右,蓝线代表"线名" -40到50。

这是导致混淆的错误陈述。这可以通过将表格的第一列和最后一列与图表的左右曲线进行比较来验证:

在表格中," -40" column有11个整数值," 50"列有3个整数值 在图中,它是最右边的一组点,有11个值,最左边有3个。